@hotmeshio/long-tail 0.4.22 → 0.4.23

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 (207) hide show
  1. package/build/api/dba.d.ts +2 -1
  2. package/build/api/dba.js +3 -2
  3. package/build/api/exports.d.ts +1 -0
  4. package/build/api/exports.js +1 -1
  5. package/build/api/maintenance.d.ts +1 -0
  6. package/build/api/maintenance.js +3 -3
  7. package/build/api/workflows/discovery.js +5 -2
  8. package/build/modules/maintenance.js +1 -0
  9. package/build/routes/controlplane.js +40 -29
  10. package/build/routes/dba.js +13 -2
  11. package/build/routes/exports.js +6 -0
  12. package/build/routes/maintenance.js +1 -0
  13. package/build/services/controlplane/index.js +7 -5
  14. package/build/services/dba.d.ts +3 -1
  15. package/build/services/dba.js +5 -4
  16. package/build/services/export/index.d.ts +2 -2
  17. package/build/services/export/index.js +16 -10
  18. package/build/services/maintenance/index.js +7 -4
  19. package/build/services/pipelines/queries.js +5 -2
  20. package/build/services/pipelines/sql.d.ts +0 -1
  21. package/build/services/pipelines/sql.js +1 -3
  22. package/build/system/mcp-servers/admin/controlplane.js +1 -1
  23. package/build/system/mcp-servers/admin/maintenance.js +1 -0
  24. package/build/system/mcp-servers/admin/pipelines.js +4 -4
  25. package/build/system/mcp-servers/admin/schemas.d.ts +31 -25
  26. package/build/system/mcp-servers/admin/schemas.js +9 -7
  27. package/build/types/maintenance.d.ts +2 -0
  28. package/dashboard/dist/assets/{AdminDashboard-BwUGcCxQ.js → AdminDashboard-CgJC8ZZF.js} +2 -2
  29. package/dashboard/dist/assets/{AdminDashboard-BwUGcCxQ.js.map → AdminDashboard-CgJC8ZZF.js.map} +1 -1
  30. package/dashboard/dist/assets/{AgentConfigPage-DgrYzLwq.js → AgentConfigPage-Bjl2Lsvo.js} +2 -2
  31. package/dashboard/dist/assets/{AgentConfigPage-DgrYzLwq.js.map → AgentConfigPage-Bjl2Lsvo.js.map} +1 -1
  32. package/dashboard/dist/assets/{AgentDetailPage-XJpl7wfJ.js → AgentDetailPage-D5dHrfaM.js} +2 -2
  33. package/dashboard/dist/assets/{AgentDetailPage-XJpl7wfJ.js.map → AgentDetailPage-D5dHrfaM.js.map} +1 -1
  34. package/dashboard/dist/assets/{AgentsPage-CGpVG6r8.js → AgentsPage-Mom3N1Av.js} +2 -2
  35. package/dashboard/dist/assets/{AgentsPage-CGpVG6r8.js.map → AgentsPage-Mom3N1Av.js.map} +1 -1
  36. package/dashboard/dist/assets/{AvailableEscalationsPage-DR1e0TQZ.js → AvailableEscalationsPage-B2ZAb41C.js} +2 -2
  37. package/dashboard/dist/assets/{AvailableEscalationsPage-DR1e0TQZ.js.map → AvailableEscalationsPage-B2ZAb41C.js.map} +1 -1
  38. package/dashboard/dist/assets/{BotPicker-BKtjl6IL.js → BotPicker-dCvnjynP.js} +2 -2
  39. package/dashboard/dist/assets/{BotPicker-BKtjl6IL.js.map → BotPicker-dCvnjynP.js.map} +1 -1
  40. package/dashboard/dist/assets/{CapabilitiesPage-kCB8fyOj.js → CapabilitiesPage-CK2fJ9Sy.js} +2 -2
  41. package/dashboard/dist/assets/{CapabilitiesPage-kCB8fyOj.js.map → CapabilitiesPage-CK2fJ9Sy.js.map} +1 -1
  42. package/dashboard/dist/assets/{CollapsibleSection-C3tU61hB.js → CollapsibleSection-bW0UZN9b.js} +2 -2
  43. package/dashboard/dist/assets/{CollapsibleSection-C3tU61hB.js.map → CollapsibleSection-bW0UZN9b.js.map} +1 -1
  44. package/dashboard/dist/assets/{CredentialsPage-Dt4nJs_B.js → CredentialsPage-DVOK3aaR.js} +2 -2
  45. package/dashboard/dist/assets/{CredentialsPage-Dt4nJs_B.js.map → CredentialsPage-DVOK3aaR.js.map} +1 -1
  46. package/dashboard/dist/assets/{CronLabel-BdE6mHyA.js → CronLabel-Cv5em7OP.js} +2 -2
  47. package/dashboard/dist/assets/{CronLabel-BdE6mHyA.js.map → CronLabel-Cv5em7OP.js.map} +1 -1
  48. package/dashboard/dist/assets/{CustomDurationPicker-B_Yxfb-u.js → CustomDurationPicker-Dy4NBqhZ.js} +2 -2
  49. package/dashboard/dist/assets/{CustomDurationPicker-B_Yxfb-u.js.map → CustomDurationPicker-Dy4NBqhZ.js.map} +1 -1
  50. package/dashboard/dist/assets/{ElapsedCell-tcGx5PFI.js → ElapsedCell-TQqWaVRq.js} +2 -2
  51. package/dashboard/dist/assets/{ElapsedCell-tcGx5PFI.js.map → ElapsedCell-TQqWaVRq.js.map} +1 -1
  52. package/dashboard/dist/assets/{EscalationsOverview-1KO5dXzk.js → EscalationsOverview-Cv5UvuHI.js} +2 -2
  53. package/dashboard/dist/assets/{EscalationsOverview-1KO5dXzk.js.map → EscalationsOverview-Cv5UvuHI.js.map} +1 -1
  54. package/dashboard/dist/assets/{EventTable-DnpsQ6Ew.js → EventTable-Doky6fCO.js} +2 -2
  55. package/dashboard/dist/assets/{EventTable-DnpsQ6Ew.js.map → EventTable-Doky6fCO.js.map} +1 -1
  56. package/dashboard/dist/assets/HomePage-CzvVyTq4.js +2 -0
  57. package/dashboard/dist/assets/HomePage-CzvVyTq4.js.map +1 -0
  58. package/dashboard/dist/assets/{ListToolbar-jrVba7QN.js → ListToolbar-Cfec9gz_.js} +2 -2
  59. package/dashboard/dist/assets/{ListToolbar-jrVba7QN.js.map → ListToolbar-Cfec9gz_.js.map} +1 -1
  60. package/dashboard/dist/assets/McpOverview-BN4GsBGI.js +2 -0
  61. package/dashboard/dist/assets/McpOverview-BN4GsBGI.js.map +1 -0
  62. package/dashboard/dist/assets/McpQueryDetailPage-lCW668WQ.js +5 -0
  63. package/dashboard/dist/assets/McpQueryDetailPage-lCW668WQ.js.map +1 -0
  64. package/dashboard/dist/assets/{McpQueryPage-WZfTY43_.js → McpQueryPage-BK5L2PqJ.js} +2 -2
  65. package/dashboard/dist/assets/{McpQueryPage-WZfTY43_.js.map → McpQueryPage-BK5L2PqJ.js.map} +1 -1
  66. package/dashboard/dist/assets/McpRunDetailPage-CQOeYqxa.js +2 -0
  67. package/dashboard/dist/assets/McpRunDetailPage-CQOeYqxa.js.map +1 -0
  68. package/dashboard/dist/assets/McpRunsPage-QsXid9Xe.js +2 -0
  69. package/dashboard/dist/assets/McpRunsPage-QsXid9Xe.js.map +1 -0
  70. package/dashboard/dist/assets/{OperatorDashboard-Cy7ySMXj.js → OperatorDashboard-CZQSINho.js} +2 -2
  71. package/dashboard/dist/assets/{OperatorDashboard-Cy7ySMXj.js.map → OperatorDashboard-CZQSINho.js.map} +1 -1
  72. package/dashboard/dist/assets/{ProcessDetailPage-DYIfvWyc.js → ProcessDetailPage-DUCOOvOK.js} +2 -2
  73. package/dashboard/dist/assets/{ProcessDetailPage-DYIfvWyc.js.map → ProcessDetailPage-DUCOOvOK.js.map} +1 -1
  74. package/dashboard/dist/assets/{ProcessesListPage-DR1RGaMl.js → ProcessesListPage-CXvSLTIM.js} +2 -2
  75. package/dashboard/dist/assets/{ProcessesListPage-DR1RGaMl.js.map → ProcessesListPage-CXvSLTIM.js.map} +1 -1
  76. package/dashboard/dist/assets/RolesPage-DlQR0Iz_.js +2 -0
  77. package/dashboard/dist/assets/RolesPage-DlQR0Iz_.js.map +1 -0
  78. package/dashboard/dist/assets/{RunAsSelector-B-ksMoEj.js → RunAsSelector-DP-jxsv6.js} +2 -2
  79. package/dashboard/dist/assets/{RunAsSelector-B-ksMoEj.js.map → RunAsSelector-DP-jxsv6.js.map} +1 -1
  80. package/dashboard/dist/assets/{SwimlaneTimeline-Cr_K5qpu.js → SwimlaneTimeline-BmASA0nN.js} +2 -2
  81. package/dashboard/dist/assets/{SwimlaneTimeline-Cr_K5qpu.js.map → SwimlaneTimeline-BmASA0nN.js.map} +1 -1
  82. package/dashboard/dist/assets/{TaskDetailPage-BO5p7AEe.js → TaskDetailPage-CRowpkeZ.js} +2 -2
  83. package/dashboard/dist/assets/{TaskDetailPage-BO5p7AEe.js.map → TaskDetailPage-CRowpkeZ.js.map} +1 -1
  84. package/dashboard/dist/assets/{TasksListPage-BRg-uFtF.js → TasksListPage-uJ6z37J-.js} +2 -2
  85. package/dashboard/dist/assets/{TasksListPage-BRg-uFtF.js.map → TasksListPage-uJ6z37J-.js.map} +1 -1
  86. package/dashboard/dist/assets/TimeAgo-BxwngK1D.js +2 -0
  87. package/dashboard/dist/assets/{TimeAgo-BSzN6rAH.js.map → TimeAgo-BxwngK1D.js.map} +1 -1
  88. package/dashboard/dist/assets/{TimestampCell-DL6zMNEQ.js → TimestampCell-CDmichOM.js} +2 -2
  89. package/dashboard/dist/assets/{TimestampCell-DL6zMNEQ.js.map → TimestampCell-CDmichOM.js.map} +1 -1
  90. package/dashboard/dist/assets/ToolTestPanel-xjTn8sU8.js +2 -0
  91. package/dashboard/dist/assets/ToolTestPanel-xjTn8sU8.js.map +1 -0
  92. package/dashboard/dist/assets/{TopicDetailPage-D7gCsPKB.js → TopicDetailPage-Dm0hDlS8.js} +2 -2
  93. package/dashboard/dist/assets/{TopicDetailPage-D7gCsPKB.js.map → TopicDetailPage-Dm0hDlS8.js.map} +1 -1
  94. package/dashboard/dist/assets/{TopicsPage-B3Aa8Haz.js → TopicsPage-letISGGD.js} +2 -2
  95. package/dashboard/dist/assets/{TopicsPage-B3Aa8Haz.js.map → TopicsPage-letISGGD.js.map} +1 -1
  96. package/dashboard/dist/assets/{UserName-BjHIJWgh.js → UserName-W6_Iz2Qb.js} +2 -2
  97. package/dashboard/dist/assets/{UserName-BjHIJWgh.js.map → UserName-W6_Iz2Qb.js.map} +1 -1
  98. package/dashboard/dist/assets/{WorkflowExecutionPage-BQ7AYlQA.js → WorkflowExecutionPage-Cfx-xlRT.js} +2 -2
  99. package/dashboard/dist/assets/{WorkflowExecutionPage-BQ7AYlQA.js.map → WorkflowExecutionPage-Cfx-xlRT.js.map} +1 -1
  100. package/dashboard/dist/assets/WorkflowsDashboard-DC4XHMWt.js +2 -0
  101. package/dashboard/dist/assets/WorkflowsDashboard-DC4XHMWt.js.map +1 -0
  102. package/dashboard/dist/assets/{WorkflowsOverview-B4DUcVxs.js → WorkflowsOverview-GefO_yn0.js} +2 -2
  103. package/dashboard/dist/assets/{WorkflowsOverview-B4DUcVxs.js.map → WorkflowsOverview-GefO_yn0.js.map} +1 -1
  104. package/dashboard/dist/assets/YamlWorkflowsPage-CMsrFooO.js +2 -0
  105. package/dashboard/dist/assets/YamlWorkflowsPage-CMsrFooO.js.map +1 -0
  106. package/dashboard/dist/assets/{agents-CkvQDr9b.js → agents-BI5OeN84.js} +2 -2
  107. package/dashboard/dist/assets/{agents-CkvQDr9b.js.map → agents-BI5OeN84.js.map} +1 -1
  108. package/dashboard/dist/assets/{bots-CzuMCVgU.js → bots-1UzUCsrR.js} +2 -2
  109. package/dashboard/dist/assets/{bots-CzuMCVgU.js.map → bots-1UzUCsrR.js.map} +1 -1
  110. package/dashboard/dist/assets/capabilities-BUbl-ojp.js +2 -0
  111. package/dashboard/dist/assets/{capabilities-CbGmS0ty.js.map → capabilities-BUbl-ojp.js.map} +1 -1
  112. package/dashboard/dist/assets/{controlplane-DGvwkuYx.js → controlplane-DTFrH_vN.js} +2 -2
  113. package/dashboard/dist/assets/{controlplane-DGvwkuYx.js.map → controlplane-DTFrH_vN.js.map} +1 -1
  114. package/dashboard/dist/assets/{escalation-B7ysVToF.js → escalation-BQhCt4W0.js} +2 -2
  115. package/dashboard/dist/assets/{escalation-B7ysVToF.js.map → escalation-BQhCt4W0.js.map} +1 -1
  116. package/dashboard/dist/assets/{escalation-columns-CHQEJU1j.js → escalation-columns-J20k5CcY.js} +2 -2
  117. package/dashboard/dist/assets/{escalation-columns-CHQEJU1j.js.map → escalation-columns-J20k5CcY.js.map} +1 -1
  118. package/dashboard/dist/assets/{helpers-BFOjXa4r.js → helpers-ge6Eu90Y.js} +2 -2
  119. package/dashboard/dist/assets/{helpers-BFOjXa4r.js.map → helpers-ge6Eu90Y.js.map} +1 -1
  120. package/dashboard/dist/assets/index-C-mbURj-.js +2 -0
  121. package/dashboard/dist/assets/index-C-mbURj-.js.map +1 -0
  122. package/dashboard/dist/assets/{index-BduDiGcw.js → index-C45DvtAZ.js} +2 -2
  123. package/dashboard/dist/assets/{index-BduDiGcw.js.map → index-C45DvtAZ.js.map} +1 -1
  124. package/dashboard/dist/assets/{index-B9_1AZaG.js → index-C9ClHiiW.js} +2 -2
  125. package/dashboard/dist/assets/{index-B9_1AZaG.js.map → index-C9ClHiiW.js.map} +1 -1
  126. package/dashboard/dist/assets/index-CLUYzdwz.js +2 -0
  127. package/dashboard/dist/assets/{index-DQHmfTPo.js.map → index-CLUYzdwz.js.map} +1 -1
  128. package/dashboard/dist/assets/{index-l_8R6U4r.js → index-CVGgSoda.js} +2 -2
  129. package/dashboard/dist/assets/{index-l_8R6U4r.js.map → index-CVGgSoda.js.map} +1 -1
  130. package/dashboard/dist/assets/{index-_BRA9uFL.js → index-CWEOhAiK.js} +3 -3
  131. package/dashboard/dist/assets/{index-_BRA9uFL.js.map → index-CWEOhAiK.js.map} +1 -1
  132. package/dashboard/dist/assets/{index-BFaDxPxA.js → index-CWlP6vHG.js} +2 -2
  133. package/dashboard/dist/assets/{index-BFaDxPxA.js.map → index-CWlP6vHG.js.map} +1 -1
  134. package/dashboard/dist/assets/index-DasoTRjT.js +2 -0
  135. package/dashboard/dist/assets/{index-BeLphL59.js.map → index-DasoTRjT.js.map} +1 -1
  136. package/dashboard/dist/assets/{index-CvOGgvzP.js → index-FhasoOjO.js} +2 -2
  137. package/dashboard/dist/assets/{index-CvOGgvzP.js.map → index-FhasoOjO.js.map} +1 -1
  138. package/dashboard/dist/assets/{index-a98qWLB-.js → index-WQQJ_cp7.js} +2 -2
  139. package/dashboard/dist/assets/{index-a98qWLB-.js.map → index-WQQJ_cp7.js.map} +1 -1
  140. package/dashboard/dist/assets/{index-CbrMW-gM.js → index-hAZiac0C.js} +2 -2
  141. package/dashboard/dist/assets/{index-CbrMW-gM.js.map → index-hAZiac0C.js.map} +1 -1
  142. package/dashboard/dist/assets/{index-v0OQpgXS.js → index-si70YcIP.js} +2 -2
  143. package/dashboard/dist/assets/{index-v0OQpgXS.js.map → index-si70YcIP.js.map} +1 -1
  144. package/dashboard/dist/assets/{index-CRiBkHPb.js → index-vgxjge70.js} +2 -2
  145. package/dashboard/dist/assets/{index-CRiBkHPb.js.map → index-vgxjge70.js.map} +1 -1
  146. package/dashboard/dist/assets/{knowledge-BlF8UMrk.js → knowledge-D9Tuh-o-.js} +2 -2
  147. package/dashboard/dist/assets/{knowledge-BlF8UMrk.js.map → knowledge-D9Tuh-o-.js.map} +1 -1
  148. package/dashboard/dist/assets/{mcp-MtXuky8q.js → mcp-BO8QnWyk.js} +2 -2
  149. package/dashboard/dist/assets/{mcp-MtXuky8q.js.map → mcp-BO8QnWyk.js.map} +1 -1
  150. package/dashboard/dist/assets/{mcp-query-DQ-J1Q0K.js → mcp-query-WLtQtr51.js} +2 -2
  151. package/dashboard/dist/assets/{mcp-query-DQ-J1Q0K.js.map → mcp-query-WLtQtr51.js.map} +1 -1
  152. package/dashboard/dist/assets/pipelines-BAVf9xud.js +2 -0
  153. package/dashboard/dist/assets/pipelines-BAVf9xud.js.map +1 -0
  154. package/dashboard/dist/assets/{roles-D-LhJ82d.js → roles-mGO2-2hA.js} +2 -2
  155. package/dashboard/dist/assets/{roles-D-LhJ82d.js.map → roles-mGO2-2hA.js.map} +1 -1
  156. package/dashboard/dist/assets/{tasks-BrP_8uEN.js → tasks-JVRVCx0f.js} +2 -2
  157. package/dashboard/dist/assets/{tasks-BrP_8uEN.js.map → tasks-JVRVCx0f.js.map} +1 -1
  158. package/dashboard/dist/assets/{topics-DUk-zX5D.js → topics-BLVnahd7.js} +2 -2
  159. package/dashboard/dist/assets/{topics-DUk-zX5D.js.map → topics-BLVnahd7.js.map} +1 -1
  160. package/dashboard/dist/assets/{useEventHooks-XNNzwADV.js → useEventHooks-BwjAi0Qq.js} +2 -2
  161. package/dashboard/dist/assets/{useEventHooks-XNNzwADV.js.map → useEventHooks-BwjAi0Qq.js.map} +1 -1
  162. package/dashboard/dist/assets/useNamespace-DkHmXddZ.js +2 -0
  163. package/dashboard/dist/assets/useNamespace-DkHmXddZ.js.map +1 -0
  164. package/dashboard/dist/assets/{useYamlActivityEvents-DANQ5jIY.js → useYamlActivityEvents-CsaR5dWj.js} +2 -2
  165. package/dashboard/dist/assets/{useYamlActivityEvents-DANQ5jIY.js.map → useYamlActivityEvents-CsaR5dWj.js.map} +1 -1
  166. package/dashboard/dist/assets/{users-vj0JgOkA.js → users-BvizpAkV.js} +2 -2
  167. package/dashboard/dist/assets/{users-vj0JgOkA.js.map → users-BvizpAkV.js.map} +1 -1
  168. package/dashboard/dist/assets/{workflows-CmqgGPzI.js → workflows-CyEYa01a.js} +2 -2
  169. package/dashboard/dist/assets/{workflows-CmqgGPzI.js.map → workflows-CyEYa01a.js.map} +1 -1
  170. package/dashboard/dist/assets/{yaml-workflows-DNFyjBXH.js → yaml-workflows-i3GzrEme.js} +2 -2
  171. package/dashboard/dist/assets/{yaml-workflows-DNFyjBXH.js.map → yaml-workflows-i3GzrEme.js.map} +1 -1
  172. package/dashboard/dist/index.html +1 -1
  173. package/docs/api/http/controlplane.md +6 -4
  174. package/docs/api/http/dba.md +1 -0
  175. package/docs/api/http/exports.md +26 -0
  176. package/docs/api/http/maintenance.md +1 -0
  177. package/docs/api/mcp/admin.md +7 -7
  178. package/docs/api/sdk/controlplane.md +4 -4
  179. package/package.json +1 -1
  180. package/dashboard/dist/assets/HomePage-B2Jgo1J1.js +0 -2
  181. package/dashboard/dist/assets/HomePage-B2Jgo1J1.js.map +0 -1
  182. package/dashboard/dist/assets/McpOverview-BzyxJyc9.js +0 -2
  183. package/dashboard/dist/assets/McpOverview-BzyxJyc9.js.map +0 -1
  184. package/dashboard/dist/assets/McpQueryDetailPage-DXNseeKl.js +0 -5
  185. package/dashboard/dist/assets/McpQueryDetailPage-DXNseeKl.js.map +0 -1
  186. package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js +0 -2
  187. package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js.map +0 -1
  188. package/dashboard/dist/assets/McpRunsPage-SXyiwc0d.js +0 -2
  189. package/dashboard/dist/assets/McpRunsPage-SXyiwc0d.js.map +0 -1
  190. package/dashboard/dist/assets/RolesPage-pMERxj15.js +0 -2
  191. package/dashboard/dist/assets/RolesPage-pMERxj15.js.map +0 -1
  192. package/dashboard/dist/assets/TimeAgo-BSzN6rAH.js +0 -2
  193. package/dashboard/dist/assets/ToolTestPanel-fLzNp79U.js +0 -2
  194. package/dashboard/dist/assets/ToolTestPanel-fLzNp79U.js.map +0 -1
  195. package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js +0 -2
  196. package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js.map +0 -1
  197. package/dashboard/dist/assets/YamlWorkflowsPage-CnTNOku0.js +0 -2
  198. package/dashboard/dist/assets/YamlWorkflowsPage-CnTNOku0.js.map +0 -1
  199. package/dashboard/dist/assets/capabilities-CbGmS0ty.js +0 -2
  200. package/dashboard/dist/assets/index-BeLphL59.js +0 -2
  201. package/dashboard/dist/assets/index-DDlrQeTj.js +0 -2
  202. package/dashboard/dist/assets/index-DDlrQeTj.js.map +0 -1
  203. package/dashboard/dist/assets/index-DQHmfTPo.js +0 -2
  204. package/dashboard/dist/assets/namespaces-DtsT_GoV.js +0 -2
  205. package/dashboard/dist/assets/namespaces-DtsT_GoV.js.map +0 -1
  206. package/dashboard/dist/assets/pipelines-BjlCm9VH.js +0 -2
  207. package/dashboard/dist/assets/pipelines-BjlCm9VH.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"yaml-workflows-DNFyjBXH.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useSetYamlCron","cron_schedule","cron_envelope","useClearYamlCron","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
