@hotmeshio/long-tail 0.3.0 → 0.3.2

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 (314) hide show
  1. package/build/api/topics.d.ts +22 -0
  2. package/build/api/topics.js +104 -0
  3. package/build/index.d.ts +3 -1
  4. package/build/index.js +7 -2
  5. package/build/lib/db/schemas/001_schema.sql +3 -3
  6. package/build/lib/db/schemas/006_agent_sub_unique.sql +1 -0
  7. package/build/lib/db/schemas/007_topic_catalog.sql +27 -0
  8. package/build/routes/index.js +2 -0
  9. package/build/routes/topics.d.ts +2 -0
  10. package/build/routes/topics.js +90 -0
  11. package/build/services/topics/index.d.ts +77 -0
  12. package/build/services/topics/index.js +116 -0
  13. package/build/services/topics/sql.d.ts +10 -0
  14. package/build/services/topics/sql.js +80 -0
  15. package/build/services/topics/system-topics.d.ts +11 -0
  16. package/build/services/topics/system-topics.js +270 -0
  17. package/build/start/workers.js +5 -0
  18. package/build/system/mcp-servers/events.js +73 -1
  19. package/build/system/seed/tool-manifests-events.d.ts +75 -0
  20. package/build/system/seed/tool-manifests-events.js +27 -0
  21. package/build/tsconfig.tsbuildinfo +1 -1
  22. package/build/types/index.d.ts +2 -2
  23. package/build/types/startup.d.ts +27 -0
  24. package/dashboard/dist/assets/AdminDashboard-CbeSejVX.js +2 -0
  25. package/dashboard/dist/assets/{AdminDashboard-Bb6zouF5.js.map → AdminDashboard-CbeSejVX.js.map} +1 -1
  26. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js +13 -0
  27. package/dashboard/dist/assets/AgentConfigPage-CFJNOrlg.js.map +1 -0
  28. package/dashboard/dist/assets/AgentDetailPage-Dbx2t-Uk.js +4 -0
  29. package/dashboard/dist/assets/{AgentDetailPage-WwA573u9.js.map → AgentDetailPage-Dbx2t-Uk.js.map} +1 -1
  30. package/dashboard/dist/assets/AgentsPage-Bz61Nl-x.js +2 -0
  31. package/dashboard/dist/assets/{AgentsPage-BZkZ_hXN.js.map → AgentsPage-Bz61Nl-x.js.map} +1 -1
  32. package/dashboard/dist/assets/AvailableEscalationsPage-DdrzePy4.js +2 -0
  33. package/dashboard/dist/assets/{AvailableEscalationsPage-C-Df3ZsZ.js.map → AvailableEscalationsPage-DdrzePy4.js.map} +1 -1
  34. package/dashboard/dist/assets/BotPicker-kKBifD1w.js +2 -0
  35. package/dashboard/dist/assets/{BotPicker-CwfVVWxh.js.map → BotPicker-kKBifD1w.js.map} +1 -1
  36. package/dashboard/dist/assets/CapabilitiesPage-Ch5qY0I7.js +2 -0
  37. package/dashboard/dist/assets/{CapabilitiesPage-DJEQ_5dV.js.map → CapabilitiesPage-Ch5qY0I7.js.map} +1 -1
  38. package/dashboard/dist/assets/CollapsibleSection-kYTBL7dT.js +2 -0
  39. package/dashboard/dist/assets/{CollapsibleSection-DaFQGU6S.js.map → CollapsibleSection-kYTBL7dT.js.map} +1 -1
  40. package/dashboard/dist/assets/ConfirmDeleteModal-CcaAapMl.js +2 -0
  41. package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-CcaAapMl.js.map} +1 -1
  42. package/dashboard/dist/assets/CopyableId-B4CL12pv.js +2 -0
  43. package/dashboard/dist/assets/{CopyableId-DmLF-RqZ.js.map → CopyableId-B4CL12pv.js.map} +1 -1
  44. package/dashboard/dist/assets/CredentialsPage-D1VAlwid.js +2 -0
  45. package/dashboard/dist/assets/{CredentialsPage-D-tkqdhu.js.map → CredentialsPage-D1VAlwid.js.map} +1 -1
  46. package/dashboard/dist/assets/CronLabel-DRmO5rH0.js +2 -0
  47. package/dashboard/dist/assets/{CronLabel-C6iCjsXd.js.map → CronLabel-DRmO5rH0.js.map} +1 -1
  48. package/dashboard/dist/assets/CustomDurationPicker-C06QDDir.js +2 -0
  49. package/dashboard/dist/assets/{CustomDurationPicker--wCtBkmT.js.map → CustomDurationPicker-C06QDDir.js.map} +1 -1
  50. package/dashboard/dist/assets/DataTable-J5R6mepB.js +2 -0
  51. package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-J5R6mepB.js.map} +1 -1
  52. package/dashboard/dist/assets/DropZone-DwNj3GiG.js +2 -0
  53. package/dashboard/dist/assets/{DropZone-2mGyDo1P.js.map → DropZone-DwNj3GiG.js.map} +1 -1
  54. package/dashboard/dist/assets/ElapsedCell-ChyMzl9n.js +2 -0
  55. package/dashboard/dist/assets/{ElapsedCell-DKoH0bqR.js.map → ElapsedCell-ChyMzl9n.js.map} +1 -1
  56. package/dashboard/dist/assets/EmptyState-BXGvOADa.js +2 -0
  57. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-BXGvOADa.js.map} +1 -1
  58. package/dashboard/dist/assets/EscalationsOverview-DM6zmE4g.js +2 -0
  59. package/dashboard/dist/assets/{EscalationsOverview-C6A4Q9Ne.js.map → EscalationsOverview-DM6zmE4g.js.map} +1 -1
  60. package/dashboard/dist/assets/EventTable-CvJ98E8s.js +2 -0
  61. package/dashboard/dist/assets/{EventTable-DWxH0vMp.js.map → EventTable-CvJ98E8s.js.map} +1 -1
  62. package/dashboard/dist/assets/EventTopicPill-CB_rIGlL.js +2 -0
  63. package/dashboard/dist/assets/{EventTopicPill-BUxxvpNg.js.map → EventTopicPill-CB_rIGlL.js.map} +1 -1
  64. package/dashboard/dist/assets/FilterBar-Bdssa-Xn.js +2 -0
  65. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-Bdssa-Xn.js.map} +1 -1
  66. package/dashboard/dist/assets/HomePage-BuZkdXZt.js +2 -0
  67. package/dashboard/dist/assets/{HomePage-Tlu1j8fK.js.map → HomePage-BuZkdXZt.js.map} +1 -1
  68. package/dashboard/dist/assets/ListToolbar-jy8NL6ll.js +2 -0
  69. package/dashboard/dist/assets/{ListToolbar-DuON-br0.js.map → ListToolbar-jy8NL6ll.js.map} +1 -1
  70. package/dashboard/dist/assets/McpOverview-xkaKuHbX.js +2 -0
  71. package/dashboard/dist/assets/{McpOverview-byott48x.js.map → McpOverview-xkaKuHbX.js.map} +1 -1
  72. package/dashboard/dist/assets/McpQueryDetailPage-D5ICn6cR.js +5 -0
  73. package/dashboard/dist/assets/{McpQueryDetailPage-ieZPpcPn.js.map → McpQueryDetailPage-D5ICn6cR.js.map} +1 -1
  74. package/dashboard/dist/assets/McpQueryPage-C46fzfm5.js +2 -0
  75. package/dashboard/dist/assets/{McpQueryPage-BOO0ACYO.js.map → McpQueryPage-C46fzfm5.js.map} +1 -1
  76. package/dashboard/dist/assets/McpRunDetailPage-Znsl4Yc-.js +2 -0
  77. package/dashboard/dist/assets/{McpRunDetailPage-Di8s7-u9.js.map → McpRunDetailPage-Znsl4Yc-.js.map} +1 -1
  78. package/dashboard/dist/assets/McpRunsPage-DT-armx5.js +2 -0
  79. package/dashboard/dist/assets/{McpRunsPage-DdUVqUFi.js.map → McpRunsPage-DT-armx5.js.map} +1 -1
  80. package/dashboard/dist/assets/Modal-C6k6_5KB.js +2 -0
  81. package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-C6k6_5KB.js.map} +1 -1
  82. package/dashboard/dist/assets/OperatorDashboard-e5N3_dVl.js +2 -0
  83. package/dashboard/dist/assets/{OperatorDashboard-oGmDbNYv.js.map → OperatorDashboard-e5N3_dVl.js.map} +1 -1
  84. package/dashboard/dist/assets/PageHeader-COcgWWf-.js +2 -0
  85. package/dashboard/dist/assets/{PageHeader-DLjHNYHX.js.map → PageHeader-COcgWWf-.js.map} +1 -1
  86. package/dashboard/dist/assets/PageHeaderWithStats-C0PCY3aJ.js +2 -0
  87. package/dashboard/dist/assets/{PageHeaderWithStats-Oljg3n4j.js.map → PageHeaderWithStats-C0PCY3aJ.js.map} +1 -1
  88. package/dashboard/dist/assets/PriorityBadge-BQCsYMpM.js +2 -0
  89. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-BQCsYMpM.js.map} +1 -1
  90. package/dashboard/dist/assets/ProcessDetailPage-C03LOgI0.js +2 -0
  91. package/dashboard/dist/assets/{ProcessDetailPage-Da-miMYZ.js.map → ProcessDetailPage-C03LOgI0.js.map} +1 -1
  92. package/dashboard/dist/assets/ProcessesListPage-iyPsmlhm.js +2 -0
  93. package/dashboard/dist/assets/{ProcessesListPage-CW-2yFw_.js.map → ProcessesListPage-iyPsmlhm.js.map} +1 -1
  94. package/dashboard/dist/assets/RolePill-CHwys1f9.js +2 -0
  95. package/dashboard/dist/assets/{RolePill-Bp10-WfX.js.map → RolePill-CHwys1f9.js.map} +1 -1
  96. package/dashboard/dist/assets/RolesPage-Bmc3XaUk.js +2 -0
  97. package/dashboard/dist/assets/{RolesPage-Bg_hEu9H.js.map → RolesPage-Bmc3XaUk.js.map} +1 -1
  98. package/dashboard/dist/assets/RowActions-Bs4PF-Gd.js +2 -0
  99. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Bs4PF-Gd.js.map} +1 -1
  100. package/dashboard/dist/assets/RunAsSelector-DXzAr2WW.js +2 -0
  101. package/dashboard/dist/assets/{RunAsSelector-hYP59xHH.js.map → RunAsSelector-DXzAr2WW.js.map} +1 -1
  102. package/dashboard/dist/assets/ServerName-BIdLC1Ay.js +2 -0
  103. package/dashboard/dist/assets/{ServerName-C9lUCFYb.js.map → ServerName-BIdLC1Ay.js.map} +1 -1
  104. package/dashboard/dist/assets/StatCard-OKzRSSx4.js +2 -0
  105. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-OKzRSSx4.js.map} +1 -1
  106. package/dashboard/dist/assets/StatusBadge-CQlF46RR.js +2 -0
  107. package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-CQlF46RR.js.map} +1 -1
  108. package/dashboard/dist/assets/StepIndicator-CP7eycjI.js +2 -0
  109. package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-CP7eycjI.js.map} +1 -1
  110. package/dashboard/dist/assets/StickyPagination-CGk8VAKt.js +2 -0
  111. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CGk8VAKt.js.map} +1 -1
  112. package/dashboard/dist/assets/SwimlaneTimeline-MEUPc3yJ.js +2 -0
  113. package/dashboard/dist/assets/{SwimlaneTimeline-2JHwAM2f.js.map → SwimlaneTimeline-MEUPc3yJ.js.map} +1 -1
  114. package/dashboard/dist/assets/TagInput-BGxXKiWD.js +2 -0
  115. package/dashboard/dist/assets/{TagInput-Dkljw_WI.js.map → TagInput-BGxXKiWD.js.map} +1 -1
  116. package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js +2 -0
  117. package/dashboard/dist/assets/TaskDetailPage-pN5BXzYA.js.map +1 -0
  118. package/dashboard/dist/assets/TaskQueuePill-bw8ieKsf.js +2 -0
  119. package/dashboard/dist/assets/{TaskQueuePill-DPwm25Cc.js.map → TaskQueuePill-bw8ieKsf.js.map} +1 -1
  120. package/dashboard/dist/assets/TasksListPage-D1INzcrA.js +2 -0
  121. package/dashboard/dist/assets/{TasksListPage-kCH4r-70.js.map → TasksListPage-D1INzcrA.js.map} +1 -1
  122. package/dashboard/dist/assets/TimeAgo-CywLVIBA.js +2 -0
  123. package/dashboard/dist/assets/{TimeAgo-RPbch7Te.js.map → TimeAgo-CywLVIBA.js.map} +1 -1
  124. package/dashboard/dist/assets/TimestampCell-B4Pc6f3A.js +2 -0
  125. package/dashboard/dist/assets/{TimestampCell-Dgpl-lKv.js.map → TimestampCell-B4Pc6f3A.js.map} +1 -1
  126. package/dashboard/dist/assets/ToolPill-DdLN3JOT.js +2 -0
  127. package/dashboard/dist/assets/{ToolPill-D_DIWFJ5.js.map → ToolPill-DdLN3JOT.js.map} +1 -1
  128. package/dashboard/dist/assets/ToolTestPanel-DusbUka5.js +2 -0
  129. package/dashboard/dist/assets/{ToolTestPanel-D1TWdZQi.js.map → ToolTestPanel-DusbUka5.js.map} +1 -1
  130. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js +9 -0
  131. package/dashboard/dist/assets/TopicDetailPage-DadwM52Y.js.map +1 -0
  132. package/dashboard/dist/assets/TopicsPage-DbtrnQON.js +2 -0
  133. package/dashboard/dist/assets/TopicsPage-DbtrnQON.js.map +1 -0
  134. package/dashboard/dist/assets/UserName-CLbusknU.js +2 -0
  135. package/dashboard/dist/assets/{UserName-BXZGXJsU.js.map → UserName-CLbusknU.js.map} +1 -1
  136. package/dashboard/dist/assets/WorkflowExecutionPage-C61R-3Gg.js +2 -0
  137. package/dashboard/dist/assets/{WorkflowExecutionPage-DWlNYb2M.js.map → WorkflowExecutionPage-C61R-3Gg.js.map} +1 -1
  138. package/dashboard/dist/assets/WorkflowPill-7vt2F6wR.js +2 -0
  139. package/dashboard/dist/assets/{WorkflowPill-BbgVTGgI.js.map → WorkflowPill-7vt2F6wR.js.map} +1 -1
  140. package/dashboard/dist/assets/WorkflowsDashboard-BWiUNvyl.js +2 -0
  141. package/dashboard/dist/assets/{WorkflowsDashboard-Dgq8RcD6.js.map → WorkflowsDashboard-BWiUNvyl.js.map} +1 -1
  142. package/dashboard/dist/assets/WorkflowsOverview-DA2ZOs7D.js +2 -0
  143. package/dashboard/dist/assets/{WorkflowsOverview-DnInrUPO.js.map → WorkflowsOverview-DA2ZOs7D.js.map} +1 -1
  144. package/dashboard/dist/assets/YamlWorkflowsPage-CLebf2eL.js +2 -0
  145. package/dashboard/dist/assets/{YamlWorkflowsPage-z1Z9J-mc.js.map → YamlWorkflowsPage-CLebf2eL.js.map} +1 -1
  146. package/dashboard/dist/assets/{agents-C9RLPt1z.js → agents-Dga6NU7U.js} +2 -2
  147. package/dashboard/dist/assets/{agents-C9RLPt1z.js.map → agents-Dga6NU7U.js.map} +1 -1
  148. package/dashboard/dist/assets/{bots-zyUDnQhH.js → bots-CtU4i4OQ.js} +2 -2
  149. package/dashboard/dist/assets/{bots-zyUDnQhH.js.map → bots-CtU4i4OQ.js.map} +1 -1
  150. package/dashboard/dist/assets/{controlplane-v-5KV6pl.js → controlplane-BVoALhbL.js} +2 -2
  151. package/dashboard/dist/assets/{controlplane-v-5KV6pl.js.map → controlplane-BVoALhbL.js.map} +1 -1
  152. package/dashboard/dist/assets/escalation-_N5GfuIi.js +2 -0
  153. package/dashboard/dist/assets/{escalation-BseAikei.js.map → escalation-_N5GfuIi.js.map} +1 -1
  154. package/dashboard/dist/assets/escalation-columns-CoTmTpHp.js +2 -0
  155. package/dashboard/dist/assets/{escalation-columns-Cs2CkkEs.js.map → escalation-columns-CoTmTpHp.js.map} +1 -1
  156. package/dashboard/dist/assets/helpers-Dz2U3Ctb.js +2 -0
  157. package/dashboard/dist/assets/{helpers-DVICI_VA.js.map → helpers-Dz2U3Ctb.js.map} +1 -1
  158. package/dashboard/dist/assets/index-6Kd78p_v.js +2 -0
  159. package/dashboard/dist/assets/{index-BzBZo8Sn.js.map → index-6Kd78p_v.js.map} +1 -1
  160. package/dashboard/dist/assets/index-B9ealjkt.js +6 -0
  161. package/dashboard/dist/assets/{index-CPpNn3z2.js.map → index-B9ealjkt.js.map} +1 -1
  162. package/dashboard/dist/assets/index-BIUHY2Jz.css +1 -0
  163. package/dashboard/dist/assets/index-BWHDW_CF.js +2 -0
  164. package/dashboard/dist/assets/{index-XCEX7Zof.js.map → index-BWHDW_CF.js.map} +1 -1
  165. package/dashboard/dist/assets/index-BYwPVJv0.js +15 -0
  166. package/dashboard/dist/assets/{index-M17tP_HX.js.map → index-BYwPVJv0.js.map} +1 -1
  167. package/dashboard/dist/assets/index-CCOSf1PY.js +281 -0
  168. package/dashboard/dist/assets/index-CCOSf1PY.js.map +1 -0
  169. package/dashboard/dist/assets/index-CS61sh5q.js +2 -0
  170. package/dashboard/dist/assets/{index-BP76o_S8.js.map → index-CS61sh5q.js.map} +1 -1
  171. package/dashboard/dist/assets/index-CtbG3UN-.js +5 -0
  172. package/dashboard/dist/assets/{index-DVFm5329.js.map → index-CtbG3UN-.js.map} +1 -1
  173. package/dashboard/dist/assets/index-DWUunWxh.js +2 -0
  174. package/dashboard/dist/assets/{index-DyqdoZPY.js.map → index-DWUunWxh.js.map} +1 -1
  175. package/dashboard/dist/assets/index-D_H_Prht.js +2 -0
  176. package/dashboard/dist/assets/{index-C0TSBQw8.js.map → index-D_H_Prht.js.map} +1 -1
  177. package/dashboard/dist/assets/index-Dpjguclc.js +2 -0
  178. package/dashboard/dist/assets/{index-DDFK1A8T.js.map → index-Dpjguclc.js.map} +1 -1
  179. package/dashboard/dist/assets/index-QicYdUsl.js +2 -0
  180. package/dashboard/dist/assets/{index-tK8lfgAj.js.map → index-QicYdUsl.js.map} +1 -1
  181. package/dashboard/dist/assets/index-dM-OgCY3.js +2 -0
  182. package/dashboard/dist/assets/{index-D2tDlpuv.js.map → index-dM-OgCY3.js.map} +1 -1
  183. package/dashboard/dist/assets/{knowledge-BhK8xuod.js → knowledge-DJlebU82.js} +2 -2
  184. package/dashboard/dist/assets/{knowledge-BhK8xuod.js.map → knowledge-DJlebU82.js.map} +1 -1
  185. package/dashboard/dist/assets/{mcp-CWFliwjc.js → mcp-CsLJ5SRm.js} +2 -2
  186. package/dashboard/dist/assets/{mcp-CWFliwjc.js.map → mcp-CsLJ5SRm.js.map} +1 -1
  187. package/dashboard/dist/assets/{mcp-query-Dm7_m5Fi.js → mcp-query-WNK1ItRV.js} +2 -2
  188. package/dashboard/dist/assets/{mcp-query-Dm7_m5Fi.js.map → mcp-query-WNK1ItRV.js.map} +1 -1
  189. package/dashboard/dist/assets/{mcp-runs-aBDudwEi.js → mcp-runs-DtTTsuPH.js} +2 -2
  190. package/dashboard/dist/assets/{mcp-runs-aBDudwEi.js.map → mcp-runs-DtTTsuPH.js.map} +1 -1
  191. package/dashboard/dist/assets/namespaces-iRejH3_A.js +2 -0
  192. package/dashboard/dist/assets/{namespaces-C45c4uoO.js.map → namespaces-iRejH3_A.js.map} +1 -1
  193. package/dashboard/dist/assets/{roles-BMAzzeHR.js → roles-3Jm5KtKc.js} +2 -2
  194. package/dashboard/dist/assets/{roles-BMAzzeHR.js.map → roles-3Jm5KtKc.js.map} +1 -1
  195. package/dashboard/dist/assets/settings-DmN2I-c6.js +2 -0
  196. package/dashboard/dist/assets/{settings-D0v7RI3o.js.map → settings-DmN2I-c6.js.map} +1 -1
  197. package/dashboard/dist/assets/{tasks-DwEUQ6my.js → tasks-Cc-QoITQ.js} +2 -2
  198. package/dashboard/dist/assets/{tasks-DwEUQ6my.js.map → tasks-Cc-QoITQ.js.map} +1 -1
  199. package/dashboard/dist/assets/topics-p8anbgi0.js +2 -0
  200. package/dashboard/dist/assets/topics-p8anbgi0.js.map +1 -0
  201. package/dashboard/dist/assets/{useEventHooks-BccPxFR6.js → useEventHooks-VaJ52jMm.js} +2 -2
  202. package/dashboard/dist/assets/{useEventHooks-BccPxFR6.js.map → useEventHooks-VaJ52jMm.js.map} +1 -1
  203. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
  204. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
  205. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
  206. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
  207. package/dashboard/dist/assets/{useYamlActivityEvents-BBioXSKA.js → useYamlActivityEvents-BU4Uhksl.js} +2 -2
  208. package/dashboard/dist/assets/{useYamlActivityEvents-BBioXSKA.js.map → useYamlActivityEvents-BU4Uhksl.js.map} +1 -1
  209. package/dashboard/dist/assets/{users-CCHT00of.js → users-oXOlnold.js} +2 -2
  210. package/dashboard/dist/assets/{users-CCHT00of.js.map → users-oXOlnold.js.map} +1 -1
  211. package/dashboard/dist/assets/{vendor-icons-E6836lXZ.js → vendor-icons-CBOM6Es0.js} +100 -95
  212. package/dashboard/dist/assets/vendor-icons-CBOM6Es0.js.map +1 -0
  213. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  214. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  215. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  216. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  217. package/dashboard/dist/assets/{workflows-DNZf6Pmq.js → workflows-Yq7cK-vR.js} +2 -2
  218. package/dashboard/dist/assets/{workflows-DNZf6Pmq.js.map → workflows-Yq7cK-vR.js.map} +1 -1
  219. package/dashboard/dist/assets/{yaml-workflows-BKZdGciI.js → yaml-workflows-Ch53yD43.js} +2 -2
  220. package/dashboard/dist/assets/{yaml-workflows-BKZdGciI.js.map → yaml-workflows-Ch53yD43.js.map} +1 -1
  221. package/dashboard/dist/index.html +5 -5
  222. package/docs/agents.md +6 -0
  223. package/docs/api/http/topics.md +164 -0
  224. package/docs/api/sdk/topics.md +204 -0
  225. package/docs/dashboard.md +22 -0
  226. package/docs/events.md +7 -0
  227. package/docs/sdk.md +15 -0
  228. package/docs/topics.md +154 -0
  229. package/package.json +2 -2
  230. package/dashboard/dist/assets/AdminDashboard-Bb6zouF5.js +0 -2
  231. package/dashboard/dist/assets/AgentConfigPage-DqHEK73E.js +0 -13
  232. package/dashboard/dist/assets/AgentConfigPage-DqHEK73E.js.map +0 -1
  233. package/dashboard/dist/assets/AgentDetailPage-WwA573u9.js +0 -4
  234. package/dashboard/dist/assets/AgentsPage-BZkZ_hXN.js +0 -2
  235. package/dashboard/dist/assets/AvailableEscalationsPage-C-Df3ZsZ.js +0 -2
  236. package/dashboard/dist/assets/BotPicker-CwfVVWxh.js +0 -2
  237. package/dashboard/dist/assets/CapabilitiesPage-DJEQ_5dV.js +0 -2
  238. package/dashboard/dist/assets/CollapsibleSection-DaFQGU6S.js +0 -2
  239. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
  240. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
  241. package/dashboard/dist/assets/CredentialsPage-D-tkqdhu.js +0 -2
  242. package/dashboard/dist/assets/CronLabel-C6iCjsXd.js +0 -2
  243. package/dashboard/dist/assets/CustomDurationPicker--wCtBkmT.js +0 -2
  244. package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
  245. package/dashboard/dist/assets/DropZone-2mGyDo1P.js +0 -2
  246. package/dashboard/dist/assets/ElapsedCell-DKoH0bqR.js +0 -2
  247. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  248. package/dashboard/dist/assets/EscalationsOverview-C6A4Q9Ne.js +0 -2
  249. package/dashboard/dist/assets/EventTable-DWxH0vMp.js +0 -2
  250. package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js +0 -2
  251. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  252. package/dashboard/dist/assets/HomePage-Tlu1j8fK.js +0 -2
  253. package/dashboard/dist/assets/ListToolbar-DuON-br0.js +0 -2
  254. package/dashboard/dist/assets/McpOverview-byott48x.js +0 -2
  255. package/dashboard/dist/assets/McpQueryDetailPage-ieZPpcPn.js +0 -5
  256. package/dashboard/dist/assets/McpQueryPage-BOO0ACYO.js +0 -2
  257. package/dashboard/dist/assets/McpRunDetailPage-Di8s7-u9.js +0 -2
  258. package/dashboard/dist/assets/McpRunsPage-DdUVqUFi.js +0 -2
  259. package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
  260. package/dashboard/dist/assets/OperatorDashboard-oGmDbNYv.js +0 -2
  261. package/dashboard/dist/assets/PageHeader-DLjHNYHX.js +0 -2
  262. package/dashboard/dist/assets/PageHeaderWithStats-Oljg3n4j.js +0 -2
  263. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  264. package/dashboard/dist/assets/ProcessDetailPage-Da-miMYZ.js +0 -2
  265. package/dashboard/dist/assets/ProcessesListPage-CW-2yFw_.js +0 -2
  266. package/dashboard/dist/assets/RolePill-Bp10-WfX.js +0 -2
  267. package/dashboard/dist/assets/RolesPage-Bg_hEu9H.js +0 -2
  268. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  269. package/dashboard/dist/assets/RunAsSelector-hYP59xHH.js +0 -2
  270. package/dashboard/dist/assets/ServerName-C9lUCFYb.js +0 -2
  271. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  272. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
  273. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
  274. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  275. package/dashboard/dist/assets/SwimlaneTimeline-2JHwAM2f.js +0 -2
  276. package/dashboard/dist/assets/TagInput-Dkljw_WI.js +0 -2
  277. package/dashboard/dist/assets/TaskDetailPage--9FEVeTB.js +0 -2
  278. package/dashboard/dist/assets/TaskDetailPage--9FEVeTB.js.map +0 -1
  279. package/dashboard/dist/assets/TaskQueuePill-DPwm25Cc.js +0 -2
  280. package/dashboard/dist/assets/TasksListPage-kCH4r-70.js +0 -2
  281. package/dashboard/dist/assets/TimeAgo-RPbch7Te.js +0 -2
  282. package/dashboard/dist/assets/TimestampCell-Dgpl-lKv.js +0 -2
  283. package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js +0 -2
  284. package/dashboard/dist/assets/ToolTestPanel-D1TWdZQi.js +0 -2
  285. package/dashboard/dist/assets/UserName-BXZGXJsU.js +0 -2
  286. package/dashboard/dist/assets/WorkflowExecutionPage-DWlNYb2M.js +0 -2
  287. package/dashboard/dist/assets/WorkflowPill-BbgVTGgI.js +0 -2
  288. package/dashboard/dist/assets/WorkflowsDashboard-Dgq8RcD6.js +0 -2
  289. package/dashboard/dist/assets/WorkflowsOverview-DnInrUPO.js +0 -2
  290. package/dashboard/dist/assets/YamlWorkflowsPage-z1Z9J-mc.js +0 -2
  291. package/dashboard/dist/assets/escalation-BseAikei.js +0 -2
  292. package/dashboard/dist/assets/escalation-columns-Cs2CkkEs.js +0 -2
  293. package/dashboard/dist/assets/helpers-DVICI_VA.js +0 -2
  294. package/dashboard/dist/assets/index-BMIU7Im5.js +0 -63
  295. package/dashboard/dist/assets/index-BMIU7Im5.js.map +0 -1
  296. package/dashboard/dist/assets/index-BP76o_S8.js +0 -2
  297. package/dashboard/dist/assets/index-BciXgS35.css +0 -1
  298. package/dashboard/dist/assets/index-BzBZo8Sn.js +0 -2
  299. package/dashboard/dist/assets/index-C0TSBQw8.js +0 -2
  300. package/dashboard/dist/assets/index-CPpNn3z2.js +0 -6
  301. package/dashboard/dist/assets/index-D2tDlpuv.js +0 -2
  302. package/dashboard/dist/assets/index-DDFK1A8T.js +0 -2
  303. package/dashboard/dist/assets/index-DVFm5329.js +0 -5
  304. package/dashboard/dist/assets/index-DyqdoZPY.js +0 -2
  305. package/dashboard/dist/assets/index-M17tP_HX.js +0 -15
  306. package/dashboard/dist/assets/index-XCEX7Zof.js +0 -2
  307. package/dashboard/dist/assets/index-tK8lfgAj.js +0 -2
  308. package/dashboard/dist/assets/namespaces-C45c4uoO.js +0 -2
  309. package/dashboard/dist/assets/settings-D0v7RI3o.js +0 -2
  310. package/dashboard/dist/assets/vendor-icons-E6836lXZ.js.map +0 -1
  311. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  312. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  313. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
  314. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowsDashboard-Dgq8RcD6.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n registered: registeredFilter,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Durable Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:durable-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/jobs?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.search ? `&search=${filters.search}` : ''}${filters.status ? `&status=${filters.status}` : ''}${sort.sort_by ? `&sort_by=${sort.sort_by}&order=${sort.order}` : ''}`}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowsDashboard-BWiUNvyl.js","sources":["../../src/pages/workflows/WorkflowsDashboard.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter, Settings } from 'lucide-react';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { useJobs, useWorkflowConfigs, useDiscoveredWorkflows } from '../../api/workflows';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob, WorkflowTier } from '../../api/types';\n\nexport type ExecutionsTier = 'all' | 'certified' | 'durable';\n\nconst jobStatusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n isSuperAdmin: boolean,\n navigate: (path: string) => void,\n tierMap: Map<string, WorkflowTier>,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const dotClass = STATUS_DOT[jobStatusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${dotClass}${pulseClass}`} title={row.status} />\n <div className=\"min-w-0\">\n <span className=\"font-mono text-xs text-text-primary truncate block\">\n {row.workflow_id}\n </span>\n <div className=\"mt-0.5\">\n <WorkflowPill type={row.entity} variant={tierMap.get(row.entity) ?? 'durable'} size=\"xs\" />\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'updated_at',\n label: 'Updated',\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\n sortable: true,\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n {isSuperAdmin && (\n <RowAction\n icon={Settings}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.entity)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function WorkflowsDashboard({ tier: initialTier = 'all' }: { tier?: ExecutionsTier }) {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const { isSuperAdmin } = useAuth();\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', tier: initialTier },\n });\n\n const activeTier = (filters.tier || 'all') as ExecutionsTier;\n\n // Map tier to server-side registered filter\n const registeredFilter = activeTier === 'certified' ? 'true'\n : activeTier === 'durable' ? 'false'\n : undefined;\n\n const { data: configs } = useWorkflowConfigs();\n const { data: discoveredData } = useDiscoveredWorkflows();\n\n const tierMap = useMemo(() => {\n const map = new Map<string, WorkflowTier>();\n for (const dw of discoveredData ?? []) {\n map.set(dw.workflow_type, dw.tier ?? 'durable');\n }\n return map;\n }, [discoveredData]);\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n isSuperAdmin,\n navigate,\n tierMap,\n );\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: jobsData, isLoading, refetch, isFetching } = useJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n registered: registeredFilter,\n });\n\n const total = jobsData?.total ?? 0;\n const jobs = jobsData?.jobs ?? [];\n\n const entities = useMemo(() => {\n return [...new Set((configs ?? []).map((c) => c.workflow_type))].sort();\n }, [configs]);\n\n const pageTitle = 'Durable Executions';\n\n const emptyMessage = activeTier === 'certified'\n ? 'No certified workflow executions found'\n : activeTier === 'durable'\n ? 'No durable workflow executions found'\n : 'No workflow executions found';\n\n return (\n <div>\n <PageHeader title={pageTitle} docsHash=\"#docs:dashboard.md:durable-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/jobs?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.search ? `&search=${filters.search}` : ''}${filters.status ? `&status=${filters.status}` : ''}${sort.sort_by ? `&sort_by=${sort.sort_by}&order=${sort.order}` : ''}`}\n />\n }>\n <input\n type=\"text\"\n placeholder=\"Search workflow ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Type\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities.map((e) => ({ value: e, label: e }))}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier === 'all' ? '' : filters.tier}\n onChange={(v) => setFilter('tier', v || 'all')}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/workflows/executions/${row.workflow_id}`)}\n isLoading={isLoading}\n emptyMessage={emptyMessage}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["jobStatusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","isSuperAdmin","navigate","tierMap","row","dotClass","pulseClass","jsxDEV","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","Settings","WorkflowsDashboard","initialTier","useWorkflowListEvents","useNavigate","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","activeTier","registeredFilter","configs","useWorkflowConfigs","discoveredData","useDiscoveredWorkflows","useMemo","map","dw","columns","entity","status","searchInput","setSearchInput","useState","useEffect","timer","jobsData","isLoading","refetch","isFetching","useJobs","total","jobs","entities","c","pageTitle","emptyMessage","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-CCOSf1PY.js";import{a as u}from"./vendor-query-DLp59M9_.js";import{b as D,u as j}from"./workflows-Yq7cK-vR.js";import{b as W}from"./useEventHooks-VaJ52jMm.js";import{P as E}from"./PageHeader-COcgWWf-.js";import{S as p}from"./StatCard-OKzRSSx4.js";import{c as O}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-CBOM6Es0.js";const k=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function V(o){return o<1e3?`${Math.round(o)}ms`:o<6e4?`${(o/1e3).toFixed(1)}s`:o<36e5?`${(o/6e4).toFixed(1)}m`:`${(o/36e5).toFixed(1)}h`}function w({value:o,colorClass:n,onClick:b}){return o===0?e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:49,columnNumber:12},this):e.jsxDEV("button",{onClick:b,className:`${n} hover:underline tabular-nums font-medium`,children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:52,columnNumber:5},this)}function L(){W();const o=O(),[n,b]=u.useState("24h"),{data:m}=D({limit:500}),{data:h}=j(),N=u.useMemo(()=>{const s=k.find(i=>i.label===n);return Date.now()-s.ms},[n]),l=u.useMemo(()=>((m==null?void 0:m.jobs)??[]).filter(s=>new Date(s.created_at).getTime()>=N),[m==null?void 0:m.jobs,N]),v=u.useMemo(()=>{const s=new Map;for(const t of l){const r=s.get(t.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(r.total++,t.status==="running"&&r.running++,t.status==="completed"){r.completed++;const f=new Date(t.updated_at).getTime()-new Date(t.created_at).getTime();f>0&&r.durations.push(f)}t.status==="failed"&&r.failed++,s.set(t.entity,r)}const i=[];for(const[t,r]of s)i.push({type:t,...r,avgDuration:r.durations.length>0?r.durations.reduce((f,g)=>f+g,0)/r.durations.length:null});return i.sort((t,r)=>r.total-t.total)},[l]),c=u.useMemo(()=>({total:l.length,running:l.filter(s=>s.status==="running").length,completed:l.filter(s=>s.status==="completed").length,failed:l.filter(s=>s.status==="failed").length}),[l]),x=(h==null?void 0:h.length)??0,a=(s,i)=>{const t=new URLSearchParams;s&&t.set("entity",s),i&&t.set("status",i);const r=t.toString();o(`/workflows/executions${r?`?${r}`:""}`)},d="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(E,{title:"Workflows",actions:e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:[x," certified type",x!==1?"s":""]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:134,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:131,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-1 mb-6",children:k.map(s=>e.jsxDEV("button",{onClick:()=>b(s.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${n===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/workflows/WorkflowsOverview.tsx",lineNumber:143,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:141,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsxDEV(p,{label:"Total",value:c.total,onClick:()=>a()},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:159,columnNumber:9},this),e.jsxDEV(p,{label:"Running",value:c.running,colorClass:"text-status-active",onClick:()=>a(void 0,"running")},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:160,columnNumber:9},this),e.jsxDEV(p,{label:"Completed",value:c.completed,colorClass:"text-status-success",onClick:()=>a(void 0,"completed")},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:161,columnNumber:9},this),e.jsxDEV(p,{label:"Failed",value:c.failed,colorClass:"text-status-error",onClick:()=>a(void 0,"failed")},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:162,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:158,columnNumber:7},this),v.length>0&&e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:d,children:"Type"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:170,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Total"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:171,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Running"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:172,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-24`,children:"Completed"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:173,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-20`,children:"Failed"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:174,columnNumber:15},this),e.jsxDEV("th",{className:`${d} text-right w-28`,children:"Avg Duration"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:175,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:169,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:168,columnNumber:11},this),e.jsxDEV("tbody",{children:v.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:()=>a(s.type),className:"hover:text-accent hover:underline",children:s.type},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:182,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:181,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(w,{value:s.total,colorClass:"text-text-secondary",onClick:()=>a(s.type)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:190,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:189,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(w,{value:s.running,colorClass:"text-status-active",onClick:()=>a(s.type,"running")},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:193,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:192,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(w,{value:s.completed,colorClass:"text-status-success",onClick:()=>a(s.type,"completed")},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:196,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:195,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(w,{value:s.failed,colorClass:"text-status-error",onClick:()=>a(s.type,"failed")},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:199,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:198,columnNumber:17},this),e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:s.avgDuration!==null?V(s.avgDuration):"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:201,columnNumber:17},this)]},s.type,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:180,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:178,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:167,columnNumber:9},this),v.length===0&&e.jsxDEV("div",{className:"py-16 text-center",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:["No workflow activity in the last ",n]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:212,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:211,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/WorkflowsOverview.tsx",lineNumber:130,columnNumber:5},this)}export{L as WorkflowsOverview};
2
+ //# sourceMappingURL=WorkflowsOverview-DA2ZOs7D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowsOverview-DnInrUPO.js","sources":["../../src/pages/workflows/WorkflowsOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\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 TypeStats {\n type: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\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 WorkflowsOverview() {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n\n const { data: allJobs } = useJobs({ limit: 500 });\n const { data: configs } = useWorkflowConfigs();\n\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const jobs = useMemo(\n () => (allJobs?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allJobs?.jobs, cutoff],\n );\n\n const byType = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of jobs) {\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: TypeStats[] = [];\n for (const [type, stats] of map) {\n result.push({\n type,\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 }, [jobs]);\n\n // Totals\n const totals = useMemo(() => ({\n total: jobs.length,\n running: jobs.filter((j) => j.status === 'running').length,\n completed: jobs.filter((j) => j.status === 'completed').length,\n failed: jobs.filter((j) => j.status === 'failed').length,\n }), [jobs]);\n\n const registered = configs?.length ?? 0;\n\n const goToList = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/workflows/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\n title=\"Workflows\"\n actions={\n <span className=\"text-xs text-text-tertiary\">\n {registered} certified type{registered !== 1 ? 's' : ''}\n </span>\n }\n />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\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\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total\" value={totals.total} onClick={() => goToList()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToList(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToList(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToList(undefined, 'failed')} />\n </div>\n\n {/* By-type table */}\n {byType.length > 0 && (\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</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 {byType.map((row) => (\n <tr key={row.type} 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={() => goToList(row.type)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToList(row.type)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToList(row.type, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToList(row.type, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToList(row.type, '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 {byType.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No workflow activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","WorkflowsOverview","useWorkflowListEvents","navigate","useNavigate","duration","setDuration","useState","allJobs","useJobs","configs","useWorkflowConfigs","cutoff","useMemo","d","jobs","j","byType","map","entry","dur","result","type","stats","a","b","totals","registered","goToList","entity","status","params","qs","thCls","PageHeader","jsxs","StatCard","row"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowsOverview-DA2ZOs7D.js","sources":["../../src/pages/workflows/WorkflowsOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useJobs, useWorkflowConfigs } from '../../api/workflows';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\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 TypeStats {\n type: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\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 WorkflowsOverview() {\n useWorkflowListEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n\n const { data: allJobs } = useJobs({ limit: 500 });\n const { data: configs } = useWorkflowConfigs();\n\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const jobs = useMemo(\n () => (allJobs?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allJobs?.jobs, cutoff],\n );\n\n const byType = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of jobs) {\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: TypeStats[] = [];\n for (const [type, stats] of map) {\n result.push({\n type,\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 }, [jobs]);\n\n // Totals\n const totals = useMemo(() => ({\n total: jobs.length,\n running: jobs.filter((j) => j.status === 'running').length,\n completed: jobs.filter((j) => j.status === 'completed').length,\n failed: jobs.filter((j) => j.status === 'failed').length,\n }), [jobs]);\n\n const registered = configs?.length ?? 0;\n\n const goToList = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/workflows/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\n title=\"Workflows\"\n actions={\n <span className=\"text-xs text-text-tertiary\">\n {registered} certified type{registered !== 1 ? 's' : ''}\n </span>\n }\n />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\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\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total\" value={totals.total} onClick={() => goToList()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToList(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToList(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToList(undefined, 'failed')} />\n </div>\n\n {/* By-type table */}\n {byType.length > 0 && (\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</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 {byType.map((row) => (\n <tr key={row.type} 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={() => goToList(row.type)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToList(row.type)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToList(row.type, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToList(row.type, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToList(row.type, '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 {byType.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No workflow activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsxDEV","WorkflowsOverview","useWorkflowListEvents","navigate","useNavigate","duration","setDuration","useState","allJobs","useJobs","configs","useWorkflowConfigs","cutoff","useMemo","d","jobs","j","byType","map","entry","dur","result","type","stats","a","b","totals","registered","goToList","entity","status","params","qs","thCls","PageHeader","StatCard","row"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e,S as D}from"./index-CCOSf1PY.js";import{a as u}from"./vendor-query-DLp59M9_.js";import{l as J,n as A,o as L,u as R}from"./yaml-workflows-Ch53yD43.js";import{a as z,d as $}from"./useYamlActivityEvents-BU4Uhksl.js";import{u as F}from"./useFilterParams-CGRYFw_A.js";import{u as q}from"./useExpandedRows-Cg9iq6Vy.js";import{P}from"./PageHeader-COcgWWf-.js";import{F as B,a as H,b as C}from"./FilterBar-Bdssa-Xn.js";import{E as U}from"./EmptyState-BXGvOADa.js";import{R as T}from"./RunAsSelector-DXzAr2WW.js";import{b as _,T as G}from"./ToolPill-DdLN3JOT.js";import{X as Y,a0 as X,a7 as K,P as O,l as Q,f as Z,a1 as ee,W as se}from"./vendor-icons-CBOM6Es0.js";import{L as oe,c as re}from"./vendor-react-Co3Y8ikm.js";import{d as W,C as te}from"./helpers-Dz2U3Ctb.js";import{S as M}from"./StatusBadge-CQlF46RR.js";import{S as ae}from"./ServerName-BIdLC1Ay.js";import"./BotPicker-kKBifD1w.js";import"./bots-CtU4i4OQ.js";import"./TimeAgo-CywLVIBA.js";const S={mcp:{border:"border-blue-500",text:"text-blue-500",icon:"MCP"},db:{border:"border-blue-500",text:"text-blue-500",icon:"DB"},llm:{border:"border-violet-500",text:"text-violet-500",icon:"LLM"},transform:{border:"border-emerald-500",text:"text-emerald-500",icon:"Map"}};function le({steps:s,manifest:n,isComplete:r}){const t=n.filter(o=>o.type==="worker"),d=t.length,l=t.map(o=>{const m=s.find(c=>c.activityId===o.activity_id),p=o.tool_source||"mcp",x=S[p]||S.mcp;return{activityId:o.activity_id,title:o.title||o.mcp_tool_name||o.activity_id,toolName:o.mcp_tool_name,colors:x,status:(m==null?void 0:m.status)||"pending",error:m==null?void 0:m.error}});return e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[11px] text-text-secondary mb-3",children:r?`All ${d} steps completed`:`Running step ${l.filter(o=>o.status==="completed").length+1} of ${d}...`},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:41,columnNumber:7},this),e.jsxDEV("div",{className:"space-y-0",children:l.map((o,m)=>{const p=m===l.length-1;return e.jsxDEV("div",{className:"flex items-stretch gap-2",children:[e.jsxDEV("div",{className:"flex flex-col items-center w-4 shrink-0",children:[e.jsxDEV("span",{className:`w-2.5 h-2.5 rounded-full shrink-0 border-2 transition-colors ${o.status==="completed"?"bg-status-success border-status-success":o.status==="running"?`${o.colors.border} bg-transparent animate-pulse`:o.status==="failed"?"bg-status-error border-status-error":"bg-surface-sunken border-surface-border"}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:52,columnNumber:17},this),!p&&e.jsxDEV("span",{className:`w-px flex-1 transition-colors ${o.status==="completed"?"bg-status-success/30":"bg-surface-border"}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:59,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:51,columnNumber:15},this),e.jsxDEV("div",{className:p?"":"pb-3",children:[e.jsxDEV("p",{className:`text-[11px] font-medium ${o.status==="running"?"text-text-primary":o.status==="completed"?"text-text-secondary":o.status==="failed"?"text-status-error":"text-text-tertiary"}`,children:o.title},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:65,columnNumber:17},this),o.toolName&&e.jsxDEV("span",{className:"text-[9px] text-text-tertiary font-mono",children:o.toolName},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:72,columnNumber:19},this),o.error&&e.jsxDEV("p",{className:"text-[9px] text-status-error mt-0.5",children:o.error},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:75,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:64,columnNumber:15},this)]},o.activityId,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:50,columnNumber:13},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:46,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:40,columnNumber:5},this)}function ne({workflow:s,onClose:n}){const r=J(),[t,d]=u.useState(!1),[l,o]=u.useState({}),[m,p]=u.useState(""),[x,c]=u.useState(""),[f,w]=u.useState(""),[N,v]=u.useState(null),[k,g]=u.useState(null),{steps:j,isComplete:a}=z(N);u.useEffect(()=>{v(null),g(null),c(""),r.reset();const b=_(s.input_schema);o(b),p(JSON.stringify(b,null,2)),d(!1)},[s.id]),u.useEffect(()=>{if(a&&N){const b=N,h=setTimeout(()=>{g({jobId:b}),v(null)},800);return()=>clearTimeout(h)}},[a,N]);const i=()=>{if(!t)p(JSON.stringify(l,null,2));else try{o(JSON.parse(m))}catch{}d(!t)},y=async()=>{c(""),g(null);let b;if(t)try{b=JSON.parse(m)}catch{c("Invalid JSON");return}else b={...l};try{const h=await r.mutateAsync({id:s.id,data:b,sync:!1,...f?{execute_as:f}:{}});h.job_id&&v(h.job_id)}catch{}},V=!!N,I=s.app_id||"longtail";return e.jsxDEV("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxDEV("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("p",{className:"text-xs font-medium text-text-primary truncate",children:s.app_id},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:161,columnNumber:11},this),e.jsxDEV("code",{className:"text-[11px] font-mono text-accent truncate block",children:s.graph_topic},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:162,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:160,columnNumber:9},this),e.jsxDEV("button",{onClick:()=>{V||n()},className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsxDEV(Y,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:165,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:164,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:159,columnNumber:7},this),e.jsxDEV("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:V?e.jsxDEV(le,{steps:j,manifest:s.activity_manifest,isComplete:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:172,columnNumber:11},this):k?e.jsxDEV("div",{className:"space-y-3",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("svg",{className:"w-4 h-4 text-status-success",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsxDEV("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:177,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:176,columnNumber:15},this),e.jsxDEV("p",{className:"text-xs font-medium text-status-success",children:"Workflow completed"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:179,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:175,columnNumber:13},this),e.jsxDEV("div",{className:"flex items-center justify-between",children:[e.jsxDEV(oe,{to:`/mcp/executions/${encodeURIComponent(k.jobId)}?namespace=${encodeURIComponent(I)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsxDEV(X,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:186,columnNumber:17},this)," View execution"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:182,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>g(null),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(K,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:192,columnNumber:17},this)," Run again"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:188,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:181,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:174,columnNumber:11},this):e.jsxDEV(e.Fragment,{children:[e.jsxDEV(T,{selected:f,onChange:w},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:198,columnNumber:13},this),s.description&&e.jsxDEV("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:s.description},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:201,columnNumber:15},this),e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-1",children:[e.jsxDEV("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Input"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:207,columnNumber:17},this),e.jsxDEV("button",{onClick:i,className:"text-[10px] text-accent hover:underline",children:t?"Form view":"JSON view"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:208,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:206,columnNumber:15},this),t?e.jsxDEV("textarea",{value:m,onChange:b=>p(b.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:214,columnNumber:17},this):e.jsxDEV("div",{className:"space-y-3 max-h-[300px] overflow-y-auto",children:[Object.entries(l).map(([b,h])=>e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:b},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:225,columnNumber:23},this),typeof h=="boolean"?e.jsxDEV("select",{value:String(h),onChange:E=>o({...l,[b]:E.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsxDEV("option",{value:"true",children:"true"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:232,columnNumber:27},this),e.jsxDEV("option",{value:"false",children:"false"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:233,columnNumber:27},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:227,columnNumber:25},this):typeof h=="object"?e.jsxDEV("textarea",{value:JSON.stringify(h,null,2),onChange:E=>{try{o({...l,[b]:JSON.parse(E.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:236,columnNumber:25},this):e.jsxDEV("input",{type:typeof h=="number"?"number":"text",value:String(h??""),onChange:E=>o({...l,[b]:typeof h=="number"?Number(E.target.value):E.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:242,columnNumber:25},this)]},b,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:224,columnNumber:21},this)),Object.keys(l).length===0&&e.jsxDEV("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:252,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:222,columnNumber:17},this),x&&e.jsxDEV("p",{className:"text-[11px] text-status-error mt-1",children:x},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:256,columnNumber:29},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:205,columnNumber:13},this),r.isError&&e.jsxDEV("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsxDEV("p",{className:"text-[11px] text-status-error",children:r.error instanceof Error?r.error.message:"Invocation failed"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:261,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:260,columnNumber:15},this),e.jsxDEV("button",{onClick:y,disabled:r.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:r.isPending?"Starting...":e.jsxDEV(e.Fragment,{children:[e.jsxDEV(O,{size:12},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:271,columnNumber:61},this)," Run"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:271,columnNumber:59},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:266,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:197,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:170,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/WorkflowTestPanel.tsx",lineNumber:157,columnNumber:5},this)}function ie({cronInput:s,setCronInput:n,setCron:r,hasCronSchedule:t,onSave:d,onClear:l}){return e.jsxDEV(e.Fragment,{children:[e.jsxDEV("div",{children:[e.jsxDEV(D,{className:"mb-3",children:"Schedule"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:24,columnNumber:9},this),e.jsxDEV("div",{className:"flex gap-3 items-start",children:[e.jsxDEV("div",{className:"flex-1",children:[e.jsxDEV("input",{type:"text",value:s,onChange:o=>{n(o.target.value),r.reset()},placeholder:"0 */6 * * *",className:"input-json w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:27,columnNumber:13},this),s.trim()&&W(s.trim())&&e.jsxDEV("p",{className:"text-xs text-text-secondary mt-1.5",children:W(s.trim())},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:38,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:26,columnNumber:11},this),e.jsxDEV("button",{onClick:d,disabled:r.isPending,className:"btn-primary text-xs shrink-0",children:r.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:43,columnNumber:11},this),t&&e.jsxDEV("button",{onClick:l,disabled:r.isPending,className:"btn-ghost text-xs text-status-error shrink-0",children:"Clear"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:51,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:25,columnNumber:9},this),r.isSuccess&&e.jsxDEV("p",{className:"text-[10px] text-status-success mt-2",children:"Schedule updated"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:62,columnNumber:11},this),r.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-2",children:r.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:65,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:23,columnNumber:7},this),e.jsxDEV("div",{className:"bg-surface-sunken rounded-lg p-4",children:[e.jsxDEV(D,{className:"mb-2",children:"Common Patterns"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:71,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-2 sm:grid-cols-3 gap-x-6 gap-y-1.5",children:te.map(([o,m])=>e.jsxDEV("button",{type:"button",onClick:()=>{n(o),r.reset()},className:"flex items-center gap-2 text-left py-0.5 group",children:[e.jsxDEV("code",{className:"font-mono text-[11px] text-accent group-hover:text-accent-hover",children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:83,columnNumber:15},this),e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:m},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:86,columnNumber:15},this)]},o,!0,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:74,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:72,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:70,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/cron/CronScheduleEditor.tsx",lineNumber:22,columnNumber:5},this)}function me({workflow:s,onClose:n}){const r=A(),t=L(),[d,l]=u.useState(""),[o,m]=u.useState(""),[p,x]=u.useState(!1),[c,f]=u.useState({}),[w,N]=u.useState("{}");u.useEffect(()=>{l(s.cron_schedule??""),m(s.execute_as??""),r.reset(),t.reset();const a=s.cron_envelope||{},i=Object.keys(a).length>0?a:_(s.input_schema);f(i),N(JSON.stringify(i,null,2)),x(!1)},[s.id]);const v=()=>{if(!p)N(JSON.stringify(c,null,2));else try{f(JSON.parse(w))}catch{}x(!p)},k=()=>{let a;if(p)try{a=JSON.parse(w)}catch{return}else a={...c};r.mutate({id:s.id,cron_schedule:d.trim(),cron_envelope:Object.keys(a).length>0?a:null,execute_as:o||null})},g=()=>{t.mutate(s.id,{onSuccess:()=>{l("")}})},j={isPending:r.isPending||t.isPending,isSuccess:r.isSuccess||t.isSuccess,error:r.error||t.error,reset:()=>{r.reset(),t.reset()}};return e.jsxDEV("div",{className:"border-l border-surface-border bg-surface-raised flex flex-col h-full",children:[e.jsxDEV("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border shrink-0",children:[e.jsxDEV("div",{className:"min-w-0",children:[e.jsxDEV("p",{className:"text-xs font-medium text-text-primary truncate",children:"Cron Schedule"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:87,columnNumber:11},this),e.jsxDEV("code",{className:"text-[11px] font-mono text-accent truncate block",children:s.graph_topic},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:88,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:86,columnNumber:9},this),e.jsxDEV("button",{onClick:n,className:"p-1 text-text-tertiary hover:text-text-primary shrink-0 ml-2",children:e.jsxDEV(Y,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:91,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:90,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:85,columnNumber:7},this),e.jsxDEV("div",{className:"flex-1 overflow-y-auto px-4 py-3 space-y-4",children:[e.jsxDEV(T,{selected:o,onChange:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:97,columnNumber:9},this),e.jsxDEV(ie,{cronInput:d,setCronInput:l,setCron:j,hasCronSchedule:!!s.cron_schedule,onSave:k,onClear:g},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:99,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-1",children:[e.jsxDEV(D,{children:"Default Input"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:111,columnNumber:13},this),e.jsxDEV("button",{onClick:v,className:"text-[10px] text-accent hover:underline",children:p?"Form view":"JSON view"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:112,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:110,columnNumber:11},this),p?e.jsxDEV("textarea",{value:w,onChange:a=>N(a.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-[11px] text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary resize-y",rows:6,spellCheck:!1},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:118,columnNumber:13},this):e.jsxDEV("div",{className:"space-y-3 max-h-[200px] overflow-y-auto",children:[Object.entries(c).map(([a,i])=>e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:129,columnNumber:19},this),typeof i=="boolean"?e.jsxDEV("select",{value:String(i),onChange:y=>f({...c,[a]:y.target.value==="true"}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",children:[e.jsxDEV("option",{value:"true",children:"true"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:136,columnNumber:23},this),e.jsxDEV("option",{value:"false",children:"false"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:137,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:131,columnNumber:21},this):typeof i=="object"?e.jsxDEV("textarea",{value:JSON.stringify(i,null,2),onChange:y=>{try{f({...c,[a]:JSON.parse(y.target.value)})}catch{}},className:"w-full min-h-[60px] px-3 py-1.5 bg-surface-sunken border border-surface-border rounded-md font-mono text-xs text-text-primary resize-y focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:140,columnNumber:21},this):e.jsxDEV("input",{type:typeof i=="number"?"number":"text",value:String(i??""),onChange:y=>f({...c,[a]:typeof i=="number"?Number(y.target.value):y.target.value}),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-1.5 text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:146,columnNumber:21},this)]},a,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:128,columnNumber:17},this)),Object.keys(c).length===0&&e.jsxDEV("p",{className:"text-[11px] text-text-tertiary italic",children:"No input fields defined"},void 0,!1,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:156,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:126,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:109,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:96,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/test/CronPanel.tsx",lineNumber:83,columnNumber:5},this)}function ce(s){const n=new Map;for(const r of s){const t=n.get(r.app_id)??[];t.push(r),n.set(r.app_id,t)}return[...n.entries()].map(([r,t])=>{var x;const d={active:0,deployed:1,draft:2,archived:3},l=t.reduce((c,f)=>(d[f.status]??9)<(d[c]??9)?f.status:c,t[0].status),o=t.reduce((c,f)=>f.updated_at>c?f.updated_at:c,t[0].updated_at),m=t.reduce((c,f)=>{const w=parseInt(f.app_version||"0",10);return w>c?w:c},0),p=((x=t.find(c=>c.set_id))==null?void 0:x.set_id)||null;return{appId:r,workflows:t,toolCount:t.length,status:l,updatedAt:o,appVersion:String(m),setId:p}})}function de(s,n){if(!n)return!0;const r=n.toLowerCase();return s.appId.toLowerCase().includes(r)?!0:s.workflows.some(t=>{var d,l;return t.graph_topic.toLowerCase().includes(r)||((d=t.name)==null?void 0:d.toLowerCase().includes(r))||((l=t.description)==null?void 0:l.toLowerCase().includes(r))})}function ue(s,n){if(!n)return s;const r=n.toLowerCase();return s.filter(t=>{var d,l;return t.graph_topic.toLowerCase().includes(r)||((d=t.name)==null?void 0:d.toLowerCase().includes(r))||((l=t.description)==null?void 0:l.toLowerCase().includes(r))})}function pe({wf:s,onTry:n,onCron:r}){const t=s.status==="active",d=!!s.cron_schedule;return e.jsxDEV("tr",{onClick:t?n:void 0,className:`group/row hover:bg-surface-hover/50 transition-colors border-b border-surface-border/15 ${t?"cursor-pointer":""}`,children:[e.jsxDEV("td",{className:"pl-14 pr-6 py-2.5",children:[e.jsxDEV(G,{name:s.graph_topic,size:"md"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:25,columnNumber:9},this),s.description&&e.jsxDEV("p",{className:"text-[11px] leading-snug text-text-quaternary mt-0.5",children:s.description},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:27,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:24,columnNumber:7},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-20 text-[10px] text-text-quaternary font-mono whitespace-nowrap",children:["v",s.content_version]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-28 whitespace-nowrap",children:e.jsxDEV(M,{status:s.status},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:38,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:37,columnNumber:7},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV("div",{className:"flex items-center justify-end gap-1.5",children:[t&&e.jsxDEV("button",{onClick:l=>{l.stopPropagation(),n()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Test tool",children:e.jsxDEV(O,{className:"w-3.5 h-3.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:50,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:45,columnNumber:13},this),e.jsxDEV("button",{onClick:l=>{l.stopPropagation(),r()},className:d?"text-status-success":"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:d?`Cron: ${s.cron_schedule}`:"Schedule cron",children:e.jsxDEV(ee,{className:"w-3.5 h-3.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:60,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:53,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:43,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:42,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:19,columnNumber:5},this)}function fe({server:s,expanded:n,onToggle:r,onTryTool:t,onWorkbench:d,onCron:l,visibleTools:o}){return e.jsxDEV(e.Fragment,{children:[e.jsxDEV("tr",{onClick:r,className:"group/row border-b border-surface-border/50 transition-colors duration-100 cursor-pointer row-hover",children:[e.jsxDEV("td",{className:"px-6 py-2.5",children:e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:`transition-transform duration-150 ${n?"rotate-90":""} text-text-tertiary`,children:e.jsxDEV(Q,{size:14},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:97,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:96,columnNumber:13},this),e.jsxDEV("span",{className:"flex items-center gap-1.5",children:[e.jsxDEV(ae,{name:s.appId,short:!1},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:100,columnNumber:15},this),e.jsxDEV("sup",{className:"text-[9px] font-normal text-accent/70",children:s.toolCount},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:101,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:99,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:95,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:94,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 text-[10px] text-text-quaternary font-mono whitespace-nowrap",children:["v",s.appVersion]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:107,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 whitespace-nowrap",children:e.jsxDEV(M,{status:s.status},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:113,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:112,columnNumber:9},this),e.jsxDEV("td",{className:"px-4 py-2.5 w-16",children:e.jsxDEV("div",{className:"flex items-center justify-end gap-1.5",children:s.setId&&e.jsxDEV("button",{onClick:m=>{m.stopPropagation(),d()},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Open workbench",children:e.jsxDEV(Z,{className:"w-3.5 h-3.5",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:125,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:120,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:118,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:117,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:89,columnNumber:7},this),n&&o.map(m=>e.jsxDEV(pe,{wf:m,onTry:()=>t(m),onCron:()=>l(m)},m.id,!1,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:133,columnNumber:9},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/yaml-workflow-rows.tsx",lineNumber:88,columnNumber:5},this)}function Ye(){const s=re(),{filters:n,setFilter:r}=F({filters:{status:"",server:"",search:""}}),{data:t,isLoading:d}=R({status:n.status||void 0,app_id:n.server||void 0,search:n.search||void 0,limit:200,offset:0}),l=(t==null?void 0:t.workflows)??[],{data:o}=$({limit:100}),m=u.useMemo(()=>{const a=new Map;for(const i of(o==null?void 0:o.sets)??[])i.source_workflow_id&&a.set(i.id,i.source_workflow_id);return a},[o==null?void 0:o.sets]),p=u.useMemo(()=>ce(l),[l]),x=u.useMemo(()=>[...new Set(l.map(i=>i.app_id))].sort().map(i=>({value:i,label:i})),[l]),c=u.useMemo(()=>n.search?p.filter(a=>de(a,n.search)):p,[p,n.search]),{expandedIds:f,toggle:w}=q("lt:expanded:yaml-workflows"),[N,v]=u.useState(null),[k,g]=u.useState(null),j=N||k;return d?e.jsxDEV("div",{children:[e.jsxDEV(P,{title:"MCP Pipeline Tools",docsHash:"#docs:dashboard.md:mcp-pipeline-tools"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:71,columnNumber:9},this),e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:4}).map((a,i)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:75,columnNumber:15},this)},i,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:74,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:72,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:70,columnNumber:7},this):e.jsxDEV("div",{children:[e.jsxDEV(P,{title:"MCP Pipeline Tools",docsHash:"#docs:dashboard.md:mcp-pipeline-tools",actions:e.jsxDEV("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs",children:"Design Pipeline"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:89,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:85,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Deterministic tools compiled from dynamic MCP executions. Each tool is a YAML DAG that the router discovers and invokes automatically."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:95,columnNumber:7},this),e.jsxDEV(B,{children:[e.jsxDEV(H,{label:"Search",value:n.search,onChange:a=>r("search",a),placeholder:"Server or tool name…"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:100,columnNumber:9},this),x.length>1&&e.jsxDEV(C,{label:"Server",value:n.server,onChange:a=>r("server",a),options:x},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:107,columnNumber:11},this),e.jsxDEV(C,{label:"Status",value:n.status,onChange:a=>r("status",a),options:[{value:"draft",label:"Draft"},{value:"deployed",label:"Deployed"},{value:"active",label:"Active"},{value:"archived",label:"Archived"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:114,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:99,columnNumber:7},this),e.jsxDEV("div",{className:"flex gap-0",children:[e.jsxDEV("div",{className:`${j?"flex-1 min-w-0":"w-full"} transition-all`,children:c.length===0?e.jsxDEV("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsxDEV(U,{icon:se,title:"No pipelines yet",description:"Click to open the MCP Tool Designer and create your first deterministic tool."},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:131,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:130,columnNumber:13},this):e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:[e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:137,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-20",children:"Version"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:140,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-4 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:143,columnNumber:19},this),e.jsxDEV("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-16"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:146,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:136,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:135,columnNumber:15},this),e.jsxDEV("tbody",{children:c.map(a=>e.jsxDEV(fe,{server:a,expanded:f.has(a.appId),onToggle:()=>w(a.appId),onTryTool:i=>{g(null),v(i)},onWorkbench:()=>{if(a.setId){const i=m.get(a.setId);i&&s(`/mcp/queries/${i}?mode=plan&set_id=${a.setId}&step=2`)}},onCron:i=>{v(null),g(i)},visibleTools:ue(a.workflows,n.search)},a.appId,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:151,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:149,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:134,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:128,columnNumber:9},this),N&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsxDEV(ne,{workflow:N,onClose:()=>v(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:176,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:175,columnNumber:11},this),k&&e.jsxDEV("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsxDEV(me,{workflow:k,onClose:()=>g(null)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:185,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:184,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:127,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/YamlWorkflowsPage.tsx",lineNumber:84,columnNumber:5},this)}export{Ye as YamlWorkflowsPage};
2
+ //# sourceMappingURL=YamlWorkflowsPage-CLebf2eL.js.map