@hotmeshio/long-tail 0.4.4 → 0.4.6

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 (193) hide show
  1. package/build/api/agent-subscriptions.js +14 -0
  2. package/build/api/files.js +8 -0
  3. package/build/api/topics.d.ts +5 -0
  4. package/build/api/topics.js +20 -0
  5. package/build/lib/events/index.js +3 -0
  6. package/build/lib/events/nats.js +2 -0
  7. package/build/routes/topics.js +12 -0
  8. package/build/services/agent/index.js +14 -0
  9. package/build/services/agent/trigger-registry.d.ts +11 -0
  10. package/build/services/agent/trigger-registry.js +62 -10
  11. package/build/start/workers.js +3 -0
  12. package/build/types/events.d.ts +1 -1
  13. package/dashboard/dist/assets/{AdminDashboard-DISq0Tz8.js → AdminDashboard-qZYNzvw8.js} +2 -2
  14. package/dashboard/dist/assets/{AdminDashboard-DISq0Tz8.js.map → AdminDashboard-qZYNzvw8.js.map} +1 -1
  15. package/dashboard/dist/assets/{AgentConfigPage-DqaJpB3K.js → AgentConfigPage-_SMbioNp.js} +5 -5
  16. package/dashboard/dist/assets/AgentConfigPage-_SMbioNp.js.map +1 -0
  17. package/dashboard/dist/assets/{AgentDetailPage-BPzPk2GC.js → AgentDetailPage-Cf_SRtbT.js} +3 -3
  18. package/dashboard/dist/assets/{AgentDetailPage-BPzPk2GC.js.map → AgentDetailPage-Cf_SRtbT.js.map} +1 -1
  19. package/dashboard/dist/assets/{AgentsPage-CLcxJWjC.js → AgentsPage-q53C1Xk_.js} +2 -2
  20. package/dashboard/dist/assets/{AgentsPage-CLcxJWjC.js.map → AgentsPage-q53C1Xk_.js.map} +1 -1
  21. package/dashboard/dist/assets/{AvailableEscalationsPage-hOcjAAIj.js → AvailableEscalationsPage-DHWciaKb.js} +2 -2
  22. package/dashboard/dist/assets/{AvailableEscalationsPage-hOcjAAIj.js.map → AvailableEscalationsPage-DHWciaKb.js.map} +1 -1
  23. package/dashboard/dist/assets/{BotPicker-DuAZgHbJ.js → BotPicker-638n5Jaz.js} +2 -2
  24. package/dashboard/dist/assets/{BotPicker-DuAZgHbJ.js.map → BotPicker-638n5Jaz.js.map} +1 -1
  25. package/dashboard/dist/assets/{CapabilitiesPage-PRel6TXd.js → CapabilitiesPage-PmgEhPl8.js} +2 -2
  26. package/dashboard/dist/assets/{CapabilitiesPage-PRel6TXd.js.map → CapabilitiesPage-PmgEhPl8.js.map} +1 -1
  27. package/dashboard/dist/assets/{CollapsibleSection-DnoUFQVf.js → CollapsibleSection-BEZoI6NU.js} +2 -2
  28. package/dashboard/dist/assets/{CollapsibleSection-DnoUFQVf.js.map → CollapsibleSection-BEZoI6NU.js.map} +1 -1
  29. package/dashboard/dist/assets/{CredentialsPage-CqedUU7b.js → CredentialsPage-Dl15oW3U.js} +2 -2
  30. package/dashboard/dist/assets/{CredentialsPage-CqedUU7b.js.map → CredentialsPage-Dl15oW3U.js.map} +1 -1
  31. package/dashboard/dist/assets/{CronLabel-CPEjE-mH.js → CronLabel-Dg8U0s5a.js} +2 -2
  32. package/dashboard/dist/assets/{CronLabel-CPEjE-mH.js.map → CronLabel-Dg8U0s5a.js.map} +1 -1
  33. package/dashboard/dist/assets/{CustomDurationPicker-BIQWzbv0.js → CustomDurationPicker-BCbVMr-4.js} +2 -2
  34. package/dashboard/dist/assets/{CustomDurationPicker-BIQWzbv0.js.map → CustomDurationPicker-BCbVMr-4.js.map} +1 -1
  35. package/dashboard/dist/assets/{DropZone-e5EOL5gC.js → DropZone-lw2wmqty.js} +2 -2
  36. package/dashboard/dist/assets/{DropZone-e5EOL5gC.js.map → DropZone-lw2wmqty.js.map} +1 -1
  37. package/dashboard/dist/assets/{ElapsedCell-CzVjr74Y.js → ElapsedCell-fuG5wRDw.js} +2 -2
  38. package/dashboard/dist/assets/{ElapsedCell-CzVjr74Y.js.map → ElapsedCell-fuG5wRDw.js.map} +1 -1
  39. package/dashboard/dist/assets/{EscalationsOverview-Bcrb44xJ.js → EscalationsOverview-nYOZczYx.js} +2 -2
  40. package/dashboard/dist/assets/{EscalationsOverview-Bcrb44xJ.js.map → EscalationsOverview-nYOZczYx.js.map} +1 -1
  41. package/dashboard/dist/assets/{EventTable-CGfJU7e1.js → EventTable-Cm0Ql46x.js} +2 -2
  42. package/dashboard/dist/assets/{EventTable-CGfJU7e1.js.map → EventTable-Cm0Ql46x.js.map} +1 -1
  43. package/dashboard/dist/assets/{EventTopicPill-xJJnxvlP.js → EventTopicPill-RaASGdZz.js} +2 -2
  44. package/dashboard/dist/assets/{EventTopicPill-xJJnxvlP.js.map → EventTopicPill-RaASGdZz.js.map} +1 -1
  45. package/dashboard/dist/assets/{HomePage-BIzUcGW9.js → HomePage-Cx6pvCFX.js} +2 -2
  46. package/dashboard/dist/assets/{HomePage-BIzUcGW9.js.map → HomePage-Cx6pvCFX.js.map} +1 -1
  47. package/dashboard/dist/assets/{ListToolbar-DNAGFe14.js → ListToolbar-YHesiWwN.js} +2 -2
  48. package/dashboard/dist/assets/{ListToolbar-DNAGFe14.js.map → ListToolbar-YHesiWwN.js.map} +1 -1
  49. package/dashboard/dist/assets/{McpOverview-BpYk21es.js → McpOverview-BWsaxVKL.js} +2 -2
  50. package/dashboard/dist/assets/{McpOverview-BpYk21es.js.map → McpOverview-BWsaxVKL.js.map} +1 -1
  51. package/dashboard/dist/assets/{McpQueryDetailPage-DlrZiSuL.js → McpQueryDetailPage-CQk3YpR-.js} +2 -2
  52. package/dashboard/dist/assets/McpQueryDetailPage-CQk3YpR-.js.map +1 -0
  53. package/dashboard/dist/assets/{McpQueryPage-COfPssO7.js → McpQueryPage-Uf5DKujM.js} +2 -2
  54. package/dashboard/dist/assets/{McpQueryPage-COfPssO7.js.map → McpQueryPage-Uf5DKujM.js.map} +1 -1
  55. package/dashboard/dist/assets/{McpRunDetailPage-Cra0nQSw.js → McpRunDetailPage-D9GU27cS.js} +2 -2
  56. package/dashboard/dist/assets/{McpRunDetailPage-Cra0nQSw.js.map → McpRunDetailPage-D9GU27cS.js.map} +1 -1
  57. package/dashboard/dist/assets/{McpRunsPage-BlgcGN3k.js → McpRunsPage-5dVAu25-.js} +2 -2
  58. package/dashboard/dist/assets/{McpRunsPage-BlgcGN3k.js.map → McpRunsPage-5dVAu25-.js.map} +1 -1
  59. package/dashboard/dist/assets/{OperatorDashboard-BbO6cWzb.js → OperatorDashboard-DNJtUDxl.js} +2 -2
  60. package/dashboard/dist/assets/{OperatorDashboard-BbO6cWzb.js.map → OperatorDashboard-DNJtUDxl.js.map} +1 -1
  61. package/dashboard/dist/assets/{PageHeader-B_gV_jKk.js → PageHeader-B4w-LDUF.js} +2 -2
  62. package/dashboard/dist/assets/{PageHeader-B_gV_jKk.js.map → PageHeader-B4w-LDUF.js.map} +1 -1
  63. package/dashboard/dist/assets/{PageHeaderWithStats-D0I0nrnx.js → PageHeaderWithStats-DQmNXYcG.js} +2 -2
  64. package/dashboard/dist/assets/{PageHeaderWithStats-D0I0nrnx.js.map → PageHeaderWithStats-DQmNXYcG.js.map} +1 -1
  65. package/dashboard/dist/assets/{ProcessDetailPage-s_iV8ICg.js → ProcessDetailPage-BPsvlG0E.js} +2 -2
  66. package/dashboard/dist/assets/{ProcessDetailPage-s_iV8ICg.js.map → ProcessDetailPage-BPsvlG0E.js.map} +1 -1
  67. package/dashboard/dist/assets/{ProcessesListPage-MnLMnxAa.js → ProcessesListPage-CnuCtHSP.js} +2 -2
  68. package/dashboard/dist/assets/{ProcessesListPage-MnLMnxAa.js.map → ProcessesListPage-CnuCtHSP.js.map} +1 -1
  69. package/dashboard/dist/assets/{RolePill-BOBytzrP.js → RolePill-Dk-YUxCm.js} +2 -2
  70. package/dashboard/dist/assets/{RolePill-BOBytzrP.js.map → RolePill-Dk-YUxCm.js.map} +1 -1
  71. package/dashboard/dist/assets/{RolesPage-BH7KASM7.js → RolesPage-BGJMx2S2.js} +2 -2
  72. package/dashboard/dist/assets/{RolesPage-BH7KASM7.js.map → RolesPage-BGJMx2S2.js.map} +1 -1
  73. package/dashboard/dist/assets/{RunAsSelector-_QbJKhlo.js → RunAsSelector-CcNnj5AF.js} +2 -2
  74. package/dashboard/dist/assets/{RunAsSelector-_QbJKhlo.js.map → RunAsSelector-CcNnj5AF.js.map} +1 -1
  75. package/dashboard/dist/assets/{ServerName-uqa4eBqm.js → ServerName-BXSm_14r.js} +2 -2
  76. package/dashboard/dist/assets/{ServerName-uqa4eBqm.js.map → ServerName-BXSm_14r.js.map} +1 -1
  77. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js → StickyPagination-BWhFSr2d.js} +2 -2
  78. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-BWhFSr2d.js.map} +1 -1
  79. package/dashboard/dist/assets/{SwimlaneTimeline-og79Llvs.js → SwimlaneTimeline-fWiYlTQw.js} +2 -2
  80. package/dashboard/dist/assets/{SwimlaneTimeline-og79Llvs.js.map → SwimlaneTimeline-fWiYlTQw.js.map} +1 -1
  81. package/dashboard/dist/assets/{TagInput-D3f11sbM.js → TagInput-CYh3PFNq.js} +2 -2
  82. package/dashboard/dist/assets/{TagInput-D3f11sbM.js.map → TagInput-CYh3PFNq.js.map} +1 -1
  83. package/dashboard/dist/assets/{TaskDetailPage-DPV4ySd9.js → TaskDetailPage-Byz19B5I.js} +2 -2
  84. package/dashboard/dist/assets/{TaskDetailPage-DPV4ySd9.js.map → TaskDetailPage-Byz19B5I.js.map} +1 -1
  85. package/dashboard/dist/assets/{TaskQueuePill-Bc45J7X1.js → TaskQueuePill-BSFLiBcf.js} +2 -2
  86. package/dashboard/dist/assets/{TaskQueuePill-Bc45J7X1.js.map → TaskQueuePill-BSFLiBcf.js.map} +1 -1
  87. package/dashboard/dist/assets/{TasksListPage-BYj3OqUi.js → TasksListPage-pe1Opw6s.js} +2 -2
  88. package/dashboard/dist/assets/{TasksListPage-BYj3OqUi.js.map → TasksListPage-pe1Opw6s.js.map} +1 -1
  89. package/dashboard/dist/assets/{TimeAgo-W7TdJpV-.js → TimeAgo-8aYUlXT9.js} +2 -2
  90. package/dashboard/dist/assets/{TimeAgo-W7TdJpV-.js.map → TimeAgo-8aYUlXT9.js.map} +1 -1
  91. package/dashboard/dist/assets/{TimestampCell-Bi2nc9Q_.js → TimestampCell-_1fW34op.js} +2 -2
  92. package/dashboard/dist/assets/{TimestampCell-Bi2nc9Q_.js.map → TimestampCell-_1fW34op.js.map} +1 -1
  93. package/dashboard/dist/assets/{ToolPill-CuoXcmhv.js → ToolPill-CcKNnnrK.js} +2 -2
  94. package/dashboard/dist/assets/{ToolPill-CuoXcmhv.js.map → ToolPill-CcKNnnrK.js.map} +1 -1
  95. package/dashboard/dist/assets/{ToolTestPanel-Dl3C53zb.js → ToolTestPanel-BD7ZkPeM.js} +2 -2
  96. package/dashboard/dist/assets/{ToolTestPanel-Dl3C53zb.js.map → ToolTestPanel-BD7ZkPeM.js.map} +1 -1
  97. package/dashboard/dist/assets/TopicDetailPage-DL6QarSi.js +9 -0
  98. package/dashboard/dist/assets/TopicDetailPage-DL6QarSi.js.map +1 -0
  99. package/dashboard/dist/assets/{TopicsPage-BfsJEC1p.js → TopicsPage-JYAk0csl.js} +2 -2
  100. package/dashboard/dist/assets/{TopicsPage-BfsJEC1p.js.map → TopicsPage-JYAk0csl.js.map} +1 -1
  101. package/dashboard/dist/assets/{UserName-b4baWHM_.js → UserName-Dcn8reNm.js} +2 -2
  102. package/dashboard/dist/assets/{UserName-b4baWHM_.js.map → UserName-Dcn8reNm.js.map} +1 -1
  103. package/dashboard/dist/assets/{WorkflowExecutionPage-BGmJnXnk.js → WorkflowExecutionPage-DPie2xiD.js} +2 -2
  104. package/dashboard/dist/assets/{WorkflowExecutionPage-BGmJnXnk.js.map → WorkflowExecutionPage-DPie2xiD.js.map} +1 -1
  105. package/dashboard/dist/assets/{WorkflowPill-Bg2-0Hkg.js → WorkflowPill-BkfIn8N3.js} +2 -2
  106. package/dashboard/dist/assets/{WorkflowPill-Bg2-0Hkg.js.map → WorkflowPill-BkfIn8N3.js.map} +1 -1
  107. package/dashboard/dist/assets/{WorkflowsDashboard-BzH7jMRu.js → WorkflowsDashboard-BRKurUye.js} +2 -2
  108. package/dashboard/dist/assets/{WorkflowsDashboard-BzH7jMRu.js.map → WorkflowsDashboard-BRKurUye.js.map} +1 -1
  109. package/dashboard/dist/assets/{WorkflowsOverview-BcUgBvjD.js → WorkflowsOverview-C9Wob38P.js} +2 -2
  110. package/dashboard/dist/assets/{WorkflowsOverview-BcUgBvjD.js.map → WorkflowsOverview-C9Wob38P.js.map} +1 -1
  111. package/dashboard/dist/assets/{YamlWorkflowsPage-OhpCQJ0l.js → YamlWorkflowsPage-BoKSRpKN.js} +2 -2
  112. package/dashboard/dist/assets/{YamlWorkflowsPage-OhpCQJ0l.js.map → YamlWorkflowsPage-BoKSRpKN.js.map} +1 -1
  113. package/dashboard/dist/assets/{agents-Ce3HmPz4.js → agents-CpLOugsY.js} +2 -2
  114. package/dashboard/dist/assets/{agents-Ce3HmPz4.js.map → agents-CpLOugsY.js.map} +1 -1
  115. package/dashboard/dist/assets/{bots-B0BomNnf.js → bots-DRrquJqC.js} +2 -2
  116. package/dashboard/dist/assets/{bots-B0BomNnf.js.map → bots-DRrquJqC.js.map} +1 -1
  117. package/dashboard/dist/assets/{capabilities-t-w5N9K9.js → capabilities-xbHvOXKc.js} +2 -2
  118. package/dashboard/dist/assets/{capabilities-t-w5N9K9.js.map → capabilities-xbHvOXKc.js.map} +1 -1
  119. package/dashboard/dist/assets/{controlplane-BrtAZnJM.js → controlplane-FilVp8jI.js} +2 -2
  120. package/dashboard/dist/assets/{controlplane-BrtAZnJM.js.map → controlplane-FilVp8jI.js.map} +1 -1
  121. package/dashboard/dist/assets/{escalation-DilnDxw2.js → escalation-SGea3mBy.js} +2 -2
  122. package/dashboard/dist/assets/{escalation-DilnDxw2.js.map → escalation-SGea3mBy.js.map} +1 -1
  123. package/dashboard/dist/assets/{escalation-columns-C0slywOY.js → escalation-columns-C6sLGnSX.js} +2 -2
  124. package/dashboard/dist/assets/{escalation-columns-C0slywOY.js.map → escalation-columns-C6sLGnSX.js.map} +1 -1
  125. package/dashboard/dist/assets/{helpers-BMvPqQr8.js → helpers-wHzG3Maf.js} +2 -2
  126. package/dashboard/dist/assets/{helpers-BMvPqQr8.js.map → helpers-wHzG3Maf.js.map} +1 -1
  127. package/dashboard/dist/assets/{index-Ck2QdJXT.js → index-90jmsIHz.js} +2 -2
  128. package/dashboard/dist/assets/{index-Ck2QdJXT.js.map → index-90jmsIHz.js.map} +1 -1
  129. package/dashboard/dist/assets/index-B7Vxutyl.js +63 -0
  130. package/dashboard/dist/assets/index-B7Vxutyl.js.map +1 -0
  131. package/dashboard/dist/assets/{index-H5TlloTk.js → index-BS3KIrQL.js} +2 -2
  132. package/dashboard/dist/assets/{index-H5TlloTk.js.map → index-BS3KIrQL.js.map} +1 -1
  133. package/dashboard/dist/assets/{index-30-pN97P.js → index-Bu2EEWNN.js} +2 -2
  134. package/dashboard/dist/assets/{index-30-pN97P.js.map → index-Bu2EEWNN.js.map} +1 -1
  135. package/dashboard/dist/assets/{index-DnsVYMMg.js → index-C7k3xfpt.js} +2 -2
  136. package/dashboard/dist/assets/{index-DnsVYMMg.js.map → index-C7k3xfpt.js.map} +1 -1
  137. package/dashboard/dist/assets/{index-BxOuF0hm.js → index-C8xDd-Ys.js} +2 -2
  138. package/dashboard/dist/assets/{index-BxOuF0hm.js.map → index-C8xDd-Ys.js.map} +1 -1
  139. package/dashboard/dist/assets/{index-pIMl0mYp.js → index-CkYNpw4d.js} +2 -2
  140. package/dashboard/dist/assets/{index-pIMl0mYp.js.map → index-CkYNpw4d.js.map} +1 -1
  141. package/dashboard/dist/assets/{index-f-0Duls3.js → index-DVxBi47d.js} +2 -2
  142. package/dashboard/dist/assets/{index-f-0Duls3.js.map → index-DVxBi47d.js.map} +1 -1
  143. package/dashboard/dist/assets/{index-BPxglOYm.css → index-DZI2L4ag.css} +1 -1
  144. package/dashboard/dist/assets/{index-DPW_i3fH.js → index-Dr8WJAGM.js} +2 -2
  145. package/dashboard/dist/assets/index-Dr8WJAGM.js.map +1 -0
  146. package/dashboard/dist/assets/{index-DNmlrCAp.js → index-DzgixtgL.js} +2 -2
  147. package/dashboard/dist/assets/{index-DNmlrCAp.js.map → index-DzgixtgL.js.map} +1 -1
  148. package/dashboard/dist/assets/index-E1i1ADY1.js +15 -0
  149. package/dashboard/dist/assets/{index-D_wqdvG_.js.map → index-E1i1ADY1.js.map} +1 -1
  150. package/dashboard/dist/assets/{index-Bl9wzQ8Q.js → index-H2tN256i.js} +2 -2
  151. package/dashboard/dist/assets/{index-Bl9wzQ8Q.js.map → index-H2tN256i.js.map} +1 -1
  152. package/dashboard/dist/assets/{index-qNuxC8kX.js → index-WwUcAoas.js} +2 -2
  153. package/dashboard/dist/assets/{index-qNuxC8kX.js.map → index-WwUcAoas.js.map} +1 -1
  154. package/dashboard/dist/assets/{knowledge-D01NdF5h.js → knowledge-CQWNz28-.js} +2 -2
  155. package/dashboard/dist/assets/{knowledge-D01NdF5h.js.map → knowledge-CQWNz28-.js.map} +1 -1
  156. package/dashboard/dist/assets/{mcp-CjXjDZI0.js → mcp-J_cDlKuA.js} +2 -2
  157. package/dashboard/dist/assets/{mcp-CjXjDZI0.js.map → mcp-J_cDlKuA.js.map} +1 -1
  158. package/dashboard/dist/assets/{mcp-query-LlKQcWLJ.js → mcp-query-C1zyeRvo.js} +2 -2
  159. package/dashboard/dist/assets/{mcp-query-LlKQcWLJ.js.map → mcp-query-C1zyeRvo.js.map} +1 -1
  160. package/dashboard/dist/assets/{mcp-runs-C0C54hU6.js → mcp-runs-BR4fvXXw.js} +2 -2
  161. package/dashboard/dist/assets/{mcp-runs-C0C54hU6.js.map → mcp-runs-BR4fvXXw.js.map} +1 -1
  162. package/dashboard/dist/assets/{namespaces-6qWDXXJV.js → namespaces-XOr9_XCV.js} +2 -2
  163. package/dashboard/dist/assets/{namespaces-6qWDXXJV.js.map → namespaces-XOr9_XCV.js.map} +1 -1
  164. package/dashboard/dist/assets/{roles-Dtj0uabn.js → roles-yuxJgQBf.js} +2 -2
  165. package/dashboard/dist/assets/{roles-Dtj0uabn.js.map → roles-yuxJgQBf.js.map} +1 -1
  166. package/dashboard/dist/assets/{tasks-BevFBjZq.js → tasks-CI3qsHdP.js} +2 -2
  167. package/dashboard/dist/assets/{tasks-BevFBjZq.js.map → tasks-CI3qsHdP.js.map} +1 -1
  168. package/dashboard/dist/assets/topics-lm2GYKuv.js +2 -0
  169. package/dashboard/dist/assets/{topics-BMG5tx2g.js.map → topics-lm2GYKuv.js.map} +1 -1
  170. package/dashboard/dist/assets/{useEventHooks-CPyvFlVR.js → useEventHooks-DpvfSw9p.js} +2 -2
  171. package/dashboard/dist/assets/{useEventHooks-CPyvFlVR.js.map → useEventHooks-DpvfSw9p.js.map} +1 -1
  172. package/dashboard/dist/assets/{useYamlActivityEvents-Bll8NPNQ.js → useYamlActivityEvents-D-zuU9Ts.js} +2 -2
  173. package/dashboard/dist/assets/{useYamlActivityEvents-Bll8NPNQ.js.map → useYamlActivityEvents-D-zuU9Ts.js.map} +1 -1
  174. package/dashboard/dist/assets/{users-XZ349b0r.js → users-DRkulG9o.js} +2 -2
  175. package/dashboard/dist/assets/{users-XZ349b0r.js.map → users-DRkulG9o.js.map} +1 -1
  176. package/dashboard/dist/assets/{vendor-icons-B_Yla7iD.js → vendor-icons-5gSix3t2.js} +106 -101
  177. package/dashboard/dist/assets/vendor-icons-5gSix3t2.js.map +1 -0
  178. package/dashboard/dist/assets/{workflows-Do-Eiv8f.js → workflows-dhvM792w.js} +2 -2
  179. package/dashboard/dist/assets/{workflows-Do-Eiv8f.js.map → workflows-dhvM792w.js.map} +1 -1
  180. package/dashboard/dist/assets/{yaml-workflows-DolGRQ5f.js → yaml-workflows-DqbGpE2x.js} +2 -2
  181. package/dashboard/dist/assets/{yaml-workflows-DolGRQ5f.js.map → yaml-workflows-DqbGpE2x.js.map} +1 -1
  182. package/dashboard/dist/index.html +3 -3
  183. package/package.json +1 -1
  184. package/dashboard/dist/assets/AgentConfigPage-DqaJpB3K.js.map +0 -1
  185. package/dashboard/dist/assets/McpQueryDetailPage-DlrZiSuL.js.map +0 -1
  186. package/dashboard/dist/assets/TopicDetailPage-CjaZn4WP.js +0 -9
  187. package/dashboard/dist/assets/TopicDetailPage-CjaZn4WP.js.map +0 -1
  188. package/dashboard/dist/assets/index-DPW_i3fH.js.map +0 -1
  189. package/dashboard/dist/assets/index-DZX-E_3q.js +0 -63
  190. package/dashboard/dist/assets/index-DZX-E_3q.js.map +0 -1
  191. package/dashboard/dist/assets/index-D_wqdvG_.js +0 -15
  192. package/dashboard/dist/assets/topics-BMG5tx2g.js +0 -2
  193. package/dashboard/dist/assets/vendor-icons-B_Yla7iD.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{P as j}from"./PageHeader-B_gV_jKk.js";import{D as _}from"./DataTable-D9yuBv0w.js";import{F as v,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as N}from"./StickyPagination-F9FZsRy9.js";import{L as P}from"./ListToolbar-DNAGFe14.js";import{T as h}from"./TimestampCell-Bi2nc9Q_.js";import{E as C}from"./ElapsedCell-CzVjr74Y.js";import{W as $}from"./WorkflowPill-Bg2-0Hkg.js";import{E as W}from"./EmptyState-BcsfPq9T.js";import{R as c}from"./RowActions-Dg-Fsm5O.js";import{u as S}from"./useFilterParams-DZCAaBC7.js";import{b as q}from"./useEventHooks-CPyvFlVR.js";import{u as T}from"./mcp-query-LlKQcWLJ.js";import{W as y,s as D,t as g,u as k,S as B,v as F}from"./vendor-icons-B_Yla7iD.js";import{c as L}from"./vendor-react-CX88sFS5.js";import"./index-DZX-E_3q.js";const M={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"};function p(s){return s.status==="completed"||Number(s.status)===0?"completed":s.is_live?"in_progress":"failed"}function E(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const a=p(t),o=M[a]??"bg-status-pending",l=a==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${o}${l}`,title:a}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),e.jsx("div",{className:"mt-0.5",children:e.jsx($,{type:t.entity||"unknown"})})]})]})}},{key:"created_at",label:"Created",render:t=>e.jsx(h,{date:t.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:t=>e.jsx(h,{date:t.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:t=>{const a=p(t);return e.jsx(C,{startDate:t.created_at,endDate:a==="in_progress"?null:t.updated_at,isLive:a==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const o=p(t)==="completed",l=t.entity==="mcpWorkflowBuilder";if(t.entity==="mcpWorkflowPlanner"){const r=t.set_id?`/mcp/queries/${t.workflow_id}?mode=plan&set_id=${t.set_id}`:`/mcp/queries/${t.workflow_id}?mode=plan`;return e.jsxs(c,{children:[e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Plan",children:e.jsx(D,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Build":"Planning...",disabled:!o,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}return l?e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Profile":"Building...",disabled:!o,children:e.jsx(B,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}):e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=2`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all",title:"Discover",children:e.jsx(F,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=3`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Compile":"Complete discovery first",disabled:!o,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function se(){const s=L(),t=E(s),{filters:a,setFilter:o,pagination:l,sort:d,setSort:r}=S({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:b}=T({limit:l.pageSize,offset:l.offset,search:a.search,status:a.status,entity:a.type||void 0});q();const u=(n==null?void 0:n.jobs)??[],x=(n==null?void 0:n.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(j,{title:"MCP Tool Designer",docsHash:"#docs:dashboard.md:mcp-tool-designer",actions:e.jsxs("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(y,{className:"w-3.5 h-3.5",strokeWidth:1.5}),"Create New MCP Tool"]})}),e.jsxs(v,{actions:e.jsx(P,{onRefresh:()=>b(),apiPath:`/workflow-states/jobs?entity=${a.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner"}&limit=${l.pageSize}&offset=${l.offset}&sort_by=created_at&order=desc${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[e.jsx(f,{label:"Type",value:a.type,onChange:i=>o("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:a.status,onChange:i=>o("status",i),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})]}),e.jsx(_,{columns:t,data:u,keyFn:i=>i.workflow_id,onRowClick:i=>{if(i.entity==="mcpWorkflowPlanner"){const w=i.set_id?`/mcp/queries/${i.workflow_id}?mode=plan&set_id=${i.set_id}`:`/mcp/queries/${i.workflow_id}?mode=plan`;s(w)}else i.entity==="mcpWorkflowBuilder"?s(`/mcp/queries/${i.workflow_id}?mode=builder`):s(`/mcp/queries/${i.workflow_id}`)},isLoading:m,emptyMessage:"",sort:d,onSort:r}),!m&&u.length===0&&e.jsx("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsx(W,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(N,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{se as McpQueryPage};
2
- //# sourceMappingURL=McpQueryPage-COfPssO7.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{P as j}from"./PageHeader-B4w-LDUF.js";import{D as _}from"./DataTable-D9yuBv0w.js";import{F as v,b as f}from"./FilterBar-Ck4K4rzu.js";import{S as N}from"./StickyPagination-BWhFSr2d.js";import{L as P}from"./ListToolbar-YHesiWwN.js";import{T as h}from"./TimestampCell-_1fW34op.js";import{E as C}from"./ElapsedCell-fuG5wRDw.js";import{W as $}from"./WorkflowPill-BkfIn8N3.js";import{E as W}from"./EmptyState-BcsfPq9T.js";import{R as c}from"./RowActions-Dg-Fsm5O.js";import{u as S}from"./useFilterParams-DZCAaBC7.js";import{b as q}from"./useEventHooks-DpvfSw9p.js";import{u as T}from"./mcp-query-C1zyeRvo.js";import{W as y,u as D,v as g,w as k,S as B,x as F}from"./vendor-icons-5gSix3t2.js";import{c as L}from"./vendor-react-CX88sFS5.js";import"./index-B7Vxutyl.js";const M={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"};function p(s){return s.status==="completed"||Number(s.status)===0?"completed":s.is_live?"in_progress":"failed"}function E(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const a=p(t),o=M[a]??"bg-status-pending",l=a==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${o}${l}`,title:a}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),e.jsx("div",{className:"mt-0.5",children:e.jsx($,{type:t.entity||"unknown"})})]})]})}},{key:"created_at",label:"Created",render:t=>e.jsx(h,{date:t.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:t=>e.jsx(h,{date:t.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:t=>{const a=p(t);return e.jsx(C,{startDate:t.created_at,endDate:a==="in_progress"?null:t.updated_at,isLive:a==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const o=p(t)==="completed",l=t.entity==="mcpWorkflowBuilder";if(t.entity==="mcpWorkflowPlanner"){const r=t.set_id?`/mcp/queries/${t.workflow_id}?mode=plan&set_id=${t.set_id}`:`/mcp/queries/${t.workflow_id}?mode=plan`;return e.jsxs(c,{children:[e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Plan",children:e.jsx(D,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Build":"Planning...",disabled:!o,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}return l?e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Profile":"Building...",disabled:!o,children:e.jsx(B,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}):e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=2`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all",title:"Discover",children:e.jsx(F,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=3`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${o?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:o?"Compile":"Complete discovery first",disabled:!o,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function se(){const s=L(),t=E(s),{filters:a,setFilter:o,pagination:l,sort:d,setSort:r}=S({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:w}=T({limit:l.pageSize,offset:l.offset,search:a.search,status:a.status,entity:a.type||void 0});q();const u=(n==null?void 0:n.jobs)??[],x=(n==null?void 0:n.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(j,{title:"MCP Tool Designer",docsHash:"#docs:dashboard.md:mcp-tool-designer",actions:e.jsxs("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(y,{className:"w-3.5 h-3.5",strokeWidth:1.5}),"Create New MCP Tool"]})}),e.jsxs(v,{actions:e.jsx(P,{onRefresh:()=>w(),apiPath:`/workflow-states/jobs?entity=${a.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner"}&limit=${l.pageSize}&offset=${l.offset}&sort_by=created_at&order=desc${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[e.jsx(f,{label:"Type",value:a.type,onChange:i=>o("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:a.status,onChange:i=>o("status",i),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})]}),e.jsx(_,{columns:t,data:u,keyFn:i=>i.workflow_id,onRowClick:i=>{if(i.entity==="mcpWorkflowPlanner"){const b=i.set_id?`/mcp/queries/${i.workflow_id}?mode=plan&set_id=${i.set_id}`:`/mcp/queries/${i.workflow_id}?mode=plan`;s(b)}else i.entity==="mcpWorkflowBuilder"?s(`/mcp/queries/${i.workflow_id}?mode=builder`):s(`/mcp/queries/${i.workflow_id}`)},isLoading:m,emptyMessage:"",sort:d,onSort:r}),!m&&u.length===0&&e.jsx("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsx(W,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(N,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{se as McpQueryPage};
2
+ //# sourceMappingURL=McpQueryPage-Uf5DKujM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpQueryPage-COfPssO7.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { MessageSquare, Lightbulb, Layers, Wand2, Settings, GitBranch } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { RowActionGroup } from '../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useMcpQueryJobs } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\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\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\nfunction buildColumns(navigate: ReturnType<typeof useNavigate>): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const s = mapStatus(row);\n const dotClass = STATUS_DOT[s] ?? 'bg-status-pending';\n const pulseClass = s === 'in_progress' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${dotClass}${pulseClass}`} title={s} />\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 || 'unknown'} />\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 const s = mapStatus(row);\n return (\n <ElapsedCell\n startDate={row.created_at}\n endDate={s === 'in_progress' ? null : row.updated_at}\n isLive={s === 'in_progress'}\n />\n );\n },\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n className: 'w-28',\n render: (row) => {\n const s = mapStatus(row);\n const isComplete = s === 'completed';\n const isBuilder = row.entity === 'mcpWorkflowBuilder';\n const isPlanner = row.entity === 'mcpWorkflowPlanner';\n\n if (isPlanner) {\n const planUrl = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Plan\"\n >\n <GitBranch className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Build' : 'Planning...'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n if (isBuilder) {\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Profile' : 'Building...'}\n disabled={!isComplete}\n >\n <Settings className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=2`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all\"\n title=\"Discover\"\n >\n <Lightbulb className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=3`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Compile' : 'Complete discovery first'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n },\n },\n ];\n}\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const columns = buildColumns(navigate);\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '', type: '' },\n pageSize: 20,\n });\n\n const { data, isLoading, refetch } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n entity: filters.type || undefined,\n });\n\n useWorkflowListEvents();\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader\n title=\"MCP Tool Designer\"\n docsHash=\"#docs:dashboard.md:mcp-tool-designer\"\n actions={\n <button\n onClick={() => navigate('/mcp/queries/new')}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n Create New MCP Tool\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n apiPath={`/workflow-states/jobs?entity=${filters.type || 'mcpQuery,mcpTriage,mcpWorkflowPlanner'}&limit=${pagination.pageSize}&offset=${pagination.offset}&sort_by=created_at&order=desc${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={[\n { value: 'mcpQuery', label: 'Discovery' },\n { value: 'mcpWorkflowPlanner', label: 'Build' },\n { value: 'mcpTriage', label: 'Triage' },\n ]}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => {\n if (row.entity === 'mcpWorkflowPlanner') {\n const url = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n navigate(url);\n } else if (row.entity === 'mcpWorkflowBuilder') {\n navigate(`/mcp/queries/${row.workflow_id}?mode=builder`);\n } else {\n navigate(`/mcp/queries/${row.workflow_id}`);\n }\n }}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No tool designs yet\" description=\"Click to create your first MCP tool\" />\n </div>\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["STATUS_DOT","mapStatus","job","buildColumns","navigate","row","s","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","isComplete","isBuilder","planUrl","RowActionGroup","e","GitBranch","Layers","MessageSquare","Settings","Lightbulb","McpQueryPage","useNavigate","columns","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","refetch","useMcpQueryJobs","useWorkflowListEvents","jobs","total","Fragment","PageHeader","Wand2","FilterBar","ListToolbar","FilterSelect","v","DataTable","url","EmptyState","StickyPagination"],"mappings":"8yBAkBA,MAAMA,EAAqC,CACzC,YAAa,mBACb,UAAW,oBACX,OAAQ,iBACV,EAEA,SAASC,EAAUC,EAAoB,CAErC,OADIA,EAAI,SAAW,aACf,OAAOA,EAAI,MAAM,IAAM,EAAU,YACjCA,EAAI,QAAgB,cACjB,QACT,CAEA,SAASC,EAAaC,EAA2D,CAC/E,MAAO,CACL,CACE,IAAK,cACL,MAAO,qBACP,OAASC,GAAQ,CACf,MAAMC,EAAIL,EAAUI,CAAG,EACjBE,EAAWP,EAAWM,CAAC,GAAK,oBAC5BE,EAAaF,IAAM,cAAgB,iBAAmB,GAC5D,OACEG,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAW,8CAA8CH,CAAQ,GAAGC,CAAU,GAAI,MAAOF,CAAA,CAAG,EAClGG,EAAAA,KAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qDACb,SAAAL,EAAI,YACP,EACAK,EAAAA,IAAC,MAAA,CAAI,UAAU,SACb,SAAAA,EAAAA,IAACC,GAAa,KAAMN,EAAI,QAAU,SAAA,CAAW,CAAA,CAC/C,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAAA,EAEF,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASO,EAAA,CAAc,KAAMP,EAAI,WAAY,EACtD,UAAW,OACX,SAAU,EAAA,EAEZ,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASO,EAAA,CAAc,KAAMP,EAAI,WAAY,EACtD,UAAW,OACX,SAAU,EAAA,EAEZ,CACE,IAAK,WACL,MAAO,WACP,OAASA,GAAQ,CACf,MAAMC,EAAIL,EAAUI,CAAG,EACvB,OACEK,EAAAA,IAACG,EAAA,CACC,UAAWR,EAAI,WACf,QAASC,IAAM,cAAgB,KAAOD,EAAI,WAC1C,OAAQC,IAAM,aAAA,CAAA,CAGpB,EACA,UAAW,MAAA,EAEb,CACE,IAAK,UACL,MAAO,GACP,UAAW,OACX,OAASD,GAAQ,CAEf,MAAMS,EADIb,EAAUI,CAAG,IACE,YACnBU,EAAYV,EAAI,SAAW,qBAGjC,GAFkBA,EAAI,SAAW,qBAElB,CACb,MAAMW,EAAUX,EAAI,OAChB,gBAAgBA,EAAI,WAAW,qBAAqBA,EAAI,MAAM,GAC9D,gBAAgBA,EAAI,WAAW,aACnC,cACGY,EAAA,CACC,SAAA,CAAAP,EAAAA,IAAC,SAAA,CACC,QAAUQ,GAAM,CAAEA,EAAE,gBAAA,EAAmBd,EAAS,GAAGY,CAAO,SAAS,CAAG,EACtE,UAAU,4FACV,MAAM,OAEN,SAAAN,EAAAA,IAACS,EAAA,CAAU,UAAU,cAAc,YAAa,GAAA,CAAK,CAAA,CAAA,EAEvDT,EAAAA,IAAC,SAAA,CACC,QAAUQ,GAAM,CAAEA,EAAE,gBAAA,EAAmBd,EAAS,GAAGY,CAAO,SAAS,CAAG,EACtE,UAAW,wDAAwDF,EAAa,+CAAiD,0CAA0C,GAC3K,MAAOA,EAAa,QAAU,cAC9B,SAAU,CAACA,EAEX,SAAAJ,EAAAA,IAACU,EAAA,CAAO,UAAU,cAAc,YAAa,GAAA,CAAK,CAAA,CAAA,CACpD,EACF,CAEJ,CAEA,OAAIL,SAECE,EAAA,CACC,SAAA,CAAAP,EAAAA,IAAC,SAAA,CACC,QAAUQ,GAAM,CAAEA,EAAE,gBAAA,EAAmBd,EAAS,gBAAgBC,EAAI,WAAW,sBAAsB,CAAG,EACxG,UAAU,4FACV,MAAM,WAEN,SAAAK,EAAAA,IAACW,EAAA,CAAc,UAAU,cAAc,YAAa,GAAA,CAAK,CAAA,CAAA,EAE3DX,EAAAA,IAAC,SAAA,CACC,QAAUQ,GAAM,CAAEA,EAAE,gBAAA,EAAmBd,EAAS,gBAAgBC,EAAI,WAAW,sBAAsB,CAAG,EACxG,UAAW,wDAAwDS,EAAa,+CAAiD,0CAA0C,GAC3K,MAAOA,EAAa,UAAY,cAChC,SAAU,CAACA,EAEX,SAAAJ,EAAAA,IAACY,EAAA,CAAS,UAAU,cAAc,YAAa,GAAA,CAAK,CAAA,CAAA,CACtD,EACF,SAKDL,EAAA,CACC,SAAA,CAAAP,EAAAA,IAAC,SAAA,CACC,QAAUQ,GAAM,CAAEA,EAAE,gBAAA,EAAmBd,EAAS,gBAAgBC,EAAI,WAAW,SAAS,CAAG,EAC3F,UAAU,4FACV,MAAM,WAEN,SAAAK,EAAAA,IAACW,EAAA,CAAc,UAAU,cAAc,YAAa,GAAA,CAAK,CAAA,CAAA,EAE3DX,EAAAA,IAAC,SAAA,CACC,QAAUQ,GAAM,CAAEA,EAAE,gBAAA,EAAmBd,EAAS,gBAAgBC,EAAI,WAAW,SAAS,CAAG,EAC3F,UAAU,oGACV,MAAM,WAEN,SAAAK,EAAAA,IAACa,EAAA,CAAU,UAAU,cAAc,YAAa,GAAA,CAAK,CAAA,CAAA,EAEvDb,EAAAA,IAAC,SAAA,CACC,QAAUQ,GAAM,CAAEA,EAAE,gBAAA,EAAmBd,EAAS,gBAAgBC,EAAI,WAAW,SAAS,CAAG,EAC3F,UAAW,wDAAwDS,EAAa,+CAAiD,0CAA0C,GAC3K,MAAOA,EAAa,UAAY,2BAChC,SAAU,CAACA,EAEX,SAAAJ,EAAAA,IAACU,EAAA,CAAO,UAAU,cAAc,YAAa,GAAA,CAAK,CAAA,CAAA,CACpD,EACF,CAEJ,CAAA,CACF,CAEJ,CAEO,SAASI,IAAe,CAC7B,MAAMpB,EAAWqB,EAAA,EACXC,EAAUvB,EAAaC,CAAQ,EAE/B,CAAE,QAAAuB,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,OAAQ,GAAI,OAAQ,GAAI,KAAM,EAAA,EACzC,SAAU,EAAA,CACX,EAEK,CAAE,KAAAC,EAAM,UAAAC,EAAW,QAAAC,CAAA,EAAYC,EAAgB,CACnD,MAAOP,EAAW,SAClB,OAAQA,EAAW,OACnB,OAAQF,EAAQ,OAChB,OAAQA,EAAQ,OAChB,OAAQA,EAAQ,MAAQ,MAAA,CACzB,EAEDU,EAAA,EAEA,MAAMC,GAAOL,GAAA,YAAAA,EAAM,OAAQ,CAAA,EACrBM,GAAQN,GAAA,YAAAA,EAAM,QAAS,EAE7B,OACExB,EAAAA,KAAA+B,WAAA,CACE,SAAA,CAAA9B,EAAAA,IAAC+B,EAAA,CACC,MAAM,oBACN,SAAS,uCACT,QACEhC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAML,EAAS,kBAAkB,EAC1C,UAAU,uDAEV,SAAA,CAAAM,EAAAA,IAACgC,EAAA,CAAM,UAAU,cAAc,YAAa,IAAK,EAAE,qBAAA,CAAA,CAAA,CAErD,CAAA,EAIJjC,OAACkC,GAAU,QACTjC,EAAAA,IAACkC,EAAA,CACC,UAAW,IAAMT,EAAA,EACjB,QAAS,gCAAgCR,EAAQ,MAAQ,uCAAuC,UAAUE,EAAW,QAAQ,WAAWA,EAAW,MAAM,iCAAiCF,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGA,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,EAAA,CAAA,EAG/R,SAAA,CAAAjB,EAAAA,IAACmC,EAAA,CACC,MAAM,OACN,MAAOlB,EAAQ,KACf,SAAWmB,GAAMlB,EAAU,OAAQkB,CAAC,EACpC,QAAS,CACP,CAAE,MAAO,WAAY,MAAO,WAAA,EAC5B,CAAE,MAAO,qBAAsB,MAAO,OAAA,EACtC,CAAE,MAAO,YAAa,MAAO,QAAA,CAAS,CACxC,CAAA,EAEFpC,EAAAA,IAACmC,EAAA,CACC,MAAM,SACN,MAAOlB,EAAQ,OACf,SAAWmB,GAAMlB,EAAU,SAAUkB,CAAC,EACtC,QAAS,CACP,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,SAAU,MAAO,QAAA,CAAS,CACrC,CAAA,CACF,EACJ,EAEApC,EAAAA,IAACqC,EAAA,CACC,QAAArB,EACA,KAAMY,EACN,MAAQjC,GAAQA,EAAI,YACpB,WAAaA,GAAQ,CACnB,GAAIA,EAAI,SAAW,qBAAsB,CACvC,MAAM2C,EAAM3C,EAAI,OACZ,gBAAgBA,EAAI,WAAW,qBAAqBA,EAAI,MAAM,GAC9D,gBAAgBA,EAAI,WAAW,aACnCD,EAAS4C,CAAG,CACd,MAAW3C,EAAI,SAAW,qBACxBD,EAAS,gBAAgBC,EAAI,WAAW,eAAe,EAEvDD,EAAS,gBAAgBC,EAAI,WAAW,EAAE,CAE9C,EACA,UAAA6B,EACA,aAAa,GACb,KAAAJ,EACA,OAAQC,CAAA,CAAA,EAGT,CAACG,GAAaI,EAAK,SAAW,GAC7B5B,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAiB,QAAS,IAAMN,EAAS,kBAAkB,EACxE,eAAC6C,EAAA,CAAW,KAAMP,EAAO,MAAM,sBAAsB,YAAY,qCAAA,CAAsC,CAAA,CACzG,EAGFhC,EAAAA,IAACwC,EAAA,CACC,KAAMrB,EAAW,KACjB,SAAUA,EAAW,SACrB,MAAAU,EACA,WAAYV,EAAW,WAAWU,CAAK,EACvC,aAAcV,EAAW,OAAA,CAAA,CAC3B,EACF,CAEJ"}
1
+ {"version":3,"file":"McpQueryPage-Uf5DKujM.js","sources":["../../src/pages/mcp/McpQueryPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { MessageSquare, Lightbulb, Layers, Wand2, Settings, GitBranch } from 'lucide-react';\n\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { EmptyState } from '../../components/common/display/EmptyState';\nimport { RowActionGroup } from '../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useWorkflowListEvents } from '../../hooks/useEventHooks';\nimport { useMcpQueryJobs } from '../../api/mcp-query';\nimport type { LTJob } from '../../api/types';\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\nfunction mapStatus(job: LTJob): string {\n if (job.status === 'completed') return 'completed';\n if (Number(job.status) === 0) return 'completed';\n if (job.is_live) return 'in_progress';\n return 'failed';\n}\n\nfunction buildColumns(navigate: ReturnType<typeof useNavigate>): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Workflow ID / Type',\n render: (row) => {\n const s = mapStatus(row);\n const dotClass = STATUS_DOT[s] ?? 'bg-status-pending';\n const pulseClass = s === 'in_progress' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-start gap-2 min-w-0\">\n <span className={`w-[9px] h-[9px] shrink-0 rounded-full mt-1 ${dotClass}${pulseClass}`} title={s} />\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 || 'unknown'} />\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 const s = mapStatus(row);\n return (\n <ElapsedCell\n startDate={row.created_at}\n endDate={s === 'in_progress' ? null : row.updated_at}\n isLive={s === 'in_progress'}\n />\n );\n },\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n className: 'w-28',\n render: (row) => {\n const s = mapStatus(row);\n const isComplete = s === 'completed';\n const isBuilder = row.entity === 'mcpWorkflowBuilder';\n const isPlanner = row.entity === 'mcpWorkflowPlanner';\n\n if (isPlanner) {\n const planUrl = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Plan\"\n >\n <GitBranch className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`${planUrl}&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Build' : 'Planning...'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n if (isBuilder) {\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?mode=builder&step=2`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Profile' : 'Building...'}\n disabled={!isComplete}\n >\n <Settings className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n }\n\n return (\n <RowActionGroup>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=1`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all\"\n title=\"Describe\"\n >\n <MessageSquare className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=2`); }}\n className=\"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all\"\n title=\"Discover\"\n >\n <Lightbulb className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n <button\n onClick={(e) => { e.stopPropagation(); navigate(`/mcp/queries/${row.workflow_id}?step=3`); }}\n className={`opacity-0 group-hover/row:opacity-100 transition-all ${isComplete ? 'text-text-tertiary hover:text-status-success' : 'text-text-tertiary/30 cursor-not-allowed'}`}\n title={isComplete ? 'Compile' : 'Complete discovery first'}\n disabled={!isComplete}\n >\n <Layers className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </RowActionGroup>\n );\n },\n },\n ];\n}\n\nexport function McpQueryPage() {\n const navigate = useNavigate();\n const columns = buildColumns(navigate);\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', status: '', type: '' },\n pageSize: 20,\n });\n\n const { data, isLoading, refetch } = useMcpQueryJobs({\n limit: pagination.pageSize,\n offset: pagination.offset,\n search: filters.search,\n status: filters.status,\n entity: filters.type || undefined,\n });\n\n useWorkflowListEvents();\n\n const jobs = data?.jobs ?? [];\n const total = data?.total ?? 0;\n\n return (\n <>\n <PageHeader\n title=\"MCP Tool Designer\"\n docsHash=\"#docs:dashboard.md:mcp-tool-designer\"\n actions={\n <button\n onClick={() => navigate('/mcp/queries/new')}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Wand2 className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n Create New MCP Tool\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n apiPath={`/workflow-states/jobs?entity=${filters.type || 'mcpQuery,mcpTriage,mcpWorkflowPlanner'}&limit=${pagination.pageSize}&offset=${pagination.offset}&sort_by=created_at&order=desc${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={[\n { value: 'mcpQuery', label: 'Discovery' },\n { value: 'mcpWorkflowPlanner', label: 'Build' },\n { value: 'mcpTriage', label: 'Triage' },\n ]}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'completed', label: 'Completed' },\n { value: 'running', label: 'Running' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => {\n if (row.entity === 'mcpWorkflowPlanner') {\n const url = row.set_id\n ? `/mcp/queries/${row.workflow_id}?mode=plan&set_id=${row.set_id}`\n : `/mcp/queries/${row.workflow_id}?mode=plan`;\n navigate(url);\n } else if (row.entity === 'mcpWorkflowBuilder') {\n navigate(`/mcp/queries/${row.workflow_id}?mode=builder`);\n } else {\n navigate(`/mcp/queries/${row.workflow_id}`);\n }\n }}\n isLoading={isLoading}\n emptyMessage=\"\"\n sort={sort}\n onSort={setSort}\n />\n\n {!isLoading && jobs.length === 0 && (\n <div className=\"cursor-pointer\" onClick={() => navigate('/mcp/queries/new')}>\n <EmptyState icon={Wand2} title=\"No tool designs yet\" description=\"Click to create your first MCP tool\" />\n </div>\n )}\n\n <StickyPagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={total}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n />\n </>\n );\n}\n"],"names":["STATUS_DOT","mapStatus","job","buildColumns","navigate","row","s","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","isComplete","isBuilder","planUrl","RowActionGroup","e","GitBranch","Layers","MessageSquare","Settings","Lightbulb","McpQueryPage","useNavigate","columns","filters","setFilter","pagination","sort","setSort","useFilterParams","data","isLoading","refetch","useMcpQueryJobs","useWorkflowListEvents","jobs","total","Fragment","PageHeader","Wand2","FilterBar","ListToolbar","FilterSelect","v","DataTable","url","EmptyState","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{b as P,a as I,j as e}from"./vendor-query-B2UbickB.js";import{b as D}from"./mcp-runs-C0C54hU6.js";import{u as R,c as K,D as U,d as N,J as w,N as $}from"./index-DZX-E_3q.js";import{S as J}from"./StatusBadge-XQlNFwmH.js";import{P as k}from"./PageHeader-B_gV_jKk.js";import{C as L}from"./CopyableId-D0SQ39nR.js";import{C as j}from"./CollapsibleSection-DnoUFQVf.js";import{u as M}from"./useCollapsedSections-BU5HULGs.js";import{L as V}from"./ListToolbar-DNAGFe14.js";import{S as q}from"./SwimlaneTimeline-og79Llvs.js";import{E as B}from"./EventTable-CGfJU7e1.js";import{e as F,f as H}from"./vendor-react-CX88sFS5.js";import"./vendor-icons-B_Yla7iD.js";import"./FilterBar-Ck4K4rzu.js";const Q={running:"in_progress",completed:"completed",failed:"failed"};function le(){var v,b;const{jobId:s}=F(),[o]=H(),r=o.get("namespace")||"longtail",h=P(),{data:t,isLoading:S,error:i,refetch:_,isFetching:C}=D(s,r),{data:x}=R(),{isCollapsed:d,toggle:m}=M("mcp-run-detail"),f=((v=x==null?void 0:x.telemetry)==null?void 0:v.traceUrl)??null,E=I.useCallback(c=>{!s||c.workflowId!==s||h.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,h]);if(K(`${$}.activity.>`,E),S)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(i||!t)return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(b=i==null?void 0:i.message)!=null&&b.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:p,summary:a}=t,u=p.find(c=>{var y;return c.category==="activity"&&((y=c.attributes.kind)==null?void 0:y.includes("completed"))}),T=(u==null?void 0:u.attributes.result)??null,n=t.result,g=(n==null?void 0:n.data)??n??null;return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution",actions:e.jsx(V,{onRefresh:()=>_(),isFetching:C,apiPath:`/mcp-runs/${s}/execution?app_id=${r}`})}),e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md p-5 mb-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsx("h2",{className:"text-sm font-mono text-text-primary truncate flex-1",children:t.workflow_id}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsx(l,{label:"Tools",value:a.activities.user}),e.jsx(l,{label:"System",value:a.activities.system,muted:!0}),a.child_workflows.total>0&&e.jsx(l,{label:"Children",value:a.child_workflows.total}),a.timers>0&&e.jsx(l,{label:"Timers",value:a.timers}),a.signals>0&&e.jsx(l,{label:"Signals",value:a.signals}),e.jsx(J,{status:Q[t.status]??t.status})]})]}),e.jsxs("div",{className:"grid grid-cols-6 gap-x-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Server"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:r})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Tool"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:t.workflow_type||"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Duration"}),e.jsx(U,{ms:t.duration_ms,className:"font-mono text-text-primary"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Started"}),t.start_time?e.jsx(N,{date:t.start_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Completed"}),t.close_time?e.jsx(N,{date:t.close_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Trace"}),t.trace_id?e.jsx(L,{label:"",value:t.trace_id,href:f?f.replace("{traceId}",t.trace_id):void 0,external:!0}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})]})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(j,{title:"Details",sectionKey:"details",isCollapsed:d("details"),onToggle:m,children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[e.jsx("div",{children:e.jsx(w,{data:T??{},label:"Input"})}),g!==null&&e.jsx("div",{children:e.jsx(w,{data:g,label:"Result"})})]})}),e.jsx(j,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:d("timeline"),onToggle:m,children:e.jsx(q,{events:p,outline:!0})}),e.jsx(j,{title:"Events",sectionKey:"events",isCollapsed:d("events"),onToggle:m,children:e.jsx(B,{events:p})})]})]})}function l({label:s,value:o,muted:r}){return e.jsxs("div",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"text-text-tertiary",children:s}),e.jsx("span",{className:`font-medium tabular-nums ${r?"text-text-tertiary":"text-text-primary"}`,children:o})]})}export{le as McpRunDetailPage};
2
- //# sourceMappingURL=McpRunDetailPage-Cra0nQSw.js.map
1
+ import{b as P,a as I,j as e}from"./vendor-query-B2UbickB.js";import{b as D}from"./mcp-runs-BR4fvXXw.js";import{u as R,c as K,D as U,d as N,J as w,N as $}from"./index-B7Vxutyl.js";import{S as J}from"./StatusBadge-XQlNFwmH.js";import{P as k}from"./PageHeader-B4w-LDUF.js";import{C as L}from"./CopyableId-D0SQ39nR.js";import{C as j}from"./CollapsibleSection-BEZoI6NU.js";import{u as M}from"./useCollapsedSections-BU5HULGs.js";import{L as V}from"./ListToolbar-YHesiWwN.js";import{S as q}from"./SwimlaneTimeline-fWiYlTQw.js";import{E as B}from"./EventTable-Cm0Ql46x.js";import{e as F,f as H}from"./vendor-react-CX88sFS5.js";import"./vendor-icons-5gSix3t2.js";import"./FilterBar-Ck4K4rzu.js";const Q={running:"in_progress",completed:"completed",failed:"failed"};function le(){var v,b;const{jobId:s}=F(),[o]=H(),r=o.get("namespace")||"longtail",h=P(),{data:t,isLoading:S,error:i,refetch:_,isFetching:C}=D(s,r),{data:x}=R(),{isCollapsed:d,toggle:m}=M("mcp-run-detail"),f=((v=x==null?void 0:x.telemetry)==null?void 0:v.traceUrl)??null,E=I.useCallback(c=>{!s||c.workflowId!==s||h.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,h]);if(K(`${$}.activity.>`,E),S)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(i||!t)return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(b=i==null?void 0:i.message)!=null&&b.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:p,summary:a}=t,u=p.find(c=>{var y;return c.category==="activity"&&((y=c.attributes.kind)==null?void 0:y.includes("completed"))}),T=(u==null?void 0:u.attributes.result)??null,n=t.result,g=(n==null?void 0:n.data)??n??null;return e.jsxs("div",{children:[e.jsx(k,{title:"Pipeline Execution",actions:e.jsx(V,{onRefresh:()=>_(),isFetching:C,apiPath:`/mcp-runs/${s}/execution?app_id=${r}`})}),e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md p-5 mb-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsx("h2",{className:"text-sm font-mono text-text-primary truncate flex-1",children:t.workflow_id}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsx(l,{label:"Tools",value:a.activities.user}),e.jsx(l,{label:"System",value:a.activities.system,muted:!0}),a.child_workflows.total>0&&e.jsx(l,{label:"Children",value:a.child_workflows.total}),a.timers>0&&e.jsx(l,{label:"Timers",value:a.timers}),a.signals>0&&e.jsx(l,{label:"Signals",value:a.signals}),e.jsx(J,{status:Q[t.status]??t.status})]})]}),e.jsxs("div",{className:"grid grid-cols-6 gap-x-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Server"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:r})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Tool"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:t.workflow_type||"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Duration"}),e.jsx(U,{ms:t.duration_ms,className:"font-mono text-text-primary"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Started"}),t.start_time?e.jsx(N,{date:t.start_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Completed"}),t.close_time?e.jsx(N,{date:t.close_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Trace"}),t.trace_id?e.jsx(L,{label:"",value:t.trace_id,href:f?f.replace("{traceId}",t.trace_id):void 0,external:!0}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})]})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(j,{title:"Details",sectionKey:"details",isCollapsed:d("details"),onToggle:m,children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[e.jsx("div",{children:e.jsx(w,{data:T??{},label:"Input"})}),g!==null&&e.jsx("div",{children:e.jsx(w,{data:g,label:"Result"})})]})}),e.jsx(j,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:d("timeline"),onToggle:m,children:e.jsx(q,{events:p,outline:!0})}),e.jsx(j,{title:"Events",sectionKey:"events",isCollapsed:d("events"),onToggle:m,children:e.jsx(B,{events:p})})]})]})}function l({label:s,value:o,muted:r}){return e.jsxs("div",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"text-text-tertiary",children:s}),e.jsx("span",{className:`font-medium tabular-nums ${r?"text-text-tertiary":"text-text-primary"}`,children:o})]})}export{le as McpRunDetailPage};
2
+ //# sourceMappingURL=McpRunDetailPage-D9GU27cS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpRunDetailPage-Cra0nQSw.js","sources":["../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { useParams, useSearchParams } from 'react-router-dom';\nimport { useCallback } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution } from '../../api/mcp-runs';\nimport { useSettings } from '../../api/settings';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || 'longtail';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.activity.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events, summary } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n <div>\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/mcp-runs/${jobId}/execution?app_id=${namespace}`}\n />\n }\n />\n\n {/* ── Header card ─────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md p-5 mb-8\">\n {/* Row 1: Job ID + stats + status */}\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-sm font-mono text-text-primary truncate flex-1\">{execution.workflow_id}</h2>\n <div className=\"flex items-center gap-4 shrink-0\">\n <Stat label=\"Tools\" value={summary.activities.user} />\n <Stat label=\"System\" value={summary.activities.system} muted />\n {summary.child_workflows.total > 0 && (\n <Stat label=\"Children\" value={summary.child_workflows.total} />\n )}\n {summary.timers > 0 && <Stat label=\"Timers\" value={summary.timers} />}\n {summary.signals > 0 && <Stat label=\"Signals\" value={summary.signals} />}\n <StatusBadge status={statusMap[execution.status] ?? execution.status} />\n </div>\n </div>\n\n {/* Row 2: Namespace, Topic, Duration, Started, Trace */}\n <div className=\"grid grid-cols-6 gap-x-6\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Server</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{namespace}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{execution.workflow_type || '—'}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <DurationValue ms={execution.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Completed</p>\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Trace</p>\n {execution.trace_id ? (\n <CopyableId\n label=\"\"\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Sections ────────────────────────────────────── */}\n <div className=\"space-y-6\">\n {/* Details: Input + Result */}\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n <div>\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n </div>\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Execution Timeline (swimlane) */}\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle}>\n <SwimlaneTimeline events={events} outline />\n </CollapsibleSection>\n\n {/* Events (table) */}\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle}>\n <EventTable events={events} />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n\n// ── Stat pill ────────────────────────────────────────────────────────────────\n\nfunction Stat({ label, value, muted }: { label: string; value: number; muted?: boolean }) {\n return (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-tertiary\">{label}</span>\n <span className={`font-medium tabular-nums ${muted ? 'text-text-tertiary' : 'text-text-primary'}`}>{value}</span>\n </div>\n );\n}\n"],"names":["statusMap","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","namespace","queryClient","useQueryClient","execution","isLoading","error","refetch","isFetching","useMcpRunExecution","settings","useSettings","isCollapsed","toggle","useCollapsedSections","traceUrl","_a","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","jsxs","jsx","PageHeader","_b","events","summary","triggerCompleted","e","triggerInput","rawResult","result","ListToolbar","Stat","StatusBadge","DurationValue","DateValue","CopyableId","CollapsibleSection","JsonViewer","SwimlaneTimeline","EventTable","label","value","muted"],"mappings":"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"}
1
+ {"version":3,"file":"McpRunDetailPage-D9GU27cS.js","sources":["../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { useParams, useSearchParams } from 'react-router-dom';\nimport { useCallback } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution } from '../../api/mcp-runs';\nimport { useSettings } from '../../api/settings';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || 'longtail';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.activity.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events, summary } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n <div>\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/mcp-runs/${jobId}/execution?app_id=${namespace}`}\n />\n }\n />\n\n {/* ── Header card ─────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md p-5 mb-8\">\n {/* Row 1: Job ID + stats + status */}\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-sm font-mono text-text-primary truncate flex-1\">{execution.workflow_id}</h2>\n <div className=\"flex items-center gap-4 shrink-0\">\n <Stat label=\"Tools\" value={summary.activities.user} />\n <Stat label=\"System\" value={summary.activities.system} muted />\n {summary.child_workflows.total > 0 && (\n <Stat label=\"Children\" value={summary.child_workflows.total} />\n )}\n {summary.timers > 0 && <Stat label=\"Timers\" value={summary.timers} />}\n {summary.signals > 0 && <Stat label=\"Signals\" value={summary.signals} />}\n <StatusBadge status={statusMap[execution.status] ?? execution.status} />\n </div>\n </div>\n\n {/* Row 2: Namespace, Topic, Duration, Started, Trace */}\n <div className=\"grid grid-cols-6 gap-x-6\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Server</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{namespace}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{execution.workflow_type || '—'}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <DurationValue ms={execution.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Completed</p>\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Trace</p>\n {execution.trace_id ? (\n <CopyableId\n label=\"\"\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Sections ────────────────────────────────────── */}\n <div className=\"space-y-6\">\n {/* Details: Input + Result */}\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n <div>\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n </div>\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Execution Timeline (swimlane) */}\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle}>\n <SwimlaneTimeline events={events} outline />\n </CollapsibleSection>\n\n {/* Events (table) */}\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle}>\n <EventTable events={events} />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n\n// ── Stat pill ────────────────────────────────────────────────────────────────\n\nfunction Stat({ label, value, muted }: { label: string; value: number; muted?: boolean }) {\n return (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-tertiary\">{label}</span>\n <span className={`font-medium tabular-nums ${muted ? 'text-text-tertiary' : 'text-text-primary'}`}>{value}</span>\n </div>\n );\n}\n"],"names":["statusMap","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","namespace","queryClient","useQueryClient","execution","isLoading","error","refetch","isFetching","useMcpRunExecution","settings","useSettings","isCollapsed","toggle","useCollapsedSections","traceUrl","_a","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","jsxs","jsx","PageHeader","_b","events","summary","triggerCompleted","e","triggerInput","rawResult","result","ListToolbar","Stat","StatusBadge","DurationValue","DateValue","CopyableId","CollapsibleSection","JsonViewer","SwimlaneTimeline","EventTable","label","value","muted"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as m,j as s}from"./vendor-query-B2UbickB.js";import{a as T,u as F}from"./mcp-runs-C0C54hU6.js";import{a as R}from"./yaml-workflows-DolGRQ5f.js";import{u as M}from"./namespaces-6qWDXXJV.js";import{u as z}from"./useFilterParams-DZCAaBC7.js";import{D as E}from"./DataTable-D9yuBv0w.js";import{W as A}from"./WorkflowPill-Bg2-0Hkg.js";import{T as b}from"./TimestampCell-Bi2nc9Q_.js";import{E as L}from"./ElapsedCell-CzVjr74Y.js";import{P as U}from"./PageHeader-B_gV_jKk.js";import{F as I,b as h}from"./FilterBar-Ck4K4rzu.js";import{S as O}from"./StickyPagination-F9FZsRy9.js";import{L as W}from"./ListToolbar-DNAGFe14.js";import{R as B,a as H}from"./RowActions-Dg-Fsm5O.js";import{r as q}from"./vendor-icons-B_Yla7iD.js";import{c as G}from"./vendor-react-CX88sFS5.js";import"./index-DZX-E_3q.js";import"./EmptyState-BcsfPq9T.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},J={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},K={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function Q(f,a){return[{key:"workflow_id",label:"Run ID / Tool",render:e=>{const p=J[Y[e.status]??e.status]??"bg-status-pending",n=e.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[s.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${p}${n}`,title:e.status}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:e.workflow_id}),s.jsx("div",{className:"mt-0.5",children:e.entity?s.jsx(A,{type:e.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-[10px] text-text-tertiary",children:"—"})})]})]})}},{key:"created_at",label:"Created",sortable:!0,render:e=>s.jsx(b,{date:e.created_at}),className:"w-40"},{key:"updated_at",label:"Updated",sortable:!0,render:e=>s.jsx(b,{date:e.updated_at}),className:"w-40"},{key:"duration",label:"Duration",render:e=>s.jsx(L,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>s.jsxs(B,{children:[s.jsx(H,{icon:q,title:`Filter by ${e.entity}`,onClick:()=>f(e.entity)}),s.jsx("button",{onClick:p=>{p.stopPropagation(),a(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${K[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function xe(){const f=G(),{filters:a,setFilter:e,setFilters:p,pagination:n,sort:g,setSort:v}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[d,j]=m.useState(a.search);m.useEffect(()=>{if(d===a.search)return;const t=setTimeout(()=>e("search",d),300);return()=>clearTimeout(t)},[d,e,a.search]);const{data:r}=R(),{data:l}=M(),x=m.useMemo(()=>{const t=new Set((r==null?void 0:r.app_ids)??[]);for(const o of(l==null?void 0:l.namespaces)??[])t.add(o.name);return[...t].sort()},[r==null?void 0:r.app_ids,l==null?void 0:l.namespaces]),S=x.includes("hmsh")?"hmsh":x[0]??"",i=a.namespace||S,{data:c}=T(i),{data:u,isLoading:N,refetch:_,isFetching:k}=F({app_id:i,limit:n.pageSize,offset:n.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:g.sort_by||void 0,order:g.order||void 0}),y=(u==null?void 0:u.total)??0,C=(u==null?void 0:u.jobs)??[],$=Q(t=>e("entity",t),t=>e("status",t)),w=m.useMemo(()=>{const t=new Set(x);return i&&t.add(i),[...t].sort().map(o=>({value:o,label:o}))},[x,i]),P=m.useMemo(()=>{const t=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!t.has(a.entity)&&t.add(a.entity),[...t].sort().map(o=>({value:o,label:o}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(U,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:pipeline-executions"}),s.jsxs(I,{actions:s.jsx(W,{onRefresh:()=>_(),isFetching:k,apiPath:`/mcp-runs?app_id=${i||"longtail"}&limit=${n.pageSize}&offset=${n.offset}${a.entity?`&entity=${a.entity}`:""}${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[s.jsx(h,{label:"Namespace",value:i,onChange:t=>{p({namespace:t,entity:""})},options:w,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:d,onChange:t=>j(t.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(h,{label:"Tool",value:a.entity,onChange:t=>e("entity",t),options:P}),s.jsx(h,{label:"Status",value:a.status,onChange:t=>e("status",t),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(E,{columns:$,data:C,keyFn:t=>t.workflow_id,onRowClick:t=>f(`/mcp/executions/${encodeURIComponent(t.workflow_id)}?namespace=${i}`),isLoading:N,emptyMessage:"No pipeline executions found",sort:g,onSort:v}),s.jsx(O,{page:n.page,totalPages:n.totalPages(y),onPageChange:n.setPage,total:y,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{xe as McpRunsPage};
2
- //# sourceMappingURL=McpRunsPage-BlgcGN3k.js.map
1
+ import{a as m,j as s}from"./vendor-query-B2UbickB.js";import{a as T,u as F}from"./mcp-runs-BR4fvXXw.js";import{a as R}from"./yaml-workflows-DqbGpE2x.js";import{u as M}from"./namespaces-XOr9_XCV.js";import{u as z}from"./useFilterParams-DZCAaBC7.js";import{D as E}from"./DataTable-D9yuBv0w.js";import{W as A}from"./WorkflowPill-BkfIn8N3.js";import{T as b}from"./TimestampCell-_1fW34op.js";import{E as L}from"./ElapsedCell-fuG5wRDw.js";import{P as U}from"./PageHeader-B4w-LDUF.js";import{F as I,b as h}from"./FilterBar-Ck4K4rzu.js";import{S as O}from"./StickyPagination-BWhFSr2d.js";import{L as W}from"./ListToolbar-YHesiWwN.js";import{R as B,a as H}from"./RowActions-Dg-Fsm5O.js";import{t as q}from"./vendor-icons-5gSix3t2.js";import{c as G}from"./vendor-react-CX88sFS5.js";import"./index-B7Vxutyl.js";import"./EmptyState-BcsfPq9T.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},J={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},K={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function Q(f,a){return[{key:"workflow_id",label:"Run ID / Tool",render:e=>{const p=J[Y[e.status]??e.status]??"bg-status-pending",n=e.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[s.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full mt-1.5 ${p}${n}`,title:e.status}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:e.workflow_id}),s.jsx("div",{className:"mt-0.5",children:e.entity?s.jsx(A,{type:e.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-[10px] text-text-tertiary",children:"—"})})]})]})}},{key:"created_at",label:"Created",sortable:!0,render:e=>s.jsx(b,{date:e.created_at}),className:"w-40"},{key:"updated_at",label:"Updated",sortable:!0,render:e=>s.jsx(b,{date:e.updated_at}),className:"w-40"},{key:"duration",label:"Duration",render:e=>s.jsx(L,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>s.jsxs(B,{children:[s.jsx(H,{icon:q,title:`Filter by ${e.entity}`,onClick:()=>f(e.entity)}),s.jsx("button",{onClick:p=>{p.stopPropagation(),a(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${K[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"currentColor",children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function xe(){const f=G(),{filters:a,setFilter:e,setFilters:p,pagination:n,sort:g,setSort:v}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[d,j]=m.useState(a.search);m.useEffect(()=>{if(d===a.search)return;const t=setTimeout(()=>e("search",d),300);return()=>clearTimeout(t)},[d,e,a.search]);const{data:r}=R(),{data:l}=M(),x=m.useMemo(()=>{const t=new Set((r==null?void 0:r.app_ids)??[]);for(const o of(l==null?void 0:l.namespaces)??[])t.add(o.name);return[...t].sort()},[r==null?void 0:r.app_ids,l==null?void 0:l.namespaces]),S=x.includes("hmsh")?"hmsh":x[0]??"",i=a.namespace||S,{data:c}=T(i),{data:u,isLoading:N,refetch:_,isFetching:k}=F({app_id:i,limit:n.pageSize,offset:n.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:g.sort_by||void 0,order:g.order||void 0}),y=(u==null?void 0:u.total)??0,C=(u==null?void 0:u.jobs)??[],$=Q(t=>e("entity",t),t=>e("status",t)),w=m.useMemo(()=>{const t=new Set(x);return i&&t.add(i),[...t].sort().map(o=>({value:o,label:o}))},[x,i]),P=m.useMemo(()=>{const t=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!t.has(a.entity)&&t.add(a.entity),[...t].sort().map(o=>({value:o,label:o}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(U,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:pipeline-executions"}),s.jsxs(I,{actions:s.jsx(W,{onRefresh:()=>_(),isFetching:k,apiPath:`/mcp-runs?app_id=${i||"longtail"}&limit=${n.pageSize}&offset=${n.offset}${a.entity?`&entity=${a.entity}`:""}${a.status?`&status=${a.status}`:""}${a.search?`&search=${a.search}`:""}`}),children:[s.jsx(h,{label:"Namespace",value:i,onChange:t=>{p({namespace:t,entity:""})},options:w,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:d,onChange:t=>j(t.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(h,{label:"Tool",value:a.entity,onChange:t=>e("entity",t),options:P}),s.jsx(h,{label:"Status",value:a.status,onChange:t=>e("status",t),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(E,{columns:$,data:C,keyFn:t=>t.workflow_id,onRowClick:t=>f(`/mcp/executions/${encodeURIComponent(t.workflow_id)}?namespace=${i}`),isLoading:N,emptyMessage:"No pipeline executions found",sort:g,onSort:v}),s.jsx(O,{page:n.page,totalPages:n.totalPages(y),onPageChange:n.setPage,total:y,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{xe as McpRunsPage};
2
+ //# sourceMappingURL=McpRunsPage-5dVAu25-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpRunsPage-BlgcGN3k.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/mcp-runs';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\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 } from '../../api/types';\n\nconst statusMap: 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): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID / Tool',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[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 {row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-[10px] text-text-tertiary\">—</span>}\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\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 </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n const { data: nsData } = useNamespaces();\n\n const allNamespaceNames = useMemo(() => {\n const set = new Set(appIdData?.app_ids ?? []);\n for (const ns of nsData?.namespaces ?? []) {\n set.add(ns.name);\n }\n return [...set].sort();\n }, [appIdData?.app_ids, nsData?.namespaces]);\n\n // Default: URL param > 'hmsh' (if exists) > first in list\n const defaultNamespace = allNamespaceNames.includes('hmsh')\n ? 'hmsh'\n : allNamespaceNames[0] ?? '';\n const activeNamespace = filters.namespace || defaultNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\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.order || undefined,\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:pipeline-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/mcp-runs?app_id=${activeNamespace || 'longtail'}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run 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=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\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 </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\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":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","nsData","useNamespaces","allNamespaceNames","useMemo","set","ns","defaultNamespace","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","id","entities","known","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"i0BAkBA,MAAMA,EAAoC,CACxC,QAAS,cACT,UAAW,YACX,OAAQ,QACV,EAEMC,EAAqC,CACzC,YAAa,mBACb,UAAW,oBACX,OAAQ,iBACV,EAEMC,EAAwC,CAC5C,QAAS,qBACT,UAAW,sBACX,OAAQ,mBACV,EAEA,SAASC,EACPC,EACAC,EACiB,CACjB,MAAO,CACL,CACE,IAAK,cACL,MAAO,gBACP,OAASC,GAAQ,CACf,MAAMC,EAAWN,EAAWD,EAAUM,EAAI,MAAM,GAAKA,EAAI,MAAM,GAAK,oBAC9DE,EAAaF,EAAI,SAAW,UAAY,iBAAmB,GACjE,OACEG,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAW,4CAA4CH,CAAQ,GAAGC,CAAU,GAAI,MAAOF,EAAI,MAAA,CAAQ,EACzGG,EAAAA,KAAC,MAAA,CAAI,UAAU,UACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qDACb,SAAAJ,EAAI,YACP,EACAI,EAAAA,IAAC,OAAI,UAAU,SACZ,WAAI,OACDA,EAAAA,IAACC,GAAa,KAAML,EAAI,OAAQ,QAAQ,WAAW,KAAK,IAAA,CAAK,QAC5D,OAAA,CAAK,UAAU,iCAAiC,SAAA,GAAA,CAAC,CAAA,CACxD,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAAA,EAEF,CACE,IAAK,aACL,MAAO,UACP,SAAU,GACV,OAASA,SAASM,EAAA,CAAc,KAAMN,EAAI,WAAY,EACtD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,SAAU,GACV,OAASA,SAASM,EAAA,CAAc,KAAMN,EAAI,WAAY,EACtD,UAAW,MAAA,EAEb,CACE,IAAK,WACL,MAAO,WACP,OAASA,GACPI,EAAAA,IAACG,EAAA,CACC,UAAWP,EAAI,WACf,QAASA,EAAI,SAAW,UAAY,KAAOA,EAAI,WAC/C,OAAQA,EAAI,SAAW,SAAA,CAAA,EAG3B,UAAW,MAAA,EAEb,CACE,IAAK,UACL,MAAO,GACP,OAASA,GACPG,EAAAA,KAACK,EAAA,CACC,SAAA,CAAAJ,EAAAA,IAACK,EAAA,CACC,KAAMC,EACN,MAAO,aAAaV,EAAI,MAAM,GAC9B,QAAS,IAAMF,EAAeE,EAAI,MAAM,CAAA,CAAA,EAE1CI,EAAAA,IAAC,SAAA,CACC,QAAUO,GAAM,CAAEA,EAAE,gBAAA,EAAmBZ,EAAeC,EAAI,MAAM,CAAG,EACnE,UAAU,2DACV,MAAO,aAAaA,EAAI,MAAM,GAE9B,SAAAI,EAAAA,IAAC,OAAI,UAAW,qBAAqBR,EAAcI,EAAI,MAAM,GAAK,oBAAoB,oBAAqB,QAAQ,YAAY,KAAK,eAClI,eAAC,SAAA,CAAO,GAAG,KAAK,GAAG,KAAK,EAAE,GAAA,CAAI,CAAA,CAChC,CAAA,CAAA,CACF,EACF,EAEF,UAAW,iBAAA,CACb,CAEJ,CAEO,SAASY,IAAc,CAC5B,MAAMC,EAAWC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACpF,QAAS,CAAE,OAAQ,GAAI,OAAQ,GAAI,OAAQ,GAAI,UAAW,EAAA,CAAG,CAC9D,EAEK,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAST,EAAQ,MAAM,EAE7DU,EAAAA,UAAU,IAAM,CACd,GAAIH,IAAgBP,EAAQ,OAAQ,OACpC,MAAMW,EAAQ,WAAW,IAAMV,EAAU,SAAUM,CAAW,EAAG,GAAG,EACpE,MAAO,IAAM,aAAaI,CAAK,CACjC,EAAG,CAACJ,EAAaN,EAAWD,EAAQ,MAAM,CAAC,EAE3C,KAAM,CAAE,KAAMY,CAAA,EAAcC,EAAA,EACtB,CAAE,KAAMC,CAAA,EAAWC,EAAA,EAEnBC,EAAoBC,EAAAA,QAAQ,IAAM,CACtC,MAAMC,EAAM,IAAI,KAAIN,GAAA,YAAAA,EAAW,UAAW,CAAA,CAAE,EAC5C,UAAWO,KAAML,GAAA,YAAAA,EAAQ,aAAc,CAAA,EACrCI,EAAI,IAAIC,EAAG,IAAI,EAEjB,MAAO,CAAC,GAAGD,CAAG,EAAE,KAAA,CAClB,EAAG,CAACN,GAAA,YAAAA,EAAW,QAASE,GAAA,YAAAA,EAAQ,UAAU,CAAC,EAGrCM,EAAmBJ,EAAkB,SAAS,MAAM,EACtD,OACAA,EAAkB,CAAC,GAAK,GACtBK,EAAkBrB,EAAQ,WAAaoB,EACvC,CAAE,KAAME,GAAiBC,EAAeF,CAAe,EAEvD,CAAE,KAAMG,EAAU,UAAAC,EAAW,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAW,CACpE,OAAQP,EACR,MAAOlB,EAAW,SAClB,OAAQA,EAAW,OACnB,OAAQH,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,OAAQA,EAAQ,QAAU,OAC1B,QAASI,EAAK,SAAW,OACzB,MAAOA,EAAK,OAAS,MAAA,CACtB,EAEKyB,GAAQL,GAAA,YAAAA,EAAU,QAAS,EAC3BM,GAAON,GAAA,YAAAA,EAAU,OAAQ,CAAA,EAEzBO,EAAUjD,EACbkD,GAAW/B,EAAU,SAAU+B,CAAM,EACrCC,GAAWhC,EAAU,SAAUgC,CAAM,CAAA,EAGlCC,EAAajB,EAAAA,QAAQ,IAAM,CAC/B,MAAMC,EAAM,IAAI,IAAIF,CAAiB,EACrC,OAAIK,GAAiBH,EAAI,IAAIG,CAAe,EACrC,CAAC,GAAGH,CAAG,EAAE,OAAO,IAAKiB,IAAQ,CAAE,MAAOA,EAAI,MAAOA,GAAK,CAC/D,EAAG,CAACnB,EAAmBK,CAAe,CAAC,EAEjCe,EAAWnB,EAAAA,QAAQ,IAAM,CAC7B,MAAMoB,EAAQ,IAAI,KAAIf,GAAA,YAAAA,EAAc,WAAY,CAAA,CAAE,EAClD,OAAItB,EAAQ,QAAU,CAACqC,EAAM,IAAIrC,EAAQ,MAAM,GAAGqC,EAAM,IAAIrC,EAAQ,MAAM,EACnE,CAAC,GAAGqC,CAAK,EAAE,OAAO,IAAKzC,IAAO,CAAE,MAAOA,EAAG,MAAOA,GAAI,CAC9D,EAAG,CAAC0B,GAAA,YAAAA,EAAc,SAAUtB,EAAQ,MAAM,CAAC,EAE3C,cACG,MAAA,CACC,SAAA,CAAAX,EAAAA,IAACiD,EAAA,CAAW,MAAM,sBAAsB,SAAS,yCAAyC,EAE1FlD,OAACmD,GAAU,QACTlD,EAAAA,IAACmD,EAAA,CACC,UAAW,IAAMd,EAAA,EACjB,WAAAC,EACA,QAAS,oBAAoBN,GAAmB,UAAU,UAAUlB,EAAW,QAAQ,WAAWA,EAAW,MAAM,GAAGH,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGA,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,GAAGA,EAAQ,OAAS,WAAWA,EAAQ,MAAM,GAAK,EAAE,EAAA,CAAA,EAGjR,SAAA,CAAAX,EAAAA,IAACoD,EAAA,CACC,MAAM,YACN,MAAOpB,EACP,SAAWqB,GAAM,CACfxC,EAAW,CAAE,UAAWwC,EAAG,OAAQ,GAAI,CACzC,EACA,QAASR,EACT,SAAQ,EAAA,CAAA,EAEV7C,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,YAAY,mBACZ,MAAOkB,EACP,SAAWX,GAAMY,EAAeZ,EAAE,OAAO,KAAK,EAC9C,UAAU,kCAAA,CAAA,EAEZP,EAAAA,IAACoD,EAAA,CACC,MAAM,OACN,MAAOzC,EAAQ,OACf,SAAW0C,GAAMzC,EAAU,SAAUyC,CAAC,EACtC,QAASN,CAAA,CAAA,EAEX/C,EAAAA,IAACoD,EAAA,CACC,MAAM,SACN,MAAOzC,EAAQ,OACf,SAAW0C,GAAMzC,EAAU,SAAUyC,CAAC,EACtC,QAAS,CACP,CAAE,MAAO,UAAW,MAAO,SAAA,EAC3B,CAAE,MAAO,YAAa,MAAO,WAAA,EAC7B,CAAE,MAAO,SAAU,MAAO,QAAA,CAAS,CACrC,CAAA,CACF,EACF,EAEArD,EAAAA,IAACsD,EAAA,CACC,QAAAZ,EACA,KAAMD,EACN,MAAQ7C,GAAQA,EAAI,YACpB,WAAaA,GAAQa,EAAS,mBAAmB,mBAAmBb,EAAI,WAAW,CAAC,cAAcoC,CAAe,EAAE,EACnH,UAAAI,EACA,aAAa,+BACb,KAAArB,EACA,OAAQC,CAAA,CAAA,EAGVhB,EAAAA,IAACuD,EAAA,CACC,KAAMzC,EAAW,KACjB,WAAYA,EAAW,WAAW0B,CAAK,EACvC,aAAc1B,EAAW,QACzB,MAAA0B,EACA,SAAU1B,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
1
+ {"version":3,"file":"McpRunsPage-5dVAu25-.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/mcp-runs';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useNamespaces } from '../../api/namespaces';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\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 } from '../../api/types';\n\nconst statusMap: 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): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID / Tool',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[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 {row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-[10px] text-text-tertiary\">—</span>}\n </div>\n </div>\n </div>\n );\n },\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <TimestampCell date={row.updated_at} />,\n className: 'w-40',\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 </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n const { data: nsData } = useNamespaces();\n\n const allNamespaceNames = useMemo(() => {\n const set = new Set(appIdData?.app_ids ?? []);\n for (const ns of nsData?.namespaces ?? []) {\n set.add(ns.name);\n }\n return [...set].sort();\n }, [appIdData?.app_ids, nsData?.namespaces]);\n\n // Default: URL param > 'hmsh' (if exists) > first in list\n const defaultNamespace = allNamespaceNames.includes('hmsh')\n ? 'hmsh'\n : allNamespaceNames[0] ?? '';\n const activeNamespace = filters.namespace || defaultNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\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.order || undefined,\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:pipeline-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/mcp-runs?app_id=${activeNamespace || 'longtail'}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.entity ? `&entity=${filters.entity}` : ''}${filters.status ? `&status=${filters.status}` : ''}${filters.search ? `&search=${filters.search}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run 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=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\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 </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\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":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","TimestampCell","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","nsData","useNamespaces","allNamespaceNames","useMemo","set","ns","defaultNamespace","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","id","entities","known","PageHeader","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./vendor-query-B2UbickB.js";import{j as b,s as j,p as v,r as P}from"./index-DZX-E_3q.js";import{f as C}from"./useEventHooks-CPyvFlVR.js";import{u as $}from"./roles-Dtj0uabn.js";import{u as L}from"./useFilterParams-DZCAaBC7.js";import{D as R}from"./DataTable-D9yuBv0w.js";import{P as _}from"./PageHeader-B_gV_jKk.js";import{S as w}from"./StickyPagination-F9FZsRy9.js";import{R as F,a as N}from"./RowActions-Dg-Fsm5O.js";import{a as T,T as k,E as z}from"./escalation-columns-C0slywOY.js";import{L as A}from"./ListToolbar-DNAGFe14.js";import{a2 as M}from"./vendor-icons-B_Yla7iD.js";import{c as O}from"./vendor-react-CX88sFS5.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-BOBytzrP.js";import"./WorkflowPill-Bg2-0Hkg.js";import"./TimestampCell-Bi2nc9Q_.js";import"./escalation-DilnDxw2.js";function re(){C();const c=O(),{user:n}=b(),{filters:e,setFilter:d,pagination:t,sort:r,setSort:g}=L({filters:{role:"",type:"",priority:""}}),u=j(),{data:l}=$(),{data:p}=v(),{data:a,isLoading:f,error:i,refetch:y,isFetching:x}=P({assigned_to:n==null?void 0:n.userId,status:"pending",role:e.role||void 0,type:e.type||void 0,priority:e.priority?parseInt(e.priority):void 0,limit:t.pageSize,offset:t.offset,sort_by:r.sort_by||void 0,order:r.sort_by?r.order:void 0}),h=((a==null?void 0:a.escalations)??[]).filter(o=>o.assigned_until&&new Date(o.assigned_until)>new Date),m=(a==null?void 0:a.total)??0,E={key:"actions",label:"",render:o=>s.jsx(F,{children:s.jsx(N,{icon:M,title:"Release escalation",onClick:()=>u.mutate(o.id),colorClass:"text-text-tertiary hover:text-status-warning"})}),className:"w-16 text-right"},S=[k,...z,E];return s.jsxs("div",{children:[s.jsx(_,{title:"My Escalations"}),s.jsx(T,{filters:e,setFilter:d,roles:(l==null?void 0:l.roles)??[],types:(p==null?void 0:p.types)??[],actions:s.jsx(A,{onRefresh:()=>y(),isFetching:x,apiPath:`/escalations?status=claimed&limit=${t.pageSize}&offset=${t.offset}${e.role?`&role=${e.role}`:""}${e.type?`&type=${e.type}`:""}${e.priority?`&priority=${e.priority}`:""}`})}),i&&s.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:i.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${i.message}`}),s.jsx(R,{columns:S,data:h,keyFn:o=>o.id,onRowClick:o=>c(`/escalations/detail/${o.id}`,{state:{from:"/escalations/queue"}}),isLoading:f,emptyMessage:i?"Unable to load data":"No assigned escalations",sort:r,onSort:g}),s.jsx(w,{page:t.page,totalPages:t.totalPages(m),onPageChange:t.setPage,total:m,pageSize:t.pageSize,onPageSizeChange:t.setPageSize})]})}export{re as OperatorDashboard};
2
- //# sourceMappingURL=OperatorDashboard-BbO6cWzb.js.map
1
+ import{j as s}from"./vendor-query-B2UbickB.js";import{j as b,s as j,p as v,r as P}from"./index-B7Vxutyl.js";import{f as C}from"./useEventHooks-DpvfSw9p.js";import{u as $}from"./roles-yuxJgQBf.js";import{u as L}from"./useFilterParams-DZCAaBC7.js";import{D as R}from"./DataTable-D9yuBv0w.js";import{P as _}from"./PageHeader-B4w-LDUF.js";import{S as w}from"./StickyPagination-BWhFSr2d.js";import{R as F,a as N}from"./RowActions-Dg-Fsm5O.js";import{a as T,T as k,E as z}from"./escalation-columns-C6sLGnSX.js";import{L as A}from"./ListToolbar-YHesiWwN.js";import{a3 as M}from"./vendor-icons-5gSix3t2.js";import{c as O}from"./vendor-react-CX88sFS5.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-Dk-YUxCm.js";import"./WorkflowPill-BkfIn8N3.js";import"./TimestampCell-_1fW34op.js";import"./escalation-SGea3mBy.js";function re(){C();const c=O(),{user:n}=b(),{filters:e,setFilter:d,pagination:t,sort:r,setSort:g}=L({filters:{role:"",type:"",priority:""}}),u=j(),{data:l}=$(),{data:p}=v(),{data:a,isLoading:f,error:i,refetch:y,isFetching:x}=P({assigned_to:n==null?void 0:n.userId,status:"pending",role:e.role||void 0,type:e.type||void 0,priority:e.priority?parseInt(e.priority):void 0,limit:t.pageSize,offset:t.offset,sort_by:r.sort_by||void 0,order:r.sort_by?r.order:void 0}),h=((a==null?void 0:a.escalations)??[]).filter(o=>o.assigned_until&&new Date(o.assigned_until)>new Date),m=(a==null?void 0:a.total)??0,E={key:"actions",label:"",render:o=>s.jsx(F,{children:s.jsx(N,{icon:M,title:"Release escalation",onClick:()=>u.mutate(o.id),colorClass:"text-text-tertiary hover:text-status-warning"})}),className:"w-16 text-right"},S=[k,...z,E];return s.jsxs("div",{children:[s.jsx(_,{title:"My Escalations"}),s.jsx(T,{filters:e,setFilter:d,roles:(l==null?void 0:l.roles)??[],types:(p==null?void 0:p.types)??[],actions:s.jsx(A,{onRefresh:()=>y(),isFetching:x,apiPath:`/escalations?status=claimed&limit=${t.pageSize}&offset=${t.offset}${e.role?`&role=${e.role}`:""}${e.type?`&type=${e.type}`:""}${e.priority?`&priority=${e.priority}`:""}`})}),i&&s.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:i.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${i.message}`}),s.jsx(R,{columns:S,data:h,keyFn:o=>o.id,onRowClick:o=>c(`/escalations/detail/${o.id}`,{state:{from:"/escalations/queue"}}),isLoading:f,emptyMessage:i?"Unable to load data":"No assigned escalations",sort:r,onSort:g}),s.jsx(w,{page:t.page,totalPages:t.totalPages(m),onPageChange:t.setPage,total:m,pageSize:t.pageSize,onPageSizeChange:t.setPageSize})]})}export{re as OperatorDashboard};
2
+ //# sourceMappingURL=OperatorDashboard-DNJtUDxl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OperatorDashboard-BbO6cWzb.js","sources":["../../src/pages/operator/OperatorDashboard.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { LockOpen } from 'lucide-react';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalations, useEscalationTypes, useReleaseEscalation } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ESCALATION_COLUMNS, TIME_LEFT_COLUMN, EscalationFilterBar } from './escalation-columns';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function OperatorDashboard() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '' },\n });\n const release = useReleaseEscalation();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n const { data, isLoading, error: queryError, refetch, isFetching } = useEscalations({\n assigned_to: user?.userId,\n status: 'pending',\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n });\n\n // Exclude expired claims — they're back in the available pool\n const activeClaims = (data?.escalations ?? []).filter(\n (e) => e.assigned_until && new Date(e.assigned_until) > new Date(),\n );\n const total = data?.total ?? 0;\n\n const releaseColumn: Column<LTEscalationRecord> = {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={LockOpen}\n title=\"Release escalation\"\n onClick={() => release.mutate(row.id)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n };\n\n // Time-left first (aligns with checkbox on All Escalations), then summary + base columns + actions\n const columns: Column<LTEscalationRecord>[] = [\n TIME_LEFT_COLUMN,\n ...ESCALATION_COLUMNS,\n releaseColumn,\n ];\n\n return (\n <div>\n <PageHeader title=\"My Escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations?status=claimed&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={activeClaims}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/queue' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No assigned escalations'}\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":["OperatorDashboard","useEscalationListEvents","navigate","useNavigate","user","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","release","useReleaseEscalation","rolesData","useRoles","typesData","useEscalationTypes","data","isLoading","queryError","refetch","isFetching","useEscalations","activeClaims","e","total","releaseColumn","row","jsx","RowActionGroup","RowAction","LockOpen","columns","TIME_LEFT_COLUMN","ESCALATION_COLUMNS","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination"],"mappings":"k3BAeO,SAASA,IAAoB,CAClCC,EAAA,EACA,MAAMC,EAAWC,EAAA,EACX,CAAE,KAAAC,CAAA,EAASC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,KAAM,GAAI,KAAM,GAAI,SAAU,EAAA,CAAG,CAC7C,EACKC,EAAUC,EAAA,EACV,CAAE,KAAMC,CAAA,EAAcC,EAAA,EACtB,CAAE,KAAMC,CAAA,EAAcC,EAAA,EAEtB,CAAE,KAAAC,EAAM,UAAAC,EAAW,MAAOC,EAAY,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAe,CACjF,YAAanB,GAAA,YAAAA,EAAM,OACnB,OAAQ,UACR,KAAME,EAAQ,MAAQ,OACtB,KAAMA,EAAQ,MAAQ,OACtB,SAAUA,EAAQ,SAAW,SAASA,EAAQ,QAAQ,EAAI,OAC1D,MAAOE,EAAW,SAClB,OAAQA,EAAW,OACnB,QAASC,EAAK,SAAW,OACzB,MAAOA,EAAK,QAAUA,EAAK,MAAQ,MAAA,CACpC,EAGKe,IAAgBN,GAAA,YAAAA,EAAM,cAAe,CAAA,GAAI,OAC5CO,GAAMA,EAAE,gBAAkB,IAAI,KAAKA,EAAE,cAAc,EAAI,IAAI,IAAK,EAE7DC,GAAQR,GAAA,YAAAA,EAAM,QAAS,EAEvBS,EAA4C,CAChD,IAAK,UACL,MAAO,GACP,OAASC,GACPC,EAAAA,IAACC,EAAA,CACC,SAAAD,EAAAA,IAACE,EAAA,CACC,KAAMC,EACN,MAAM,qBACN,QAAS,IAAMpB,EAAQ,OAAOgB,EAAI,EAAE,EACpC,WAAW,8CAAA,CAAA,EAEf,EAEF,UAAW,iBAAA,EAIPK,EAAwC,CAC5CC,EACA,GAAGC,EACHR,CAAA,EAGF,cACG,MAAA,CACC,SAAA,CAAAE,EAAAA,IAACO,EAAA,CAAW,MAAM,gBAAA,CAAiB,EAEnCP,EAAAA,IAACQ,EAAA,CACC,QAAA/B,EACA,UAAAC,EACA,OAAOO,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,OAAOE,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,QACEa,EAAAA,IAACS,EAAA,CACC,UAAW,IAAMjB,EAAA,EACjB,WAAAC,EACA,QAAS,qCAAqCd,EAAW,QAAQ,WAAWA,EAAW,MAAM,GAAGF,EAAQ,KAAO,SAASA,EAAQ,IAAI,GAAK,EAAE,GAAGA,EAAQ,KAAO,SAASA,EAAQ,IAAI,GAAK,EAAE,GAAGA,EAAQ,SAAW,aAAaA,EAAQ,QAAQ,GAAK,EAAE,EAAA,CAAA,CACrP,CAAA,EAIHc,GACCS,EAAAA,IAAC,MAAA,CAAI,UAAU,uGACX,SAAAT,EAAqB,UAAY,kBAC/B,iDACA,+BAAgCA,EAAqB,OAAO,GAClE,EAGFS,EAAAA,IAACU,EAAA,CACC,QAAAN,EACA,KAAMT,EACN,MAAQI,GAAQA,EAAI,GACpB,WAAaA,GAAQ1B,EAAS,uBAAuB0B,EAAI,EAAE,GAAI,CAAE,MAAO,CAAE,KAAM,oBAAA,EAAwB,EACxG,UAAAT,EACA,aAAcC,EAAa,sBAAwB,0BACnD,KAAAX,EACA,OAAQC,CAAA,CAAA,EAGVmB,EAAAA,IAACW,EAAA,CACC,KAAMhC,EAAW,KACjB,WAAYA,EAAW,WAAWkB,CAAK,EACvC,aAAclB,EAAW,QACzB,MAAAkB,EACA,SAAUlB,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
1
+ {"version":3,"file":"OperatorDashboard-DNJtUDxl.js","sources":["../../src/pages/operator/OperatorDashboard.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { LockOpen } from 'lucide-react';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalations, useEscalationTypes, useReleaseEscalation } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ESCALATION_COLUMNS, TIME_LEFT_COLUMN, EscalationFilterBar } from './escalation-columns';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function OperatorDashboard() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '' },\n });\n const release = useReleaseEscalation();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n const { data, isLoading, error: queryError, refetch, isFetching } = useEscalations({\n assigned_to: user?.userId,\n status: 'pending',\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n });\n\n // Exclude expired claims — they're back in the available pool\n const activeClaims = (data?.escalations ?? []).filter(\n (e) => e.assigned_until && new Date(e.assigned_until) > new Date(),\n );\n const total = data?.total ?? 0;\n\n const releaseColumn: Column<LTEscalationRecord> = {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={LockOpen}\n title=\"Release escalation\"\n onClick={() => release.mutate(row.id)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n };\n\n // Time-left first (aligns with checkbox on All Escalations), then summary + base columns + actions\n const columns: Column<LTEscalationRecord>[] = [\n TIME_LEFT_COLUMN,\n ...ESCALATION_COLUMNS,\n releaseColumn,\n ];\n\n return (\n <div>\n <PageHeader title=\"My Escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations?status=claimed&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={activeClaims}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/queue' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No assigned escalations'}\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":["OperatorDashboard","useEscalationListEvents","navigate","useNavigate","user","useAuth","filters","setFilter","pagination","sort","setSort","useFilterParams","release","useReleaseEscalation","rolesData","useRoles","typesData","useEscalationTypes","data","isLoading","queryError","refetch","isFetching","useEscalations","activeClaims","e","total","releaseColumn","row","jsx","RowActionGroup","RowAction","LockOpen","columns","TIME_LEFT_COLUMN","ESCALATION_COLUMNS","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination"],"mappings":"k3BAeO,SAASA,IAAoB,CAClCC,EAAA,EACA,MAAMC,EAAWC,EAAA,EACX,CAAE,KAAAC,CAAA,EAASC,EAAA,EACX,CAAE,QAAAC,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,EAAgB,CACxE,QAAS,CAAE,KAAM,GAAI,KAAM,GAAI,SAAU,EAAA,CAAG,CAC7C,EACKC,EAAUC,EAAA,EACV,CAAE,KAAMC,CAAA,EAAcC,EAAA,EACtB,CAAE,KAAMC,CAAA,EAAcC,EAAA,EAEtB,CAAE,KAAAC,EAAM,UAAAC,EAAW,MAAOC,EAAY,QAAAC,EAAS,WAAAC,CAAA,EAAeC,EAAe,CACjF,YAAanB,GAAA,YAAAA,EAAM,OACnB,OAAQ,UACR,KAAME,EAAQ,MAAQ,OACtB,KAAMA,EAAQ,MAAQ,OACtB,SAAUA,EAAQ,SAAW,SAASA,EAAQ,QAAQ,EAAI,OAC1D,MAAOE,EAAW,SAClB,OAAQA,EAAW,OACnB,QAASC,EAAK,SAAW,OACzB,MAAOA,EAAK,QAAUA,EAAK,MAAQ,MAAA,CACpC,EAGKe,IAAgBN,GAAA,YAAAA,EAAM,cAAe,CAAA,GAAI,OAC5CO,GAAMA,EAAE,gBAAkB,IAAI,KAAKA,EAAE,cAAc,EAAI,IAAI,IAAK,EAE7DC,GAAQR,GAAA,YAAAA,EAAM,QAAS,EAEvBS,EAA4C,CAChD,IAAK,UACL,MAAO,GACP,OAASC,GACPC,EAAAA,IAACC,EAAA,CACC,SAAAD,EAAAA,IAACE,EAAA,CACC,KAAMC,EACN,MAAM,qBACN,QAAS,IAAMpB,EAAQ,OAAOgB,EAAI,EAAE,EACpC,WAAW,8CAAA,CAAA,EAEf,EAEF,UAAW,iBAAA,EAIPK,EAAwC,CAC5CC,EACA,GAAGC,EACHR,CAAA,EAGF,cACG,MAAA,CACC,SAAA,CAAAE,EAAAA,IAACO,EAAA,CAAW,MAAM,gBAAA,CAAiB,EAEnCP,EAAAA,IAACQ,EAAA,CACC,QAAA/B,EACA,UAAAC,EACA,OAAOO,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,OAAOE,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,QACEa,EAAAA,IAACS,EAAA,CACC,UAAW,IAAMjB,EAAA,EACjB,WAAAC,EACA,QAAS,qCAAqCd,EAAW,QAAQ,WAAWA,EAAW,MAAM,GAAGF,EAAQ,KAAO,SAASA,EAAQ,IAAI,GAAK,EAAE,GAAGA,EAAQ,KAAO,SAASA,EAAQ,IAAI,GAAK,EAAE,GAAGA,EAAQ,SAAW,aAAaA,EAAQ,QAAQ,GAAK,EAAE,EAAA,CAAA,CACrP,CAAA,EAIHc,GACCS,EAAAA,IAAC,MAAA,CAAI,UAAU,uGACX,SAAAT,EAAqB,UAAY,kBAC/B,iDACA,+BAAgCA,EAAqB,OAAO,GAClE,EAGFS,EAAAA,IAACU,EAAA,CACC,QAAAN,EACA,KAAMT,EACN,MAAQI,GAAQA,EAAI,GACpB,WAAaA,GAAQ1B,EAAS,uBAAuB0B,EAAI,EAAE,GAAI,CAAE,MAAO,CAAE,KAAM,oBAAA,EAAwB,EACxG,UAAAT,EACA,aAAcC,EAAa,sBAAwB,0BACnD,KAAAX,EACA,OAAQC,CAAA,CAAA,EAGVmB,EAAAA,IAACW,EAAA,CACC,KAAMhC,EAAW,KACjB,WAAYA,EAAW,WAAWkB,CAAK,EACvC,aAAclB,EAAW,QACzB,MAAAkB,EACA,SAAUlB,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-B_Yla7iD.js";function l({title:a,actions:t,docsHash:s}){return e.jsxs("div",{className:"flex items-center gap-4 mb-10",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-1",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:a}),s&&e.jsx("button",{onClick:()=>{window.location.hash=s},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),t&&e.jsx("div",{className:"flex items-center gap-3",children:t})]})}export{l as P};
2
- //# sourceMappingURL=PageHeader-B_gV_jKk.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-5gSix3t2.js";function l({title:a,actions:t,docsHash:s}){return e.jsxs("div",{className:"flex items-center gap-4 mb-10",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-1",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:a}),s&&e.jsx("button",{onClick:()=>{window.location.hash=s},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),t&&e.jsx("div",{className:"flex items-center gap-3",children:t})]})}export{l as P};
2
+ //# sourceMappingURL=PageHeader-B4w-LDUF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageHeader-B_gV_jKk.js","sources":["../../src/components/common/layout/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\ninterface PageHeaderProps {\n title: string;\n actions?: ReactNode;\n /** Hash link to open the docs drawer to a specific section, e.g. \"#docs=dashboard.md#workflow-registry\" */\n docsHash?: string;\n}\n\nexport function PageHeader({ title, actions, docsHash }: PageHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-10\">\n <div className=\"flex items-center gap-2 flex-1\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n );\n}\n"],"names":["PageHeader","title","actions","docsHash","jsxs","jsx","BookOpen"],"mappings":"8FAUO,SAASA,EAAW,CAAE,MAAAC,EAAO,QAAAC,EAAS,SAAAC,GAA6B,CACxE,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAJ,EAAM,EAC5DE,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCJ,GAAWG,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAH,CAAA,CAAQ,CAAA,EAChE,CAEJ"}
1
+ {"version":3,"file":"PageHeader-B4w-LDUF.js","sources":["../../src/components/common/layout/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\ninterface PageHeaderProps {\n title: string;\n actions?: ReactNode;\n /** Hash link to open the docs drawer to a specific section, e.g. \"#docs=dashboard.md#workflow-registry\" */\n docsHash?: string;\n}\n\nexport function PageHeader({ title, actions, docsHash }: PageHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-10\">\n <div className=\"flex items-center gap-2 flex-1\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n );\n}\n"],"names":["PageHeader","title","actions","docsHash","jsxs","jsx","BookOpen"],"mappings":"8FAUO,SAASA,EAAW,CAAE,MAAAC,EAAO,QAAAC,EAAS,SAAAC,GAA6B,CACxE,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAJ,EAAM,EAC5DE,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCJ,GAAWG,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAH,CAAA,CAAQ,CAAA,EAChE,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-B_Yla7iD.js";function m({title:n,subtitle:a,stats:s,actions:l,docsHash:i}){return e.jsxs("div",{className:"flex items-baseline justify-between mb-10",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:n}),i&&e.jsx("button",{onClick:()=>{window.location.hash=i},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),a&&e.jsx("span",{className:"text-sm text-text-tertiary font-light",children:a})]}),e.jsxs("div",{className:"flex items-center gap-5",children:[s==null?void 0:s.map(t=>e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-text-tertiary",children:[t.dotClass&&e.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${t.dotClass}`}),e.jsx("span",{children:t.label}),e.jsx("span",{className:"font-medium text-text-secondary",children:t.value})]},t.label)),l&&e.jsx("div",{className:"flex items-center gap-3",children:l})]})]})}export{m as P};
2
- //# sourceMappingURL=PageHeaderWithStats-D0I0nrnx.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-5gSix3t2.js";function m({title:n,subtitle:a,stats:s,actions:l,docsHash:i}){return e.jsxs("div",{className:"flex items-baseline justify-between mb-10",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:n}),i&&e.jsx("button",{onClick:()=>{window.location.hash=i},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),a&&e.jsx("span",{className:"text-sm text-text-tertiary font-light",children:a})]}),e.jsxs("div",{className:"flex items-center gap-5",children:[s==null?void 0:s.map(t=>e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-text-tertiary",children:[t.dotClass&&e.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${t.dotClass}`}),e.jsx("span",{children:t.label}),e.jsx("span",{className:"font-medium text-text-secondary",children:t.value})]},t.label)),l&&e.jsx("div",{className:"flex items-center gap-3",children:l})]})]})}export{m as P};
2
+ //# sourceMappingURL=PageHeaderWithStats-DQmNXYcG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageHeaderWithStats-D0I0nrnx.js","sources":["../../src/components/common/layout/PageHeaderWithStats.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\nexport interface InlineStat {\n label: string;\n value: string | number;\n dotClass?: string;\n}\n\ninterface PageHeaderWithStatsProps {\n title: string;\n subtitle?: string;\n stats?: InlineStat[];\n actions?: ReactNode;\n docsHash?: string;\n}\n\nexport function PageHeaderWithStats({\n title,\n subtitle,\n stats,\n actions,\n docsHash,\n}: PageHeaderWithStatsProps) {\n return (\n <div className=\"flex items-baseline justify-between mb-10\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {subtitle && (\n <span className=\"text-sm text-text-tertiary font-light\">{subtitle}</span>\n )}\n </div>\n <div className=\"flex items-center gap-5\">\n {stats?.map((s) => (\n <div key={s.label} className=\"flex items-center gap-1.5 text-xs text-text-tertiary\">\n {s.dotClass && <span className={`w-1.5 h-1.5 rounded-full ${s.dotClass}`} />}\n <span>{s.label}</span>\n <span className=\"font-medium text-text-secondary\">{s.value}</span>\n </div>\n ))}\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n </div>\n );\n}\n"],"names":["PageHeaderWithStats","title","subtitle","stats","actions","docsHash","jsxs","jsx","BookOpen","s"],"mappings":"8FAiBO,SAASA,EAAoB,CAClC,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAA6B,CAC3B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAN,EAAM,EAC5DI,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCN,GACCK,EAAAA,IAAC,OAAA,CAAK,UAAU,wCAAyC,SAAAL,CAAA,CAAS,CAAA,EAEtE,EACAI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAH,GAAA,YAAAA,EAAO,IAAKM,GACXH,EAAAA,KAAC,MAAA,CAAkB,UAAU,uDAC1B,SAAA,CAAAG,EAAE,UAAYF,MAAC,OAAA,CAAK,UAAW,4BAA4BE,EAAE,QAAQ,GAAI,EAC1EF,EAAAA,IAAC,OAAA,CAAM,SAAAE,EAAE,KAAA,CAAM,EACfF,EAAAA,IAAC,OAAA,CAAK,UAAU,kCAAmC,WAAE,KAAA,CAAM,CAAA,GAHnDE,EAAE,KAIZ,GAEDL,GAAWG,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAH,CAAA,CAAQ,CAAA,CAAA,CAChE,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"PageHeaderWithStats-DQmNXYcG.js","sources":["../../src/components/common/layout/PageHeaderWithStats.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\nexport interface InlineStat {\n label: string;\n value: string | number;\n dotClass?: string;\n}\n\ninterface PageHeaderWithStatsProps {\n title: string;\n subtitle?: string;\n stats?: InlineStat[];\n actions?: ReactNode;\n docsHash?: string;\n}\n\nexport function PageHeaderWithStats({\n title,\n subtitle,\n stats,\n actions,\n docsHash,\n}: PageHeaderWithStatsProps) {\n return (\n <div className=\"flex items-baseline justify-between mb-10\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {subtitle && (\n <span className=\"text-sm text-text-tertiary font-light\">{subtitle}</span>\n )}\n </div>\n <div className=\"flex items-center gap-5\">\n {stats?.map((s) => (\n <div key={s.label} className=\"flex items-center gap-1.5 text-xs text-text-tertiary\">\n {s.dotClass && <span className={`w-1.5 h-1.5 rounded-full ${s.dotClass}`} />}\n <span>{s.label}</span>\n <span className=\"font-medium text-text-secondary\">{s.value}</span>\n </div>\n ))}\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n </div>\n );\n}\n"],"names":["PageHeaderWithStats","title","subtitle","stats","actions","docsHash","jsxs","jsx","BookOpen","s"],"mappings":"8FAiBO,SAASA,EAAoB,CAClC,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAA6B,CAC3B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAN,EAAM,EAC5DI,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCN,GACCK,EAAAA,IAAC,OAAA,CAAK,UAAU,wCAAyC,SAAAL,CAAA,CAAS,CAAA,EAEtE,EACAI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAH,GAAA,YAAAA,EAAO,IAAKM,GACXH,EAAAA,KAAC,MAAA,CAAkB,UAAU,uDAC1B,SAAA,CAAAG,EAAE,UAAYF,MAAC,OAAA,CAAK,UAAW,4BAA4BE,EAAE,QAAQ,GAAI,EAC1EF,EAAAA,IAAC,OAAA,CAAM,SAAAE,EAAE,KAAA,CAAM,EACfF,EAAAA,IAAC,OAAA,CAAK,UAAU,kCAAmC,WAAE,KAAA,CAAM,CAAA,GAHnDE,EAAE,KAIZ,GAEDL,GAAWG,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAH,CAAA,CAAQ,CAAA,CAAA,CAChE,CAAA,EACF,CAEJ"}