1
+ {"version":3,"file":"yaml-workflows-i3GzrEme.js","sources":["../../src/api/yaml-workflows.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTYamlWorkflowRecord, LTYamlWorkflowStatus, LTYamlWorkflowVersion } from './types';\n\ninterface YamlWorkflowListResponse {\n workflows: LTYamlWorkflowRecord[];\n total: number;\n}\n\ninterface YamlWorkflowFilters {\n status?: LTYamlWorkflowStatus;\n graph_topic?: string;\n app_id?: string;\n search?: string;\n set_id?: string;\n limit?: number;\n offset?: number;\n}\n\nexport function useYamlWorkflows(filters: YamlWorkflowFilters = {}) {\n const params = new URLSearchParams();\n if (filters.status) params.set('status', filters.status);\n if (filters.graph_topic) params.set('graph_topic', filters.graph_topic);\n if (filters.app_id) params.set('app_id', filters.app_id);\n if (filters.search) params.set('search', filters.search);\n if (filters.set_id) params.set('set_id', filters.set_id);\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', filters],\n queryFn: () => apiFetch(`/yaml-workflows?${params}`),\n });\n}\n\nexport function useYamlWorkflowAppIds() {\n return useQuery<{ app_ids: string[] }>({\n queryKey: ['yamlWorkflowAppIds'],\n queryFn: () => apiFetch('/yaml-workflows/app-ids'),\n });\n}\n\nexport function useYamlWorkflowByTopic(graphTopic: string | undefined, appId?: string) {\n return useQuery<YamlWorkflowListResponse>({\n queryKey: ['yamlWorkflows', 'byTopic', graphTopic, appId],\n queryFn: () => {\n const params = new URLSearchParams({ graph_topic: graphTopic!, limit: '1' });\n if (appId) params.set('app_id', appId);\n return apiFetch(`/yaml-workflows?${params}`);\n },\n enabled: !!graphTopic,\n });\n}\n\nexport function useYamlWorkflow(id: string) {\n return useQuery<LTYamlWorkflowRecord>({\n queryKey: ['yamlWorkflows', id],\n queryFn: () => apiFetch(`/yaml-workflows/${id}`),\n enabled: !!id,\n });\n}\n\nexport function useCreateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n workflow_id: string;\n task_queue: string;\n workflow_name: string;\n name: string;\n description?: string;\n app_id?: string;\n subscribes?: string;\n tags?: string[];\n compilation_feedback?: string;\n }) =>\n apiFetch<LTYamlWorkflowRecord>('/yaml-workflows', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeployYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/deploy`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useActivateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/activate`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useInvokeYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data, sync, execute_as }: { id: string; data: Record<string, unknown>; sync?: boolean; execute_as?: string }) =>\n apiFetch<{ result?: unknown; job_id?: string }>(`/yaml-workflows/${id}/invoke`, {\n method: 'POST',\n body: JSON.stringify({ data, sync, ...(execute_as ? { execute_as } : {}) }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRegenerateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, task_queue, compilation_feedback }: { id: string; task_queue?: string; compilation_feedback?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/regenerate`, {\n method: 'POST',\n body: JSON.stringify({ task_queue, compilation_feedback }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useArchiveYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/archive`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useRestoreYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/restore`, {\n method: 'POST',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflow'], refetchType: 'all' });\n },\n });\n}\n\nexport function useUpdateYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, ...updates }: { id: string; yaml_content?: string; name?: string; description?: string; input_schema?: Record<string, unknown>; output_schema?: Record<string, unknown>; tags?: string[]; app_id?: string; graph_topic?: string }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useDeleteYamlWorkflow() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<{ deleted: boolean }>(`/yaml-workflows/${id}`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Cron scheduling ─────────────────────────────────────────────\n\nexport function useSetYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, cron_schedule, cron_envelope, execute_as }: {\n id: string;\n cron_schedule: string;\n cron_envelope?: Record<string, unknown> | null;\n execute_as?: string | null;\n }) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'PUT',\n body: JSON.stringify({ cron_schedule, cron_envelope, execute_as }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\nexport function useClearYamlCron() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) =>\n apiFetch<LTYamlWorkflowRecord>(`/yaml-workflows/${id}/cron`, {\n method: 'DELETE',\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: ['yamlWorkflows'], refetchType: 'all' });\n },\n });\n}\n\n// ── Version history ─────────────────────────────────────────────\n\nexport function useYamlWorkflowVersions(id: string) {\n return useQuery<{ versions: LTYamlWorkflowVersion[]; total: number }>({\n queryKey: ['yamlWorkflows', id, 'versions'],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions`),\n enabled: !!id,\n });\n}\n\nexport function useYamlWorkflowVersion(id: string, version: number | null) {\n return useQuery<LTYamlWorkflowVersion>({\n queryKey: ['yamlWorkflows', id, 'versions', version],\n queryFn: () => apiFetch(`/yaml-workflows/${id}/versions/${version}`),\n enabled: !!id && version !== null,\n });\n}\n"],"names":["useYamlWorkflows","filters","params","useQuery","apiFetch","useYamlWorkflowAppIds","useYamlWorkflow","id","useCreateYamlWorkflow","queryClient","useQueryClient","useMutation","input","useDeployYamlWorkflow","useActivateYamlWorkflow","useInvokeYamlWorkflow","data","sync","execute_as","useRegenerateYamlWorkflow","task_queue","compilation_feedback","useArchiveYamlWorkflow","useRestoreYamlWorkflow","useUpdateYamlWorkflow","updates","useDeleteYamlWorkflow","useSetYamlCron","cron_schedule","cron_envelope","useClearYamlCron","useYamlWorkflowVersions","useYamlWorkflowVersion","version"],"mappings":"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"}
@@ -8,7 +8,7 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com" />
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
10
  <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
11
- <script type="module" crossorigin src="./assets/index-_BRA9uFL.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-CWEOhAiK.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-query-B2UbickB.js">
13
13
  <link rel="modulepreload" crossorigin href="./assets/vendor-react-CXumBFUA.js">
14
14
  <link rel="modulepreload" crossorigin href="./assets/vendor-icons-Doy0g69_.js">
@@ -4,6 +4,8 @@ Admin-only endpoints for application discovery, worker health, throttling, strea
4
4
 
5
5
  All endpoints require builder access (superadmin role type or engineer role).
6
6
 
7
+ > All endpoints except `GET /apps` require a namespace (`app_id`) parameter. Use `GET /api/controlplane/apps` to discover available namespaces.
8
+
7
9
  ---
8
10
 
9
11
  ## List applications
@@ -34,7 +36,7 @@ Discover all running engines and workers for an application by broadcasting a pi
34
36
 
35
37
  | Parameter | Type | Required | Description |
36
38
  |-----------|------|----------|-------------|
37
- | `app_id` | `string` | No | Application namespace (default: `durable`) |
39
+ | `app_id` | `string` | **Yes** | Application namespace |
38
40
  | `delay` | `number` | No | Milliseconds to wait for responses |
39
41
 
40
42
  **Response 200:**
@@ -57,7 +59,7 @@ Apply a throttle rate to workflow execution across the mesh.
57
59
 
58
60
  | Field | Type | Required | Description |
59
61
  |-------|------|----------|-------------|
60
- | `appId` | `string` | No | Application namespace (default: `durable`) |
62
+ | `appId` | `string` | **Yes** | Application namespace |
61
63
  | `throttle` | `number` | Yes | Delay in ms per message (`-1` = pause, `0` = resume) |
62
64
  | `topic` | `string` | No | Scope throttle to a specific worker topic |
63
65
  | `guid` | `string` | No | Scope throttle to a specific engine/worker GUID |
@@ -82,7 +84,7 @@ Throughput and backlog metrics for engine and worker streams.
82
84
 
83
85
  | Parameter | Type | Required | Description |
84
86
  |-----------|------|----------|-------------|
85
- | `app_id` | `string` | No | Application namespace (default: `durable`) |
87
+ | `app_id` | `string` | **Yes** | Application namespace |
86
88
  | `duration` | `string` | No | Time window: `15m`, `30m`, `1h`, `1d`, `7d` (default: `1h`) |
87
89
  | `stream` | `string` | No | Filter to a specific stream name |
88
90
 
@@ -184,7 +186,7 @@ Start the quorum-to-NATS bridge for an application so mesh events are forwarded
184
186
 
185
187
  | Field | Type | Required | Description |
186
188
  |-------|------|----------|-------------|
187
- | `appId` | `string` | No | Application namespace (default: `durable`) |
189
+ | `appId` | `string` | **Yes** | Application namespace |
188
190
 
189
191
  **Response 200:**
190
192
 
@@ -14,6 +14,7 @@ Runs HotMesh's built-in prune operations against the workflow database. All para
14
14
 
15
15
  | Field | Type | Default | Description |
16
16
  |-------|------|---------|-------------|
17
+ | `app_id` | `string` | — | **Required.** Application namespace to prune |
17
18
  | `expire` | `string` | `"7 days"` | Retention period — only affect records older than this |
18
19
  | `jobs` | `boolean` | `true` | Hard-delete expired jobs |
19
20
  | `streams` | `boolean` | `true` | Hard-delete expired streams |
@@ -4,6 +4,32 @@ Export endpoints expose workflow state and execution history. The execution hist
4
4
 
5
5
  Every endpoint resolves the workflow automatically from the `workflowId` — no additional parameters needed.
6
6
 
7
+ ## List workflow jobs
8
+
9
+ ```
10
+ GET /api/workflow-states/jobs
11
+ ```
12
+
13
+ List workflow jobs with optional filtering and pagination. Requires a namespace.
14
+
15
+ **Query parameters:**
16
+
17
+ | Parameter | Type | Required | Description |
18
+ |-----------|------|----------|-------------|
19
+ | `app_id` | `string` | **Yes** | Application namespace (alias: `namespace`) |
20
+ | `entity` | `string` | No | Filter by entity name |
21
+ | `search` | `string` | No | Search by workflow ID substring |
22
+ | `status` | `string` | No | Filter by status: `running`, `completed`, `failed` |
23
+ | `sort_by` | `string` | No | Sort field |
24
+ | `order` | `string` | No | Sort direction: `asc` or `desc` |
25
+ | `registered` | `string` | No | Filter by registration status |
26
+ | `limit` | `integer` | No | Max results |
27
+ | `offset` | `integer` | No | Pagination offset |
28
+
29
+ **Response 400:** Missing `app_id`.
30
+
31
+ ---
32
+
7
33
  ## Raw workflow state
8
34
 
9
35
  ```
@@ -43,6 +43,7 @@ Replaces the maintenance configuration and restarts the cron. The endpoint disco
43
43
 
44
44
  | Field | Type | Required | Description |
45
45
  |-------|------|----------|-------------|
46
+ | `appId` | `string` | no | Target a specific application namespace |
46
47
  | `schedule` | `string` | yes | Cron expression (`0 3 * * *`) or interval (`1 day`) |
47
48
  | `rules` | `array` | yes | Ordered list of maintenance rules |
48
49
 
@@ -887,7 +887,7 @@ Execute a roll call — discovers all engines and workers in the mesh.
887
887
 
888
888
  | Field | Type | Required | Description |
889
889
  |-------|------|----------|-------------|
890
- | app_id | string | No | App namespace |
890
+ | app_id | string | **Yes** | App namespace |
891
891
  | delay | integer | No | Delay in ms |
892
892
 
893
893
  ### apply_throttle
@@ -903,7 +903,7 @@ Apply a throttle to the mesh (-1=pause, 0=resume, >0=delay ms per message).
903
903
  | Field | Type | Required | Description |
904
904
  |-------|------|----------|-------------|
905
905
  | throttle | integer | Yes | Throttle value (-1=pause, 0=resume, >0=delay ms) |
906
- | appId | string | No | App namespace |
906
+ | appId | string | **Yes** | App namespace |
907
907
  | topic | string | No | Topic to throttle |
908
908
  | guid | string | No | Specific GUID |
909
909
  | scope | string | No | Throttle scope |
@@ -920,7 +920,7 @@ Stream processing statistics — pending count and processed volume by time rang
920
920
 
921
921
  | Field | Type | Required | Description |
922
922
  |-------|------|----------|-------------|
923
- | app_id | string | No | App namespace |
923
+ | app_id | string | **Yes** | App namespace |
924
924
  | duration | string | No | Time range |
925
925
  | stream | string | No | Specific stream |
926
926
 
@@ -964,7 +964,7 @@ List distinct entity (tool) names from pipeline jobs.
964
964
 
965
965
  | Field | Type | Required | Description |
966
966
  |-------|------|----------|-------------|
967
- | app_id | string | No | App namespace |
967
+ | app_id | string | **Yes** | App namespace |
968
968
 
969
969
  ### list_pipeline_jobs
970
970
 
@@ -978,7 +978,7 @@ List pipeline jobs with optional entity, search, and status filters.
978
978
 
979
979
  | Field | Type | Required | Description |
980
980
  |-------|------|----------|-------------|
981
- | app_id | string | No | App namespace |
981
+ | app_id | string | **Yes** | App namespace |
982
982
  | limit | integer | No | Max results |
983
983
  | offset | integer | No | Pagination offset |
984
984
  | entity | string | No | Filter by entity |
@@ -1000,7 +1000,7 @@ Export execution details for a specific pipeline job.
1000
1000
  | Field | Type | Required | Description |
1001
1001
  |-------|------|----------|-------------|
1002
1002
  | job_id | string | Yes | Pipeline job ID |
1003
- | app_id | string | No | App namespace |
1003
+ | app_id | string | **Yes** | App namespace |
1004
1004
 
1005
1005
  ### interrupt_pipeline_job
1006
1006
 
@@ -1016,7 +1016,7 @@ Interrupt a running pipeline job.
1016
1016
  |-------|------|----------|-------------|
1017
1017
  | job_id | string | Yes | Pipeline job ID |
1018
1018
  | topic | string | Yes | Pipeline topic |
1019
- | app_id | string | No | App namespace |
1019
+ | app_id | string | **Yes** | App namespace |
1020
1020
 
1021
1021
  ## Topics
1022
1022
 
@@ -30,7 +30,7 @@ const result = await lt.controlplane.rollCall({ appId: 'durable', delay: 2000 })
30
30
 
31
31
  | Field | Type | Required | Description |
32
32
  |-------|------|----------|-------------|
33
- | `appId` | `string` | No | Application namespace to query (defaults to `'durable'`) |
33
+ | `appId` | `string` | **Yes** | Application namespace to query |
34
34
  | `delay` | `number` | No | Milliseconds to wait for worker responses before returning |
35
35
 
36
36
  **Returns:** `LTApiResult<{ profiles: object[] }>`
@@ -52,7 +52,7 @@ const result = await lt.controlplane.throttle({ throttle: 50, topic: 'my-topic'
52
52
  | Field | Type | Required | Description |
53
53
  |-------|------|----------|-------------|
54
54
  | `throttle` | `number` | Yes | Throttle value to apply |
55
- | `appId` | `string` | No | Application namespace (defaults to `'durable'`) |
55
+ | `appId` | `string` | **Yes** | Application namespace |
56
56
  | `topic` | `string` | No | Topic to scope the throttle to |
57
57
  | `guid` | `string` | No | Workflow GUID to scope the throttle to |
58
58
 
@@ -74,7 +74,7 @@ const result = await lt.controlplane.getStreamStats({ app_id: 'durable', duratio
74
74
 
75
75
  | Field | Type | Required | Description |
76
76
  |-------|------|----------|-------------|
77
- | `app_id` | `string` | No | Application namespace (defaults to `'durable'`) |
77
+ | `app_id` | `string` | **Yes** | Application namespace |
78
78
  | `duration` | `string` | No | Time window for stats aggregation, e.g. `'1h'`, `'30m'` (defaults to `'1h'`) |
79
79
  | `stream` | `string` | No | Specific stream name to filter results |
80
80
 
@@ -132,7 +132,7 @@ const result = await lt.controlplane.subscribe({ appId: 'durable' });
132
132
 
133
133
  | Field | Type | Required | Description |
134
134
  |-------|------|----------|-------------|
135
- | `appId` | `string` | No | Application namespace to subscribe to (defaults to `'durable'`) |
135
+ | `appId` | `string` | **Yes** | Application namespace to subscribe to |
136
136
 
137
137
  **Returns:** `LTApiResult<{ subscribed: true, appId: string }>`
138
138
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.4.22",
3
+ "version": "0.4.23",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -1,2 +0,0 @@
1
- import{a as j,j as e}from"./vendor-query-B2UbickB.js";import{j as ne,s as re,q as oe,r as ce,d as E}from"./index-_BRA9uFL.js";import{b as le}from"./workflows-CmqgGPzI.js";import{u as de}from"./pipelines-BjlCm9VH.js";import{a as xe}from"./controlplane-DGvwkuYx.js";import{u as pe}from"./tasks-BrP_8uEN.js";import{e as me,b as ue,u as he}from"./useEventHooks-XNNzwADV.js";import{R as D}from"./RolePill-SasQKc_B.js";import{W as x}from"./WorkflowPill-Z-zHRKOK.js";import{L as p}from"./ListToolbar-jrVba7QN.js";import{I as w,a9 as m,y as O,b as G,G as U,B as fe}from"./vendor-icons-Doy0g69_.js";import{c as K,f as je}from"./vendor-react-CXumBFUA.js";const ge={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 J(t){return ge[t]??"bg-text-tertiary"}function u({icon:t,color:a,docsHash:n,count:i,children:o,actions:c}){return e.jsxs("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(t,{className:`w-4.5 h-4.5 ${a||"text-accent/60"}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:o}),i!==void 0&&i>0&&e.jsx("span",{className:"text-[10px] text-text-quaternary tabular-nums",children:i})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[n&&e.jsx("button",{onClick:()=>{window.location.hash=n},className:"text-text-quaternary hover:text-accent transition-colors",title:"Docs",children:e.jsx(fe,{className:"w-2.5 h-2.5",strokeWidth:1.5})}),c]})]})}function h({icon:t,text:a}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx(t,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1}),e.jsx("p",{className:"text-xs text-text-quaternary",children:a})]})}function be(t,a=37){if(!t||t.length<=a)return t;const n=Math.floor((a-3)/2);return`${t.slice(0,n)}...${t.slice(-n)}`}function _({dot:t,pill:a,id:n,date:i,onClick:o}){return e.jsxs("button",{onClick:o,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${t}`}),e.jsx("span",{className:"text-[12px] text-text-primary font-mono truncate max-w-[60%]",children:be(n)}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto whitespace-nowrap",children:e.jsx(E,{date:i})})]}),e.jsx("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:a})]})}function f({to:t,icon:a,title:n}){const i=K();return e.jsx("button",{onClick:()=>i(t),className:"text-text-quaternary hover:text-accent transition-colors",title:n,children:e.jsx(a,{className:"w-2.5 h-2.5",strokeWidth:1.5})})}function V({appIds:t,selected:a,onSelect:n}){const[i,o]=j.useState(!1),c=j.useRef(null);return j.useEffect(()=>{if(!i)return;const r=g=>{c.current&&!c.current.contains(g.target)&&o(!1)};return document.addEventListener("mousedown",r),()=>document.removeEventListener("mousedown",r)},[i]),t.length<=1?null:e.jsxs("div",{className:"relative mb-3 -mt-2",ref:c,children:[e.jsxs("button",{onClick:()=>o(r=>!r),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:[a,e.jsx("svg",{className:`w-2.5 h-2.5 transition-transform ${i?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),i&&e.jsx("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:t.map(r=>e.jsx("button",{onClick:()=>{n(r),o(!1)},className:`w-full text-left px-3 py-1.5 text-[11px] transition-colors ${a===r?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:r},r))})]})}function Re(){var T,F,S,I,L,W,z,B,H,M;const t=K(),{user:a}=ne(),{isBuilder:n}=re(),[i,o]=je(),c=i.get("pipelinenamespace")||"hmsh",r=i.get("durablenamespace")||"durable",g=j.useCallback((s,N)=>{o(ie=>{const Q=new URLSearchParams(ie);return Q.set(s,N),Q},{replace:!1})},[o]);me(),ue(),he();const b=pe({limit:5}),v=le({limit:5,sort_by:"updated_at",order:"desc",namespace:r}),{data:k}=xe(),P=((k==null?void 0:k.apps)??[]).map(s=>s.appId),X=P,Y=P,y=de({limit:5,app_id:c,sort_by:"updated_at",order:"desc"}),l=oe({limit:5,sort_by:"created_at",order:"desc"}),d=ce({assigned_to:a==null?void 0:a.userId,status:"pending",limit:5,sort_by:"created_at",order:"desc"});j.useEffect(()=>{const s=setTimeout(()=>{d.refetch(),l.refetch()},2e3);return()=>clearTimeout(s)},[]);const A=((T=b.data)==null?void 0:T.processes)??[],Z=(F=b.data)==null?void 0:F.total,$=((S=v.data)==null?void 0:S.jobs)??[],ee=(I=v.data)==null?void 0:I.total,q=((L=y.data)==null?void 0:L.jobs)??[],se=(W=y.data)==null?void 0:W.total,C=((z=l.data)==null?void 0:z.escalations)??[],te=(B=l.data)==null?void 0:B.total,R=((H=d.data)==null?void 0:H.escalations)??[],ae=(M=d.data)==null?void 0:M.total;return e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary mb-10",children:"Recent Activity"}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-x-14",children:[e.jsxs("div",{children:[e.jsx(u,{icon:w,color:"text-blue-400",count:te,docsHash:"#docs:dashboard.md:all-escalations",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{onRefresh:()=>l.refetch(),isFetching:l.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(f,{to:"/escalations/available",icon:m,title:"All available escalations"})]}),children:"Available Escalations"}),C.length===0?e.jsx(h,{icon:w,text:"No pending escalations"}):e.jsx("div",{className:"space-y-1",children:C.map(s=>e.jsxs("button",{onClick:()=>t(`/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.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(E,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(x,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(D,{role:s.role})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsx(u,{icon:w,color:"text-orange-400",count:ae,docsHash:"#docs:dashboard.md:escalations-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{onRefresh:()=>d.refetch(),isFetching:d.isFetching,apiPath:`/escalations?assigned_to=${(a==null?void 0:a.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(f,{to:"/escalations/queue",icon:m,title:"My escalation queue"})]}),children:"My Escalations"}),R.length===0?e.jsx(h,{icon:w,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-1",children:R.map(s=>e.jsxs("button",{onClick:()=>t(`/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.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-[12px] text-text-primary truncate flex-1 max-w-[65%]",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-auto",children:e.jsx(E,{date:s.updated_at??s.created_at})})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5",children:[e.jsx(x,{type:s.type||"unknown",size:"xs"}),e.jsx("span",{className:"flex-1"}),e.jsx(D,{role:s.role})]})]},s.id))})]})]}),n&&e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14",children:[e.jsxs("div",{children:[e.jsx(u,{icon:O,color:"text-emerald-400",count:Z,docsHash:"#docs:dashboard.md:processes-overview",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{onRefresh:()=>b.refetch(),isFetching:b.isFetching,apiPath:"/tasks/processes?limit=5"}),e.jsx(f,{to:"/processes/all",icon:m,title:"All processes"})]}),children:"Certified Processes"}),e.jsx("div",{className:"mb-3 -mt-2",children:e.jsx("span",{className:"px-2 py-0.5 text-[10px] rounded text-text-quaternary uppercase tracking-widest",children:"all namespaces"})}),A.length===0?e.jsx(h,{icon:O,text:"No recent processes"}):e.jsx("div",{className:"space-y-1",children:A.map(s=>e.jsx(_,{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.jsx(e.Fragment,{children:(s.workflow_types??[s.workflow_type]).filter(Boolean).map(N=>e.jsx(x,{type:N,size:"xs"},N))}),id:s.origin_id,date:s.last_activity??s.started_at,onClick:()=>t(`/processes/detail/${s.origin_id}`)},s.origin_id))})]}),e.jsxs("div",{children:[e.jsx(u,{icon:G,color:"text-blue-400",count:ee,docsHash:"#docs:dashboard.md:durable-executions",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{onRefresh:()=>v.refetch(),isFetching:v.isFetching,apiPath:`/workflow-states/jobs?namespace=${r}&limit=5`}),e.jsx(f,{to:"/workflows/executions",icon:m,title:"All durable executions"})]}),children:"Workflow Executions"}),e.jsx(V,{appIds:X,selected:r,onSelect:s=>g("durablenamespace",s)}),$.length===0?e.jsx(h,{icon:G,text:"No recent executions"}):e.jsx("div",{className:"space-y-1",children:$.map(s=>e.jsx(_,{dot:J(s.status),pill:e.jsx(x,{type:s.entity||s.type||"workflow",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/workflows/executions/${s.workflow_id}`)},s.workflow_id))})]}),e.jsxs("div",{children:[e.jsx(u,{icon:U,color:"text-violet-400",count:se,docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{onRefresh:()=>y.refetch(),isFetching:y.isFetching,apiPath:`/pipelines?app_id=${c}&limit=5`}),e.jsx(f,{to:"/mcp/executions",icon:m,title:"All pipeline executions"})]}),children:"Pipeline Executions"}),e.jsx(V,{appIds:Y,selected:c,onSelect:s=>g("pipelinenamespace",s)}),q.length===0?e.jsx(h,{icon:U,text:"No recent pipeline runs"}):e.jsx("div",{className:"space-y-1",children:q.map(s=>e.jsx(_,{dot:J(s.status),pill:e.jsx(x,{type:s.entity||s.workflow_name||"pipeline",variant:"pipeline",size:"xs"}),id:s.workflow_id,date:s.updated_at??s.created_at,onClick:()=>t(`/mcp/executions/${s.workflow_id}?namespace=${c}`)},s.workflow_id))})]})]})]})}export{Re as HomePage};
2
- //# sourceMappingURL=HomePage-B2Jgo1J1.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HomePage-B2Jgo1J1.js","sources":["../../src/pages/home/HomePage.tsx"],"sourcesContent":["import { useState, useRef, useCallback, useEffect } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n Inbox, ScrollText, GitBranch, Layers, ExternalLink, BookOpen,\n} from 'lucide-react';\nimport { useAvailableEscalations, useEscalations } from '../../api/escalations';\nimport { useJobs } from '../../api/workflows';\nimport { useMcpRuns } from '../../api/pipelines';\nimport { useControlPlaneApps } from '../../api/controlplane';\nimport { useProcesses } from '../../api/tasks';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useAccess } from '../../hooks/useAccess';\nimport { useEscalationStatsEvents, useWorkflowListEvents, useProcessListEvents } from '../../hooks/useEventHooks';\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';\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// ── Section header ──────────────────────────────────────────────────────────\n\nfunction SectionHeader({ icon: Icon, color, docsHash, count, children, actions }: { icon: React.ElementType; color?: string; docsHash?: string; count?: number; 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 {count !== undefined && count > 0 && (\n <span className=\"text-[10px] text-text-quaternary tabular-nums\">{count}</span>\n )}\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// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function HomePage() {\n const navigate = useNavigate();\n const { user } = useAuth();\n const { isBuilder } = useAccess();\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 = useAvailableEscalations({ limit: 5, sort_by: 'created_at', order: 'desc' });\n const myEscQ = useEscalations({ assigned_to: user?.userId, status: 'pending', limit: 5, sort_by: 'created_at', order: 'desc' });\n\n // Delayed refetch — allows signal-routed escalation resolutions\n // (durable activity) time to commit before refreshing the list\n useEffect(() => {\n const timer = setTimeout(() => {\n myEscQ.refetch();\n allEscQ.refetch();\n }, 2000);\n return () => clearTimeout(timer);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const processes = procQ.data?.processes ?? [];\n const processTotal = (procQ.data as any)?.total as number | undefined;\n const jobs = jobsQ.data?.jobs ?? [];\n const jobsTotal = jobsQ.data?.total;\n const mcpRuns = (mcpQ.data as any)?.jobs ?? [];\n const mcpTotal = (mcpQ.data as any)?.total as number | undefined;\n const allEscalations = allEscQ.data?.escalations ?? [];\n const allEscTotal = allEscQ.data?.total;\n const myEscalations = myEscQ.data?.escalations ?? [];\n const myEscTotal = myEscQ.data?.total;\n\n return (\n <div>\n <h1 className=\"text-3xl font-light text-text-primary mb-10\">Recent Activity</h1>\n\n {/* ── Row 1: Available Escalations | My Escalations ────────────────── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-x-14\">\n\n {/* Col 1: Available Escalations */}\n <div>\n <SectionHeader icon={Inbox} color=\"text-blue-400\" count={allEscTotal} 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=created_at&order=desc\" />\n <NavIcon to=\"/escalations/available\" icon={ExternalLink} title=\"All available escalations\" />\n </div>\n }>\n Available Escalations\n </SectionHeader>\n {allEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} 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\" count={myEscTotal} 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&sort_by=created_at&order=desc`} />\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 </div>\n\n {/* ── Row 2: Processes | Workflow Executions | Pipeline Executions (builders only) */}\n {isBuilder && <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 mt-14\">\n\n {/* Col 1: Processes */}\n <div>\n <SectionHeader icon={Layers} color=\"text-emerald-400\" count={processTotal} 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: Workflow Executions */}\n <div>\n <SectionHeader icon={ScrollText} color=\"text-blue-400\" count={jobsTotal} 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 Workflow Executions\n </SectionHeader>\n <AppPicker appIds={durableAppIds} selected={durableNs} onSelect={(ns) => setNs('durablenamespace', ns)} />\n {jobs.length === 0 ? (\n <EmptyPanel icon={ScrollText} 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={GitBranch} color=\"text-violet-400\" count={mcpTotal} 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={`/pipelines?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={GitBranch} 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 </div>\n );\n}\n"],"names":["STATUS_DOT","statusDotClass","status","SectionHeader","Icon","color","docsHash","count","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","useState","ref","useRef","useEffect","handler","e","v","HomePage","user","useAuth","isBuilder","useAccess","searchParams","setSearchParams","useSearchParams","pipelineNs","durableNs","setNs","useCallback","key","ns","prev","next","useEscalationStatsEvents","useWorkflowListEvents","useProcessListEvents","procQ","useProcesses","jobsQ","useJobs","cpData","useControlPlaneApps","allAppIds","a","durableAppIds","pipelineAppIds","mcpQ","useMcpRuns","allEscQ","useAvailableEscalations","myEscQ","useEscalations","timer","processes","_a","processTotal","_b","jobs","_c","jobsTotal","_d","mcpRuns","_e","mcpTotal","_f","allEscalations","_g","allEscTotal","_h","myEscalations","_i","myEscTotal","_j","Inbox","ListToolbar","ExternalLink","esc","WorkflowPill","RolePill","Layers","p","wt","ScrollText","job","GitBranch","run"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{u as _}from"./mcp-MtXuky8q.js";import{u as R}from"./pipelines-BjlCm9VH.js";import{u as F}from"./yaml-workflows-DNFyjBXH.js";import{u as A}from"./namespaces-DtsT_GoV.js";import{P as z}from"./PageHeader-BuJpMxyu.js";import{S as b}from"./StatCard-DlgF0CJC.js";import{i as E,r as I}from"./vendor-icons-Doy0g69_.js";import{c as W}from"./vendor-react-CXumBFUA.js";import"./index-_BRA9uFL.js";const $=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function O(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 j({value:r,colorClass:c,onClick:v}){return r===0?e.jsx("span",{className:"text-text-tertiary",children:"0"}):e.jsx("button",{onClick:v,className:`${c} hover:underline tabular-nums font-medium`,children:r})}function X(){const r=W(),[c,v]=i.useState("24h"),[u,T]=i.useState("longtail"),{data:d}=A(),{data:m}=R({limit:500,app_id:u}),{data:N,isLoading:D}=_(),{data:y,isLoading:L}=F({limit:200}),k=i.useMemo(()=>((d==null?void 0:d.namespaces)??[]).map(t=>t.name),[d==null?void 0:d.namespaces]),p=(N==null?void 0:N.servers)??[],h=(y==null?void 0:y.workflows)??[],w=i.useMemo(()=>p.reduce((t,l)=>t+(Array.isArray(l.tool_manifest)?l.tool_manifest.length:0),0),[p]),M=i.useMemo(()=>new Set(h.map(l=>l.app_id)).size,[h]),S=i.useMemo(()=>{const t=$.find(l=>l.label===c);return Date.now()-t.ms},[c]),o=i.useMemo(()=>((m==null?void 0:m.jobs)??[]).filter(t=>new Date(t.created_at).getTime()>=S),[m==null?void 0:m.jobs,S]),C=i.useMemo(()=>{const t=new Map;for(const s of o){const a=t.get(s.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(a.total++,s.status==="running"&&a.running++,s.status==="completed"){a.completed++;const g=new Date(s.updated_at).getTime()-new Date(s.created_at).getTime();g>0&&a.durations.push(g)}s.status==="failed"&&a.failed++,t.set(s.entity,a)}const l=[];for(const[s,a]of t)l.push({pipeline:s,...a,avgDuration:a.durations.length>0?a.durations.reduce((g,P)=>g+P,0)/a.durations.length:null});return l.sort((s,a)=>a.total-s.total)},[o]),f=i.useMemo(()=>({total:o.length,running:o.filter(t=>t.status==="running").length,completed:o.filter(t=>t.status==="completed").length,failed:o.filter(t=>t.status==="failed").length}),[o]),n=(t,l)=>{const s=new URLSearchParams;u!=="longtail"&&s.set("namespace",u),t&&s.set("entity",t),l&&s.set("status",l);const a=s.toString();r(`/mcp/executions${a?`?${a}`:""}`)},x="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxs("div",{children:[e.jsx(z,{title:"Discovered"}),e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("div",{className:"flex items-center gap-1",children:$.map(t=>e.jsx("button",{onClick:()=>v(t.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${c===t.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:t.label},t.label))}),k.length>1&&e.jsx("select",{value:u,onChange:t=>T(t.target.value),className:"select text-xs py-1 px-2",children:k.map(t=>e.jsx("option",{value:t,children:t},t))})]}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsx(b,{label:"Total Runs",value:f.total,onClick:()=>n()}),e.jsx(b,{label:"Running",value:f.running,colorClass:"text-status-active",onClick:()=>n(void 0,"running")}),e.jsx(b,{label:"Completed",value:f.completed,colorClass:"text-status-success",onClick:()=>n(void 0,"completed")}),e.jsx(b,{label:"Failed",value:f.failed,colorClass:"text-status-error",onClick:()=>n(void 0,"failed")})]}),C.length>0&&e.jsxs("table",{className:"w-full text-left mb-10",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-surface-border",children:[e.jsx("th",{className:x,children:"Tool"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Total"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Running"}),e.jsx("th",{className:`${x} text-right w-24`,children:"Completed"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Failed"}),e.jsx("th",{className:`${x} text-right w-28`,children:"Avg Duration"})]})}),e.jsx("tbody",{children:C.map(t=>e.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsx("button",{onClick:()=>n(t.pipeline),className:"hover:text-accent hover:underline",children:t.pipeline})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.total,colorClass:"text-text-secondary",onClick:()=>n(t.pipeline)})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.running,colorClass:"text-status-active",onClick:()=>n(t.pipeline,"running")})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.completed,colorClass:"text-status-success",onClick:()=>n(t.pipeline,"completed")})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.failed,colorClass:"text-status-error",onClick:()=>n(t.pipeline,"failed")})}),e.jsx("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:t.avgDuration!==null?O(t.avgDuration):"—"})]},t.pipeline))})]}),C.length===0&&e.jsx("div",{className:"py-12 text-center mb-8",children:e.jsxs("p",{className:"text-sm text-text-tertiary",children:["No MCP tool activity in the last ",c]})}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("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.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(E,{size:16,className:"text-accent shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary",children:"Tool Servers"})]}),e.jsxs("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[D?"—":p.length,e.jsxs("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["server",p.length!==1?"s":""," · ",w," tool",w!==1?"s":""]})]}),e.jsx("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."})]}),e.jsxs("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.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(I,{size:16,className:"text-purple-400 shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary",children:"Pipeline Registry"})]}),e.jsxs("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[L?"—":h.length,e.jsxs("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["workflow",h.length!==1?"s":""," · ",M," server",M!==1?"s":""]})]}),e.jsx("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."})]})]})]})}export{X as McpOverview};
2
- //# sourceMappingURL=McpOverview-BzyxJyc9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpOverview-BzyxJyc9.js","sources":["../../src/pages/mcp/McpOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Server, Workflow } from 'lucide-react';\nimport { useMcpServers } from '../../api/mcp';\nimport { useMcpRuns } from '../../api/pipelines';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\nimport type { McpToolManifest } from '../../api/types';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface PipelineStats {\n pipeline: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Reusable components ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function McpOverview() {\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n const [namespace, setNamespace] = useState('longtail');\n\n const { data: nsData } = useNamespaces();\n const { data: allRuns } = useMcpRuns({ limit: 500, app_id: namespace });\n const { data: serverData, isLoading: serversLoading } = useMcpServers();\n const { data: yamlData, isLoading: yamlLoading } = useYamlWorkflows({ limit: 200 });\n\n const namespaces = useMemo(\n () => (nsData?.namespaces ?? []).map((ns) => ns.name),\n [nsData?.namespaces],\n );\n\n // ── Server counts ────────────────────────────────────────────\n const servers = serverData?.servers ?? [];\n const yamlWorkflows = yamlData?.workflows ?? [];\n\n const serverToolCount = useMemo(\n () => servers.reduce((sum, s) => sum + (Array.isArray(s.tool_manifest) ? (s.tool_manifest as McpToolManifest[]).length : 0), 0),\n [servers],\n );\n\n const workflowServerCount = useMemo(() => {\n const appIds = new Set(yamlWorkflows.map((wf) => wf.app_id));\n return appIds.size;\n }, [yamlWorkflows]);\n\n // ── Run stats ──────────────────────────────────────────────────\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const runs = useMemo(\n () => (allRuns?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allRuns?.jobs, cutoff],\n );\n\n const byPipeline = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of runs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: PipelineStats[] = [];\n for (const [pipeline, stats] of map) {\n result.push({\n pipeline,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [runs]);\n\n const totals = useMemo(() => ({\n total: runs.length,\n running: runs.filter((j) => j.status === 'running').length,\n completed: runs.filter((j) => j.status === 'completed').length,\n failed: runs.filter((j) => j.status === 'failed').length,\n }), [runs]);\n\n const goToRuns = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (namespace !== 'longtail') params.set('namespace', namespace);\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/mcp/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Discovered\" />\n\n {/* ── Duration tabs + namespace ────────────────────────── */}\n <div className=\"flex items-center gap-4 mb-6\">\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n {namespaces.length > 1 && (\n <select\n value={namespace}\n onChange={(e) => setNamespace(e.target.value)}\n className=\"select text-xs py-1 px-2\"\n >\n {namespaces.map((ns) => (\n <option key={ns} value={ns}>{ns}</option>\n ))}\n </select>\n )}\n </div>\n\n {/* ── Summary cards ────────────────────────────────────── */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total Runs\" value={totals.total} onClick={() => goToRuns()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToRuns(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(undefined, 'failed')} />\n </div>\n\n {/* ── By-pipeline table ────────────────────────────────── */}\n {byPipeline.length > 0 && (\n <table className=\"w-full text-left mb-10\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Tool</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byPipeline.map((row) => (\n <tr key={row.pipeline} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToRuns(row.pipeline)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.pipeline}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToRuns(row.pipeline)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToRuns(row.pipeline, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(row.pipeline, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(row.pipeline, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byPipeline.length === 0 && (\n <div className=\"py-12 text-center mb-8\">\n <p className=\"text-sm text-text-tertiary\">\n No MCP tool activity in the last {duration}\n </p>\n </div>\n )}\n\n {/* ── Server inventory (compact cards) ─────────────────── */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <button\n onClick={() => navigate('/mcp/servers')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Server size={16} className=\"text-accent shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Tool Servers</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {serversLoading ? '—' : servers.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n server{servers.length !== 1 ? 's' : ''} · {serverToolCount} tool{serverToolCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-[11px] text-text-tertiary leading-relaxed mt-2\">\n Built-in and external MCP servers. Each server exposes tools that workflows and agents can call.\n </p>\n </button>\n\n <button\n onClick={() => navigate('/mcp/workflows')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Workflow size={16} className=\"text-purple-400 shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Pipeline Registry</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {yamlLoading ? '—' : yamlWorkflows.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n workflow{yamlWorkflows.length !== 1 ? 's' : ''} · {workflowServerCount} server{workflowServerCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-[11px] text-text-tertiary leading-relaxed mt-2\">\n Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs.\n </p>\n </button>\n </div>\n </div>\n );\n}\n"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","McpOverview","navigate","useNavigate","duration","setDuration","useState","namespace","setNamespace","nsData","useNamespaces","allRuns","useMcpRuns","serverData","serversLoading","useMcpServers","yamlData","yamlLoading","useYamlWorkflows","namespaces","useMemo","ns","servers","yamlWorkflows","serverToolCount","sum","s","workflowServerCount","wf","cutoff","d","runs","j","byPipeline","map","entry","dur","result","pipeline","stats","a","b","totals","goToRuns","entity","status","params","qs","thCls","PageHeader","jsxs","e","StatCard","row","Server","Workflow"],"mappings":"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"}