@hotmeshio/long-tail 0.18.0 → 0.19.0

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 (283) hide show
  1. package/build/api/escalations/index.d.ts +1 -1
  2. package/build/api/escalations/index.js +2 -1
  3. package/build/api/escalations/list.d.ts +11 -0
  4. package/build/api/escalations/list.js +31 -2
  5. package/build/api/settings.js +2 -0
  6. package/build/api/users.d.ts +11 -0
  7. package/build/api/users.js +19 -0
  8. package/build/index.js +6 -0
  9. package/build/lib/uuid.d.ts +11 -0
  10. package/build/lib/uuid.js +20 -0
  11. package/build/modules/search.d.ts +21 -0
  12. package/build/modules/search.js +55 -0
  13. package/build/routes/escalations/list.js +10 -1
  14. package/build/routes/users.js +9 -0
  15. package/build/scripts/ortho-populate.d.ts +3 -1
  16. package/build/scripts/ortho-populate.js +15 -5
  17. package/build/sdk/index.d.ts +1 -0
  18. package/build/services/escalation/batch.js +3 -0
  19. package/build/services/escalation/bulk.js +8 -0
  20. package/build/services/escalation/crud.js +26 -0
  21. package/build/services/escalation/queries.d.ts +14 -1
  22. package/build/services/escalation/queries.js +49 -7
  23. package/build/services/escalation/sql.d.ts +4 -2
  24. package/build/services/escalation/sql.js +4 -0
  25. package/build/services/role/types.d.ts +18 -0
  26. package/build/services/role/types.js +6 -0
  27. package/build/services/user/auth.js +2 -2
  28. package/build/services/user/crud.d.ts +13 -0
  29. package/build/services/user/crud.js +26 -3
  30. package/build/services/user/index.d.ts +1 -1
  31. package/build/services/user/index.js +2 -1
  32. package/build/services/user/sql.d.ts +11 -5
  33. package/build/services/user/sql.js +18 -6
  34. package/build/start/adapters.js +2 -0
  35. package/build/tsconfig.tsbuildinfo +1 -1
  36. package/build/types/startup.d.ts +12 -1
  37. package/dashboard/dist/assets/{AdminDashboard-mULAQuHV.js → AdminDashboard-DPkWtPc1.js} +2 -2
  38. package/dashboard/dist/assets/{AdminDashboard-mULAQuHV.js.map → AdminDashboard-DPkWtPc1.js.map} +1 -1
  39. package/dashboard/dist/assets/{AgentConfigPage-DHdzgXcr.js → AgentConfigPage-DRfnLiQS.js} +6 -6
  40. package/dashboard/dist/assets/{AgentConfigPage-DHdzgXcr.js.map → AgentConfigPage-DRfnLiQS.js.map} +1 -1
  41. package/dashboard/dist/assets/{AgentDetailPage-Du_33U2u.js → AgentDetailPage-CufRZXnT.js} +3 -3
  42. package/dashboard/dist/assets/{AgentDetailPage-Du_33U2u.js.map → AgentDetailPage-CufRZXnT.js.map} +1 -1
  43. package/dashboard/dist/assets/{AgentsPage-4KkQO2Hl.js → AgentsPage-CoCWGhUd.js} +2 -2
  44. package/dashboard/dist/assets/{AgentsPage-4KkQO2Hl.js.map → AgentsPage-CoCWGhUd.js.map} +1 -1
  45. package/dashboard/dist/assets/AvailableEscalationsPage-BSqOctep.js +2 -0
  46. package/dashboard/dist/assets/AvailableEscalationsPage-BSqOctep.js.map +1 -0
  47. package/dashboard/dist/assets/{BotPicker-BaFiLa-H.js → BotPicker-DMojDLlV.js} +2 -2
  48. package/dashboard/dist/assets/{BotPicker-BaFiLa-H.js.map → BotPicker-DMojDLlV.js.map} +1 -1
  49. package/dashboard/dist/assets/BulkAssignModal-DYbM_6Or.js +2 -0
  50. package/dashboard/dist/assets/BulkAssignModal-DYbM_6Or.js.map +1 -0
  51. package/dashboard/dist/assets/CapabilitiesPage-CDQ5JHNP.js +2 -0
  52. package/dashboard/dist/assets/{CapabilitiesPage-Cewd6Uku.js.map → CapabilitiesPage-CDQ5JHNP.js.map} +1 -1
  53. package/dashboard/dist/assets/{CollapsibleSection-D1WIbyDa.js → CollapsibleSection-D4VlCEbD.js} +2 -2
  54. package/dashboard/dist/assets/{CollapsibleSection-D1WIbyDa.js.map → CollapsibleSection-D4VlCEbD.js.map} +1 -1
  55. package/dashboard/dist/assets/{ConfirmDeleteModal-CQsJUzEa.js → ConfirmDeleteModal-DnNHjJtD.js} +2 -2
  56. package/dashboard/dist/assets/{ConfirmDeleteModal-CQsJUzEa.js.map → ConfirmDeleteModal-DnNHjJtD.js.map} +1 -1
  57. package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js +2 -0
  58. package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js.map +1 -0
  59. package/dashboard/dist/assets/CredentialsPage-CSYZw-rL.js +2 -0
  60. package/dashboard/dist/assets/{CredentialsPage-CwtkQUG3.js.map → CredentialsPage-CSYZw-rL.js.map} +1 -1
  61. package/dashboard/dist/assets/{CronLabel-CRC_uNuC.js → CronLabel-CpmqDrlJ.js} +2 -2
  62. package/dashboard/dist/assets/{CronLabel-CRC_uNuC.js.map → CronLabel-CpmqDrlJ.js.map} +1 -1
  63. package/dashboard/dist/assets/{DropZone-Pv-v5RAs.js → DropZone-BbXlQnYB.js} +2 -2
  64. package/dashboard/dist/assets/{DropZone-Pv-v5RAs.js.map → DropZone-BbXlQnYB.js.map} +1 -1
  65. package/dashboard/dist/assets/{ElapsedCell-CxAi0zN0.js → ElapsedCell-Cul22qBS.js} +2 -2
  66. package/dashboard/dist/assets/{ElapsedCell-CxAi0zN0.js.map → ElapsedCell-Cul22qBS.js.map} +1 -1
  67. package/dashboard/dist/assets/EntityTimelinePanel-CtzpJ-j2.js +2 -0
  68. package/dashboard/dist/assets/EntityTimelinePanel-CtzpJ-j2.js.map +1 -0
  69. package/dashboard/dist/assets/{EscalationListSchemaPage--yZfsE8s.js → EscalationListSchemaPage-BZQ8Y_UH.js} +3 -3
  70. package/dashboard/dist/assets/{EscalationListSchemaPage--yZfsE8s.js.map → EscalationListSchemaPage-BZQ8Y_UH.js.map} +1 -1
  71. package/dashboard/dist/assets/{EscalationSchemaPage-CmoVqaS7.js → EscalationSchemaPage-CydTtq_A.js} +3 -3
  72. package/dashboard/dist/assets/{EscalationSchemaPage-CmoVqaS7.js.map → EscalationSchemaPage-CydTtq_A.js.map} +1 -1
  73. package/dashboard/dist/assets/{EscalationsOverview-DDQTW6Jo.js → EscalationsOverview-DSYC0nI7.js} +2 -2
  74. package/dashboard/dist/assets/{EscalationsOverview-DDQTW6Jo.js.map → EscalationsOverview-DSYC0nI7.js.map} +1 -1
  75. package/dashboard/dist/assets/{EventTable-C5jN7XT7.js → EventTable-s48cTXIw.js} +2 -2
  76. package/dashboard/dist/assets/{EventTable-C5jN7XT7.js.map → EventTable-s48cTXIw.js.map} +1 -1
  77. package/dashboard/dist/assets/{FilterBar-CcIgQH9h.js → FilterBar-B61qKmFD.js} +2 -2
  78. package/dashboard/dist/assets/{FilterBar-CcIgQH9h.js.map → FilterBar-B61qKmFD.js.map} +1 -1
  79. package/dashboard/dist/assets/GraphInvokePage-DxZv_KC2.js +2 -0
  80. package/dashboard/dist/assets/{GraphInvokePage-LACIxaiH.js.map → GraphInvokePage-DxZv_KC2.js.map} +1 -1
  81. package/dashboard/dist/assets/HomePage-zK3VP_9g.js +2 -0
  82. package/dashboard/dist/assets/HomePage-zK3VP_9g.js.map +1 -0
  83. package/dashboard/dist/assets/{ListToolbar-CLwSkmUH.js → ListToolbar-DaxloPQc.js} +2 -2
  84. package/dashboard/dist/assets/{ListToolbar-CLwSkmUH.js.map → ListToolbar-DaxloPQc.js.map} +1 -1
  85. package/dashboard/dist/assets/{McpOverview-C2U1XfQw.js → McpOverview-Ciq8r6-p.js} +2 -2
  86. package/dashboard/dist/assets/{McpOverview-C2U1XfQw.js.map → McpOverview-Ciq8r6-p.js.map} +1 -1
  87. package/dashboard/dist/assets/{McpQueryDetailPage-DYOK8A4D.js → McpQueryDetailPage-DIC0FEEb.js} +3 -3
  88. package/dashboard/dist/assets/{McpQueryDetailPage-DYOK8A4D.js.map → McpQueryDetailPage-DIC0FEEb.js.map} +1 -1
  89. package/dashboard/dist/assets/McpQueryPage-BBy0NSNg.js +2 -0
  90. package/dashboard/dist/assets/{McpQueryPage-Ck75ikSd.js.map → McpQueryPage-BBy0NSNg.js.map} +1 -1
  91. package/dashboard/dist/assets/{McpRunDetailPage-CA9gWQ4L.js → McpRunDetailPage-BqKNmIyW.js} +2 -2
  92. package/dashboard/dist/assets/{McpRunDetailPage-CA9gWQ4L.js.map → McpRunDetailPage-BqKNmIyW.js.map} +1 -1
  93. package/dashboard/dist/assets/{McpRunsPage-BhPshset.js → McpRunsPage-D0RlOpzR.js} +2 -2
  94. package/dashboard/dist/assets/{McpRunsPage-BhPshset.js.map → McpRunsPage-D0RlOpzR.js.map} +1 -1
  95. package/dashboard/dist/assets/NamespacePill-Dbtm9R2T.js +2 -0
  96. package/dashboard/dist/assets/{NamespacePill-DONj6eUU.js.map → NamespacePill-Dbtm9R2T.js.map} +1 -1
  97. package/dashboard/dist/assets/OperationsPage-BX0SFizr.js +3 -0
  98. package/dashboard/dist/assets/OperationsPage-BX0SFizr.js.map +1 -0
  99. package/dashboard/dist/assets/OperatorDashboard-vXG0TjAQ.js +2 -0
  100. package/dashboard/dist/assets/{OperatorDashboard-DZOfHRE7.js.map → OperatorDashboard-vXG0TjAQ.js.map} +1 -1
  101. package/dashboard/dist/assets/{PageHeader-CFVw67M6.js → PageHeader-xB92ELs3.js} +2 -2
  102. package/dashboard/dist/assets/{PageHeader-CFVw67M6.js.map → PageHeader-xB92ELs3.js.map} +1 -1
  103. package/dashboard/dist/assets/{PageHeaderWithStats-D9tQxILm.js → PageHeaderWithStats-DVo_qqn1.js} +2 -2
  104. package/dashboard/dist/assets/{PageHeaderWithStats-D9tQxILm.js.map → PageHeaderWithStats-DVo_qqn1.js.map} +1 -1
  105. package/dashboard/dist/assets/PersonaDetailPage-w5TXcn4Q.js +2 -0
  106. package/dashboard/dist/assets/{PersonaDetailPage-eyHDupL0.js.map → PersonaDetailPage-w5TXcn4Q.js.map} +1 -1
  107. package/dashboard/dist/assets/PersonasPage-Dzcinl1L.js +2 -0
  108. package/dashboard/dist/assets/PersonasPage-Dzcinl1L.js.map +1 -0
  109. package/dashboard/dist/assets/{ProcessDetailPage-CKiAlpOc.js → ProcessDetailPage-BVXieFX1.js} +2 -2
  110. package/dashboard/dist/assets/{ProcessDetailPage-CKiAlpOc.js.map → ProcessDetailPage-BVXieFX1.js.map} +1 -1
  111. package/dashboard/dist/assets/{ProcessesListPage-C4ueZJxU.js → ProcessesListPage-CKKNpk4z.js} +2 -2
  112. package/dashboard/dist/assets/{ProcessesListPage-C4ueZJxU.js.map → ProcessesListPage-CKKNpk4z.js.map} +1 -1
  113. package/dashboard/dist/assets/RoleDetailPage-BytSo-YE.js +8 -0
  114. package/dashboard/dist/assets/RoleDetailPage-BytSo-YE.js.map +1 -0
  115. package/dashboard/dist/assets/{RolePill-Di_5hfvw.js → RolePill-CYpL3a2d.js} +2 -2
  116. package/dashboard/dist/assets/{RolePill-Di_5hfvw.js.map → RolePill-CYpL3a2d.js.map} +1 -1
  117. package/dashboard/dist/assets/RolesPage-eayR9H4f.js +2 -0
  118. package/dashboard/dist/assets/{RolesPage-B3-9Ek0F.js.map → RolesPage-eayR9H4f.js.map} +1 -1
  119. package/dashboard/dist/assets/{RunAsSelector-1k1J1_cv.js → RunAsSelector-D7RPwaAl.js} +2 -2
  120. package/dashboard/dist/assets/{RunAsSelector-1k1J1_cv.js.map → RunAsSelector-D7RPwaAl.js.map} +1 -1
  121. package/dashboard/dist/assets/{ScanCodesPage-CeuVKnpu.js → ScanCodesPage-C8-ZBXF5.js} +2 -2
  122. package/dashboard/dist/assets/{ScanCodesPage-CeuVKnpu.js.map → ScanCodesPage-C8-ZBXF5.js.map} +1 -1
  123. package/dashboard/dist/assets/ScanSchemeDetailPage-tQhEgFKf.js +2 -0
  124. package/dashboard/dist/assets/{ScanSchemeDetailPage-BnivPUJY.js.map → ScanSchemeDetailPage-tQhEgFKf.js.map} +1 -1
  125. package/dashboard/dist/assets/ScanStationPage-CuhqsBKo.js +2 -0
  126. package/dashboard/dist/assets/{ScanStationPage-DCSA7pcV.js.map → ScanStationPage-CuhqsBKo.js.map} +1 -1
  127. package/dashboard/dist/assets/{ScopeBadge-CqIIeWjK.js → ScopeBadge-BmNzZlSj.js} +2 -2
  128. package/dashboard/dist/assets/{ScopeBadge-CqIIeWjK.js.map → ScopeBadge-BmNzZlSj.js.map} +1 -1
  129. package/dashboard/dist/assets/{StickyPagination-BWuKz8uB.js → StickyPagination-BIVTAMnP.js} +2 -2
  130. package/dashboard/dist/assets/{StickyPagination-BWuKz8uB.js.map → StickyPagination-BIVTAMnP.js.map} +1 -1
  131. package/dashboard/dist/assets/{StreamMessageDetail-Cq6AGhgJ.js → StreamMessageDetail-CYSC2cO1.js} +2 -2
  132. package/dashboard/dist/assets/{StreamMessageDetail-Cq6AGhgJ.js.map → StreamMessageDetail-CYSC2cO1.js.map} +1 -1
  133. package/dashboard/dist/assets/{SwimlaneTimeline-DM88avgt.js → SwimlaneTimeline-BMZAs_2K.js} +2 -2
  134. package/dashboard/dist/assets/{SwimlaneTimeline-DM88avgt.js.map → SwimlaneTimeline-BMZAs_2K.js.map} +1 -1
  135. package/dashboard/dist/assets/{TagInput-BLwxTNsI.js → TagInput-D1uszNd2.js} +2 -2
  136. package/dashboard/dist/assets/{TagInput-BLwxTNsI.js.map → TagInput-D1uszNd2.js.map} +1 -1
  137. package/dashboard/dist/assets/{TaskDetailPage-Caqe3fG8.js → TaskDetailPage-CVUDUU5Q.js} +2 -2
  138. package/dashboard/dist/assets/{TaskDetailPage-Caqe3fG8.js.map → TaskDetailPage-CVUDUU5Q.js.map} +1 -1
  139. package/dashboard/dist/assets/{TaskQueuePill-DVgcqd-h.js → TaskQueuePill-C2H8oRfn.js} +2 -2
  140. package/dashboard/dist/assets/{TaskQueuePill-DVgcqd-h.js.map → TaskQueuePill-C2H8oRfn.js.map} +1 -1
  141. package/dashboard/dist/assets/{TasksListPage-DlQwpXOL.js → TasksListPage-DEQymbXC.js} +2 -2
  142. package/dashboard/dist/assets/{TasksListPage-DlQwpXOL.js.map → TasksListPage-DEQymbXC.js.map} +1 -1
  143. package/dashboard/dist/assets/{TimeAgo-BinTjiVC.js → TimeAgo-CCxP67Rb.js} +2 -2
  144. package/dashboard/dist/assets/{TimeAgo-BinTjiVC.js.map → TimeAgo-CCxP67Rb.js.map} +1 -1
  145. package/dashboard/dist/assets/{TimestampCell-DDcfSVeQ.js → TimestampCell-CE5ZUYhV.js} +2 -2
  146. package/dashboard/dist/assets/{TimestampCell-DDcfSVeQ.js.map → TimestampCell-CE5ZUYhV.js.map} +1 -1
  147. package/dashboard/dist/assets/{ToolPill-C6hkOqPx.js → ToolPill-D-h8AoB8.js} +2 -2
  148. package/dashboard/dist/assets/{ToolPill-C6hkOqPx.js.map → ToolPill-D-h8AoB8.js.map} +1 -1
  149. package/dashboard/dist/assets/ToolTestPanel-BHuQTyBY.js +2 -0
  150. package/dashboard/dist/assets/{ToolTestPanel-CZvegH_w.js.map → ToolTestPanel-BHuQTyBY.js.map} +1 -1
  151. package/dashboard/dist/assets/{TopicDetailPage-CShiCwz8.js → TopicDetailPage-SFuiludx.js} +3 -3
  152. package/dashboard/dist/assets/{TopicDetailPage-CShiCwz8.js.map → TopicDetailPage-SFuiludx.js.map} +1 -1
  153. package/dashboard/dist/assets/{TopicsPage-CAYxRRbI.js → TopicsPage-DO8pUmng.js} +2 -2
  154. package/dashboard/dist/assets/{TopicsPage-CAYxRRbI.js.map → TopicsPage-DO8pUmng.js.map} +1 -1
  155. package/dashboard/dist/assets/UserName-CsLnT75E.js +2 -0
  156. package/dashboard/dist/assets/UserName-CsLnT75E.js.map +1 -0
  157. package/dashboard/dist/assets/{WorkflowExecutionPage-DNdXEFcB.js → WorkflowExecutionPage-BttnEvOd.js} +2 -2
  158. package/dashboard/dist/assets/{WorkflowExecutionPage-DNdXEFcB.js.map → WorkflowExecutionPage-BttnEvOd.js.map} +1 -1
  159. package/dashboard/dist/assets/{WorkflowPill-CN-952iI.js → WorkflowPill-CZvBbkn4.js} +2 -2
  160. package/dashboard/dist/assets/{WorkflowPill-CN-952iI.js.map → WorkflowPill-CZvBbkn4.js.map} +1 -1
  161. package/dashboard/dist/assets/{WorkflowsDashboard-D7DPDeuQ.js → WorkflowsDashboard-BRboBhlK.js} +2 -2
  162. package/dashboard/dist/assets/{WorkflowsDashboard-D7DPDeuQ.js.map → WorkflowsDashboard-BRboBhlK.js.map} +1 -1
  163. package/dashboard/dist/assets/{WorkflowsOverview-C7Z0SpDH.js → WorkflowsOverview-CDFTYeQo.js} +2 -2
  164. package/dashboard/dist/assets/{WorkflowsOverview-C7Z0SpDH.js.map → WorkflowsOverview-CDFTYeQo.js.map} +1 -1
  165. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Bxklswko.js → YamlWorkflowDetailPage-CmnZFevp.js} +11 -11
  166. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Bxklswko.js.map → YamlWorkflowDetailPage-CmnZFevp.js.map} +1 -1
  167. package/dashboard/dist/assets/{YamlWorkflowsPage-CkArsPbi.js → YamlWorkflowsPage-Qq1jfcrH.js} +2 -2
  168. package/dashboard/dist/assets/{YamlWorkflowsPage-CkArsPbi.js.map → YamlWorkflowsPage-Qq1jfcrH.js.map} +1 -1
  169. package/dashboard/dist/assets/{agents-Ca0hOp2Y.js → agents-C7vUIO7e.js} +2 -2
  170. package/dashboard/dist/assets/{agents-Ca0hOp2Y.js.map → agents-C7vUIO7e.js.map} +1 -1
  171. package/dashboard/dist/assets/{bots-9GtbGtH9.js → bots-BaOblnW4.js} +2 -2
  172. package/dashboard/dist/assets/{bots-9GtbGtH9.js.map → bots-BaOblnW4.js.map} +1 -1
  173. package/dashboard/dist/assets/{capabilities-C0RpEvyY.js → capabilities-RZpmDWoy.js} +2 -2
  174. package/dashboard/dist/assets/{capabilities-C0RpEvyY.js.map → capabilities-RZpmDWoy.js.map} +1 -1
  175. package/dashboard/dist/assets/{controlplane-ClQiKGyQ.js → controlplane-BwGdcwXR.js} +2 -2
  176. package/dashboard/dist/assets/{controlplane-ClQiKGyQ.js.map → controlplane-BwGdcwXR.js.map} +1 -1
  177. package/dashboard/dist/assets/escalation-columns-B4DG_5v8.js +2 -0
  178. package/dashboard/dist/assets/escalation-columns-B4DG_5v8.js.map +1 -0
  179. package/dashboard/dist/assets/index-8LIpvj2e.js +3 -0
  180. package/dashboard/dist/assets/index-8LIpvj2e.js.map +1 -0
  181. package/dashboard/dist/assets/index-BICLHYJJ.js +2 -0
  182. package/dashboard/dist/assets/{index-BLLK2mzy.js.map → index-BICLHYJJ.js.map} +1 -1
  183. package/dashboard/dist/assets/{index-BLCFN3YR.js → index-BQPUlmmz.js} +2 -2
  184. package/dashboard/dist/assets/{index-BLCFN3YR.js.map → index-BQPUlmmz.js.map} +1 -1
  185. package/dashboard/dist/assets/index-BaC3sbJH.js +67 -0
  186. package/dashboard/dist/assets/index-BaC3sbJH.js.map +1 -0
  187. package/dashboard/dist/assets/index-BuqpU6ow.js +2 -0
  188. package/dashboard/dist/assets/{index-DEr9QjVv.js.map → index-BuqpU6ow.js.map} +1 -1
  189. package/dashboard/dist/assets/index-CD6jtND1.css +1 -0
  190. package/dashboard/dist/assets/{index-Ba3UsZzz.js → index-CsIw-ZLk.js} +4 -4
  191. package/dashboard/dist/assets/{index-Ba3UsZzz.js.map → index-CsIw-ZLk.js.map} +1 -1
  192. package/dashboard/dist/assets/index-CtJkvX9e.js +5 -0
  193. package/dashboard/dist/assets/{index-Ct_8Tpec.js.map → index-CtJkvX9e.js.map} +1 -1
  194. package/dashboard/dist/assets/index-D9NtDRtp.js +2 -0
  195. package/dashboard/dist/assets/{index-BoQirCxt.js.map → index-D9NtDRtp.js.map} +1 -1
  196. package/dashboard/dist/assets/{index-CeHOGQM4.js → index-DU9-flEo.js} +2 -2
  197. package/dashboard/dist/assets/{index-CeHOGQM4.js.map → index-DU9-flEo.js.map} +1 -1
  198. package/dashboard/dist/assets/{index-P1g8r09L.js → index-G3NmdMjt.js} +2 -2
  199. package/dashboard/dist/assets/{index-P1g8r09L.js.map → index-G3NmdMjt.js.map} +1 -1
  200. package/dashboard/dist/assets/index-IWufkcH9.js +2 -0
  201. package/dashboard/dist/assets/{index-DlzW75L4.js.map → index-IWufkcH9.js.map} +1 -1
  202. package/dashboard/dist/assets/index-iegzyfMv.js +2 -0
  203. package/dashboard/dist/assets/{index-B-Qpr29t.js.map → index-iegzyfMv.js.map} +1 -1
  204. package/dashboard/dist/assets/index-xNFTmmsv.js +2 -0
  205. package/dashboard/dist/assets/{index-CG8oLNHo.js.map → index-xNFTmmsv.js.map} +1 -1
  206. package/dashboard/dist/assets/{knowledge-DzueDGkw.js → knowledge-CjwCbm3E.js} +2 -2
  207. package/dashboard/dist/assets/{knowledge-DzueDGkw.js.map → knowledge-CjwCbm3E.js.map} +1 -1
  208. package/dashboard/dist/assets/{mcp-CCOzN8dH.js → mcp-C-DMktCT.js} +2 -2
  209. package/dashboard/dist/assets/{mcp-CCOzN8dH.js.map → mcp-C-DMktCT.js.map} +1 -1
  210. package/dashboard/dist/assets/{mcp-query-UeMDiM6I.js → mcp-query-KBeBNHb4.js} +2 -2
  211. package/dashboard/dist/assets/{mcp-query-UeMDiM6I.js.map → mcp-query-KBeBNHb4.js.map} +1 -1
  212. package/dashboard/dist/assets/{personas-CKcrzaQX.js → personas-B32sSCxm.js} +2 -2
  213. package/dashboard/dist/assets/{personas-CKcrzaQX.js.map → personas-B32sSCxm.js.map} +1 -1
  214. package/dashboard/dist/assets/{pipelines-orE-1gpj.js → pipelines-DNLwDumm.js} +2 -2
  215. package/dashboard/dist/assets/{pipelines-orE-1gpj.js.map → pipelines-DNLwDumm.js.map} +1 -1
  216. package/dashboard/dist/assets/{tasks-ZOmzxynB.js → tasks-DrWSrjmj.js} +2 -2
  217. package/dashboard/dist/assets/{tasks-ZOmzxynB.js.map → tasks-DrWSrjmj.js.map} +1 -1
  218. package/dashboard/dist/assets/{topics-CdYaOCi_.js → topics-DgzGU-vR.js} +2 -2
  219. package/dashboard/dist/assets/{topics-CdYaOCi_.js.map → topics-DgzGU-vR.js.map} +1 -1
  220. package/dashboard/dist/assets/{useDebouncedValue-D-uGnSj5.js → useDebouncedValue-DG5JOj1F.js} +2 -2
  221. package/dashboard/dist/assets/{useDebouncedValue-D-uGnSj5.js.map → useDebouncedValue-DG5JOj1F.js.map} +1 -1
  222. package/dashboard/dist/assets/{useNamespace-DMrjlrJJ.js → useNamespace-CdgF7Jxo.js} +2 -2
  223. package/dashboard/dist/assets/{useNamespace-DMrjlrJJ.js.map → useNamespace-CdgF7Jxo.js.map} +1 -1
  224. package/dashboard/dist/assets/{useYamlActivityEvents-ByyQgu8S.js → useYamlActivityEvents-BEaOtgSZ.js} +2 -2
  225. package/dashboard/dist/assets/{useYamlActivityEvents-ByyQgu8S.js.map → useYamlActivityEvents-BEaOtgSZ.js.map} +1 -1
  226. package/dashboard/dist/assets/{vendor-icons-h-jlRSb9.js → vendor-icons-BCWsItQ7.js} +138 -133
  227. package/dashboard/dist/assets/{vendor-icons-h-jlRSb9.js.map → vendor-icons-BCWsItQ7.js.map} +1 -1
  228. package/dashboard/dist/assets/{workflows-CLn05FRV.js → workflows-CX_oarls.js} +2 -2
  229. package/dashboard/dist/assets/{workflows-CLn05FRV.js.map → workflows-CX_oarls.js.map} +1 -1
  230. package/dashboard/dist/assets/{yaml-workflows-DFD_HO__.js → yaml-workflows-YASUDPo0.js} +2 -2
  231. package/dashboard/dist/assets/{yaml-workflows-DFD_HO__.js.map → yaml-workflows-YASUDPo0.js.map} +1 -1
  232. package/dashboard/dist/index.html +3 -3
  233. package/docs/dashboard.md +164 -69
  234. package/docs/faceted-routing.md +38 -0
  235. package/docs/hitl/x-lt-list-schema.md +3 -0
  236. package/docs/operations.md +61 -60
  237. package/docs/scan-codes.md +18 -0
  238. package/package.json +1 -1
  239. package/dashboard/dist/assets/AvailableEscalationsPage-CjcAIm-d.js +0 -2
  240. package/dashboard/dist/assets/AvailableEscalationsPage-CjcAIm-d.js.map +0 -1
  241. package/dashboard/dist/assets/BulkAssignModal-DNmji4l-.js +0 -2
  242. package/dashboard/dist/assets/BulkAssignModal-DNmji4l-.js.map +0 -1
  243. package/dashboard/dist/assets/CapabilitiesPage-Cewd6Uku.js +0 -2
  244. package/dashboard/dist/assets/CountdownTimer-BKMmFie6.js +0 -2
  245. package/dashboard/dist/assets/CountdownTimer-BKMmFie6.js.map +0 -1
  246. package/dashboard/dist/assets/CredentialsPage-CwtkQUG3.js +0 -2
  247. package/dashboard/dist/assets/EntityTimelinePanel-DzMuV7ZX.js +0 -2
  248. package/dashboard/dist/assets/EntityTimelinePanel-DzMuV7ZX.js.map +0 -1
  249. package/dashboard/dist/assets/GraphInvokePage-LACIxaiH.js +0 -2
  250. package/dashboard/dist/assets/HomePage-DP9Q-x4a.js +0 -2
  251. package/dashboard/dist/assets/HomePage-DP9Q-x4a.js.map +0 -1
  252. package/dashboard/dist/assets/McpQueryPage-Ck75ikSd.js +0 -2
  253. package/dashboard/dist/assets/Modal-BU7No9NH.js +0 -2
  254. package/dashboard/dist/assets/Modal-BU7No9NH.js.map +0 -1
  255. package/dashboard/dist/assets/NamespacePill-DONj6eUU.js +0 -2
  256. package/dashboard/dist/assets/OperationsPage-MlMzl0Bf.js +0 -3
  257. package/dashboard/dist/assets/OperationsPage-MlMzl0Bf.js.map +0 -1
  258. package/dashboard/dist/assets/OperatorDashboard-DZOfHRE7.js +0 -2
  259. package/dashboard/dist/assets/PersonaDetailPage-eyHDupL0.js +0 -2
  260. package/dashboard/dist/assets/PersonasPage-CCtRkWiP.js +0 -2
  261. package/dashboard/dist/assets/PersonasPage-CCtRkWiP.js.map +0 -1
  262. package/dashboard/dist/assets/RoleDetailPage-BOccQCkx.js +0 -8
  263. package/dashboard/dist/assets/RoleDetailPage-BOccQCkx.js.map +0 -1
  264. package/dashboard/dist/assets/RolesPage-B3-9Ek0F.js +0 -2
  265. package/dashboard/dist/assets/ScanSchemeDetailPage-BnivPUJY.js +0 -2
  266. package/dashboard/dist/assets/ScanStationPage-DCSA7pcV.js +0 -2
  267. package/dashboard/dist/assets/ToolTestPanel-CZvegH_w.js +0 -2
  268. package/dashboard/dist/assets/UserName-BovQxdSY.js +0 -2
  269. package/dashboard/dist/assets/UserName-BovQxdSY.js.map +0 -1
  270. package/dashboard/dist/assets/escalation-columns-CZ12_oQF.js +0 -2
  271. package/dashboard/dist/assets/escalation-columns-CZ12_oQF.js.map +0 -1
  272. package/dashboard/dist/assets/index-B-Qpr29t.js +0 -2
  273. package/dashboard/dist/assets/index-BLLK2mzy.js +0 -2
  274. package/dashboard/dist/assets/index-BoQirCxt.js +0 -2
  275. package/dashboard/dist/assets/index-C1oOLjdF.js +0 -3
  276. package/dashboard/dist/assets/index-C1oOLjdF.js.map +0 -1
  277. package/dashboard/dist/assets/index-CG8oLNHo.js +0 -2
  278. package/dashboard/dist/assets/index-CdavRyaX.js +0 -67
  279. package/dashboard/dist/assets/index-CdavRyaX.js.map +0 -1
  280. package/dashboard/dist/assets/index-Ct_8Tpec.js +0 -5
  281. package/dashboard/dist/assets/index-DEr9QjVv.js +0 -2
  282. package/dashboard/dist/assets/index-DlzW75L4.js +0 -2
  283. package/dashboard/dist/assets/index-fUqvRHOe.css +0 -1
@@ -1,2 +1,2 @@
1
- import{a as $,j as s}from"./vendor-query-RUZdMvN6.js";import{aB as u,aC as j}from"./index-CdavRyaX.js";import{a8 as d,aS as N,aT as h,an as k}from"./vendor-icons-h-jlRSb9.js";function g({onRefresh:m,isFetching:n=!1,apiPath:t,standalone:x=!1}){const[c,r]=$.useState(null),i=(e,o)=>{navigator.clipboard.writeText(e).then(()=>{r(o),setTimeout(()=>r(null),2e3)})},p=()=>{if(!t)return;const e=`${window.location.origin}${u}/api${t}`;i(e,"url")},f=()=>{if(!t)return;const e=`${window.location.origin}${u}/api${t}`,o=j(),C=o?`curl -H "Authorization: Bearer ${o}" "${e}"`:`curl "${e}"`;i(C,"curl")},l="p-1 icon-link rounded",a="w-2.5 h-2.5";return s.jsxs("div",{className:"flex items-center gap-0.5",children:[t&&s.jsxs("div",{className:x?"flex items-center gap-0.5":"hidden @filters/filters:flex items-center gap-0.5",children:[s.jsx("button",{onClick:p,className:l,title:"Copy API URL",children:c==="url"?s.jsx(d,{className:`${a} text-status-success`}):s.jsx(N,{className:a})}),s.jsx("button",{onClick:f,className:l,title:"Copy curl (includes auth token)",children:c==="curl"?s.jsx(d,{className:`${a} text-status-success`}):s.jsx(h,{className:a})})]}),s.jsx("button",{onClick:m,disabled:n,className:`${l} disabled:opacity-50`,title:"Refresh",children:s.jsx(k,{className:`${a} ${n?"animate-spin":""}`})})]})}export{g as L};
2
- //# sourceMappingURL=ListToolbar-CLwSkmUH.js.map
1
+ import{a as C,j as s}from"./vendor-query-RUZdMvN6.js";import{aF as u,aG as j}from"./index-BaC3sbJH.js";import{aa as d,aU as N,aV as h,ao as k}from"./vendor-icons-BCWsItQ7.js";function g({onRefresh:m,isFetching:n=!1,apiPath:t,standalone:x=!1}){const[c,r]=C.useState(null),i=(e,o)=>{navigator.clipboard.writeText(e).then(()=>{r(o),setTimeout(()=>r(null),2e3)})},p=()=>{if(!t)return;const e=`${window.location.origin}${u}/api${t}`;i(e,"url")},f=()=>{if(!t)return;const e=`${window.location.origin}${u}/api${t}`,o=j(),$=o?`curl -H "Authorization: Bearer ${o}" "${e}"`:`curl "${e}"`;i($,"curl")},l="p-1 icon-link rounded",a="w-2.5 h-2.5";return s.jsxs("div",{className:"flex items-center gap-0.5",children:[t&&s.jsxs("div",{className:x?"flex items-center gap-0.5":"hidden @filters/filters:flex items-center gap-0.5",children:[s.jsx("button",{onClick:p,className:l,title:"Copy API URL",children:c==="url"?s.jsx(d,{className:`${a} text-status-success`}):s.jsx(N,{className:a})}),s.jsx("button",{onClick:f,className:l,title:"Copy curl (includes auth token)",children:c==="curl"?s.jsx(d,{className:`${a} text-status-success`}):s.jsx(h,{className:a})})]}),s.jsx("button",{onClick:m,disabled:n,className:`${l} disabled:opacity-50`,title:"Refresh",children:s.jsx(k,{className:`${a} ${n?"animate-spin":""}`})})]})}export{g as L};
2
+ //# sourceMappingURL=ListToolbar-DaxloPQc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListToolbar-CLwSkmUH.js","sources":["../../src/components/common/data/ListToolbar.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RefreshCw, Link2, Terminal, Check } from 'lucide-react';\nimport { getToken } from '../../../api/client';\nimport { LT_BASE } from '../../../lib/base-path';\n\ninterface ListToolbarProps {\n onRefresh: () => void;\n isFetching?: boolean;\n /** API path (e.g. \"/workflow-states/jobs?limit=50\") for URL/curl copy. */\n apiPath?: string;\n /**\n * Set when the toolbar renders outside a `@container/filters` ancestor\n * (e.g. a page header) — skips the narrow-container fold classes, which\n * would otherwise never match and hide the copy actions.\n */\n standalone?: boolean;\n}\n\ntype CopiedState = 'url' | 'curl' | null;\n\n/**\n * Toolbar for list pages: refresh, copy API URL, copy curl command.\n * Designed to sit in FilterBar `actions` slot.\n */\nexport function ListToolbar({ onRefresh, isFetching = false, apiPath, standalone = false }: ListToolbarProps) {\n const [copied, setCopied] = useState<CopiedState>(null);\n\n const copyToClipboard = (text: string, type: CopiedState) => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(type);\n setTimeout(() => setCopied(null), 2000);\n });\n };\n\n const handleCopyUrl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}${LT_BASE}/api${apiPath}`;\n copyToClipboard(url, 'url');\n };\n\n const handleCopyCurl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}${LT_BASE}/api${apiPath}`;\n const token = getToken();\n const cmd = token\n ? `curl -H \"Authorization: Bearer ${token}\" \"${url}\"`\n : `curl \"${url}\"`;\n copyToClipboard(cmd, 'curl');\n };\n\n const BTN = 'p-1 icon-link rounded';\n const ICON = 'w-2.5 h-2.5';\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {apiPath && (\n // Developer copy actions yield first at narrow containers — refresh\n // is the affordance the floor actually uses.\n <div className={standalone ? 'flex items-center gap-0.5' : 'hidden @filters/filters:flex items-center gap-0.5'}>\n <button onClick={handleCopyUrl} className={BTN} title=\"Copy API URL\">\n {copied === 'url' ? <Check className={`${ICON} text-status-success`} /> : <Link2 className={ICON} />}\n </button>\n <button onClick={handleCopyCurl} className={BTN} title=\"Copy curl (includes auth token)\">\n {copied === 'curl' ? <Check className={`${ICON} text-status-success`} /> : <Terminal className={ICON} />}\n </button>\n </div>\n )}\n <button onClick={onRefresh} disabled={isFetching} className={`${BTN} disabled:opacity-50`} title=\"Refresh\">\n <RefreshCw className={`${ICON} ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n );\n}\n"],"names":["ListToolbar","onRefresh","isFetching","apiPath","standalone","copied","setCopied","useState","copyToClipboard","text","type","handleCopyUrl","url","LT_BASE","handleCopyCurl","token","getToken","cmd","BTN","ICON","jsxs","jsx","Check","Link2","Terminal","RefreshCw"],"mappings":"+KAwBO,SAASA,EAAY,CAAE,UAAAC,EAAW,WAAAC,EAAa,GAAO,QAAAC,EAAS,WAAAC,EAAa,IAA2B,CAC5G,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAsB,IAAI,EAEhDC,EAAkB,CAACC,EAAcC,IAAsB,CAC3D,UAAU,UAAU,UAAUD,CAAI,EAAE,KAAK,IAAM,CAC7CH,EAAUI,CAAI,EACd,WAAW,IAAMJ,EAAU,IAAI,EAAG,GAAI,CACxC,CAAC,CACH,EAEMK,EAAgB,IAAM,CAC1B,GAAI,CAACR,EAAS,OACd,MAAMS,EAAM,GAAG,OAAO,SAAS,MAAM,GAAGC,CAAO,OAAOV,CAAO,GAC7DK,EAAgBI,EAAK,KAAK,CAC5B,EAEME,EAAiB,IAAM,CAC3B,GAAI,CAACX,EAAS,OACd,MAAMS,EAAM,GAAG,OAAO,SAAS,MAAM,GAAGC,CAAO,OAAOV,CAAO,GACvDY,EAAQC,EAAA,EACRC,EAAMF,EACR,kCAAkCA,CAAK,MAAMH,CAAG,IAChD,SAASA,CAAG,IAChBJ,EAAgBS,EAAK,MAAM,CAC7B,EAEMC,EAAM,wBACNC,EAAO,cAEb,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAjB,GAGCiB,EAAAA,KAAC,MAAA,CAAI,UAAWhB,EAAa,4BAA8B,oDACzD,SAAA,CAAAiB,EAAAA,IAAC,SAAA,CAAO,QAASV,EAAe,UAAWO,EAAK,MAAM,eACnD,aAAW,MAAQG,EAAAA,IAACC,GAAM,UAAW,GAAGH,CAAI,sBAAA,CAAwB,QAAMI,EAAA,CAAM,UAAWJ,EAAM,CAAA,CACpG,EACAE,EAAAA,IAAC,UAAO,QAASP,EAAgB,UAAWI,EAAK,MAAM,kCACpD,SAAAb,IAAW,aAAUiB,EAAA,CAAM,UAAW,GAAGH,CAAI,sBAAA,CAAwB,EAAKE,EAAAA,IAACG,EAAA,CAAS,UAAWL,CAAA,CAAM,CAAA,CACxG,CAAA,EACF,EAEFE,EAAAA,IAAC,UAAO,QAASpB,EAAW,SAAUC,EAAY,UAAW,GAAGgB,CAAG,uBAAwB,MAAM,UAC/F,SAAAG,MAACI,EAAA,CAAU,UAAW,GAAGN,CAAI,IAAIjB,EAAa,eAAiB,EAAE,EAAA,CAAI,CAAA,CACvE,CAAA,EACF,CAEJ"}
1
+ {"version":3,"file":"ListToolbar-DaxloPQc.js","sources":["../../src/components/common/data/ListToolbar.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RefreshCw, Link2, Terminal, Check } from 'lucide-react';\nimport { getToken } from '../../../api/client';\nimport { LT_BASE } from '../../../lib/base-path';\n\ninterface ListToolbarProps {\n onRefresh: () => void;\n isFetching?: boolean;\n /** API path (e.g. \"/workflow-states/jobs?limit=50\") for URL/curl copy. */\n apiPath?: string;\n /**\n * Set when the toolbar renders outside a `@container/filters` ancestor\n * (e.g. a page header) — skips the narrow-container fold classes, which\n * would otherwise never match and hide the copy actions.\n */\n standalone?: boolean;\n}\n\ntype CopiedState = 'url' | 'curl' | null;\n\n/**\n * Toolbar for list pages: refresh, copy API URL, copy curl command.\n * Designed to sit in FilterBar `actions` slot.\n */\nexport function ListToolbar({ onRefresh, isFetching = false, apiPath, standalone = false }: ListToolbarProps) {\n const [copied, setCopied] = useState<CopiedState>(null);\n\n const copyToClipboard = (text: string, type: CopiedState) => {\n navigator.clipboard.writeText(text).then(() => {\n setCopied(type);\n setTimeout(() => setCopied(null), 2000);\n });\n };\n\n const handleCopyUrl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}${LT_BASE}/api${apiPath}`;\n copyToClipboard(url, 'url');\n };\n\n const handleCopyCurl = () => {\n if (!apiPath) return;\n const url = `${window.location.origin}${LT_BASE}/api${apiPath}`;\n const token = getToken();\n const cmd = token\n ? `curl -H \"Authorization: Bearer ${token}\" \"${url}\"`\n : `curl \"${url}\"`;\n copyToClipboard(cmd, 'curl');\n };\n\n const BTN = 'p-1 icon-link rounded';\n const ICON = 'w-2.5 h-2.5';\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {apiPath && (\n // Developer copy actions yield first at narrow containers — refresh\n // is the affordance the floor actually uses.\n <div className={standalone ? 'flex items-center gap-0.5' : 'hidden @filters/filters:flex items-center gap-0.5'}>\n <button onClick={handleCopyUrl} className={BTN} title=\"Copy API URL\">\n {copied === 'url' ? <Check className={`${ICON} text-status-success`} /> : <Link2 className={ICON} />}\n </button>\n <button onClick={handleCopyCurl} className={BTN} title=\"Copy curl (includes auth token)\">\n {copied === 'curl' ? <Check className={`${ICON} text-status-success`} /> : <Terminal className={ICON} />}\n </button>\n </div>\n )}\n <button onClick={onRefresh} disabled={isFetching} className={`${BTN} disabled:opacity-50`} title=\"Refresh\">\n <RefreshCw className={`${ICON} ${isFetching ? 'animate-spin' : ''}`} />\n </button>\n </div>\n );\n}\n"],"names":["ListToolbar","onRefresh","isFetching","apiPath","standalone","copied","setCopied","useState","copyToClipboard","text","type","handleCopyUrl","url","LT_BASE","handleCopyCurl","token","getToken","cmd","BTN","ICON","jsxs","jsx","Check","Link2","Terminal","RefreshCw"],"mappings":"+KAwBO,SAASA,EAAY,CAAE,UAAAC,EAAW,WAAAC,EAAa,GAAO,QAAAC,EAAS,WAAAC,EAAa,IAA2B,CAC5G,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAsB,IAAI,EAEhDC,EAAkB,CAACC,EAAcC,IAAsB,CAC3D,UAAU,UAAU,UAAUD,CAAI,EAAE,KAAK,IAAM,CAC7CH,EAAUI,CAAI,EACd,WAAW,IAAMJ,EAAU,IAAI,EAAG,GAAI,CACxC,CAAC,CACH,EAEMK,EAAgB,IAAM,CAC1B,GAAI,CAACR,EAAS,OACd,MAAMS,EAAM,GAAG,OAAO,SAAS,MAAM,GAAGC,CAAO,OAAOV,CAAO,GAC7DK,EAAgBI,EAAK,KAAK,CAC5B,EAEME,EAAiB,IAAM,CAC3B,GAAI,CAACX,EAAS,OACd,MAAMS,EAAM,GAAG,OAAO,SAAS,MAAM,GAAGC,CAAO,OAAOV,CAAO,GACvDY,EAAQC,EAAA,EACRC,EAAMF,EACR,kCAAkCA,CAAK,MAAMH,CAAG,IAChD,SAASA,CAAG,IAChBJ,EAAgBS,EAAK,MAAM,CAC7B,EAEMC,EAAM,wBACNC,EAAO,cAEb,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAjB,GAGCiB,EAAAA,KAAC,MAAA,CAAI,UAAWhB,EAAa,4BAA8B,oDACzD,SAAA,CAAAiB,EAAAA,IAAC,SAAA,CAAO,QAASV,EAAe,UAAWO,EAAK,MAAM,eACnD,aAAW,MAAQG,EAAAA,IAACC,GAAM,UAAW,GAAGH,CAAI,sBAAA,CAAwB,QAAMI,EAAA,CAAM,UAAWJ,EAAM,CAAA,CACpG,EACAE,EAAAA,IAAC,UAAO,QAASP,EAAgB,UAAWI,EAAK,MAAM,kCACpD,SAAAb,IAAW,aAAUiB,EAAA,CAAM,UAAW,GAAGH,CAAI,sBAAA,CAAwB,EAAKE,EAAAA,IAACG,EAAA,CAAS,UAAWL,CAAA,CAAM,CAAA,CACxG,CAAA,EACF,EAEFE,EAAAA,IAAC,UAAO,QAASpB,EAAW,SAAUC,EAAY,UAAW,GAAGgB,CAAG,uBAAwB,MAAM,UAC/F,SAAAG,MAACI,EAAA,CAAU,UAAW,GAAGN,CAAI,IAAIjB,EAAa,eAAiB,EAAE,EAAA,CAAI,CAAA,CACvE,CAAA,EACF,CAEJ"}
@@ -1,2 +1,2 @@
1
- import{a as o,j as e}from"./vendor-query-RUZdMvN6.js";import{u as R}from"./mcp-CCOzN8dH.js";import{u as F}from"./pipelines-orE-1gpj.js";import{u as I}from"./yaml-workflows-DFD_HO__.js";import{u as W}from"./controlplane-ClQiKGyQ.js";import{P as z}from"./PageHeader-CFVw67M6.js";import{S as b}from"./StatCard-BXQ8dD9Y.js";import{A as E,W as O}from"./vendor-icons-h-jlRSb9.js";import{u as U}from"./vendor-react-CdqEC2zv.js";import"./index-CdavRyaX.js";const T=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function q(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function j({value:r,colorClass:c,onClick:v}){return r===0?e.jsx("span",{className:"text-text-tertiary",children:"0"}):e.jsx("button",{onClick:v,className:`${c} hover:underline tabular-nums font-medium`,children:r})}function ee(){const r=U(),[c,v]=o.useState("24h"),[D,P]=o.useState(""),{data:d}=W(),k=o.useMemo(()=>((d==null?void 0:d.apps)??[]).map(t=>t.appId).sort(),[d==null?void 0:d.apps]),u=D||k[0]||"",{data:m}=F({limit:500,app_id:u}),{data:N,isLoading:L}=R(),{data:y,isLoading:_}=I({limit:200}),w=k,p=(N==null?void 0:N.servers)??[],h=(y==null?void 0:y.workflows)??[],M=o.useMemo(()=>p.reduce((t,l)=>t+(Array.isArray(l.tool_manifest)?l.tool_manifest.length:0),0),[p]),S=o.useMemo(()=>new Set(h.map(l=>l.app_id)).size,[h]),$=o.useMemo(()=>{const t=T.find(l=>l.label===c);return Date.now()-t.ms},[c]),i=o.useMemo(()=>((m==null?void 0:m.jobs)??[]).filter(t=>new Date(t.created_at).getTime()>=$),[m==null?void 0:m.jobs,$]),C=o.useMemo(()=>{const t=new Map;for(const s of i){const a=t.get(s.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(a.total++,s.status==="running"&&a.running++,s.status==="completed"){a.completed++;const g=new Date(s.updated_at).getTime()-new Date(s.created_at).getTime();g>0&&a.durations.push(g)}s.status==="failed"&&a.failed++,t.set(s.entity,a)}const l=[];for(const[s,a]of t)l.push({pipeline:s,...a,avgDuration:a.durations.length>0?a.durations.reduce((g,A)=>g+A,0)/a.durations.length:null});return l.sort((s,a)=>a.total-s.total)},[i]),f=o.useMemo(()=>({total:i.length,running:i.filter(t=>t.status==="running").length,completed:i.filter(t=>t.status==="completed").length,failed:i.filter(t=>t.status==="failed").length}),[i]),n=(t,l)=>{const s=new URLSearchParams;u&&s.set("namespace",u),t&&s.set("entity",t),l&&s.set("status",l);const a=s.toString();r(`/mcp/executions${a?`?${a}`:""}`)},x="pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxs("div",{children:[e.jsx(z,{title:"Discovered"}),e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("div",{className:"flex items-center gap-1",children:T.map(t=>e.jsx("button",{onClick:()=>v(t.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${c===t.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:t.label},t.label))}),w.length>1&&e.jsx("select",{value:u,onChange:t=>P(t.target.value),className:"select text-xs py-1 px-2",children:w.map(t=>e.jsx("option",{value:t,children:t},t))})]}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsx(b,{label:"Total Runs",value:f.total,onClick:()=>n()}),e.jsx(b,{label:"Running",value:f.running,colorClass:"text-status-active",onClick:()=>n(void 0,"running")}),e.jsx(b,{label:"Completed",value:f.completed,colorClass:"text-status-success",onClick:()=>n(void 0,"completed")}),e.jsx(b,{label:"Failed",value:f.failed,colorClass:"text-status-error",onClick:()=>n(void 0,"failed")})]}),C.length>0&&e.jsxs("table",{className:"w-full text-left mb-10",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-surface-border",children:[e.jsx("th",{className:x,children:"Tool"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Total"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Running"}),e.jsx("th",{className:`${x} text-right w-24`,children:"Completed"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Failed"}),e.jsx("th",{className:`${x} text-right w-28`,children:"Avg Duration"})]})}),e.jsx("tbody",{children:C.map(t=>e.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsx("button",{onClick:()=>n(t.pipeline),className:"hover:text-accent hover:underline",children:t.pipeline})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.total,colorClass:"text-text-secondary",onClick:()=>n(t.pipeline)})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.running,colorClass:"text-status-active",onClick:()=>n(t.pipeline,"running")})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.completed,colorClass:"text-status-success",onClick:()=>n(t.pipeline,"completed")})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.failed,colorClass:"text-status-error",onClick:()=>n(t.pipeline,"failed")})}),e.jsx("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:t.avgDuration!==null?q(t.avgDuration):"—"})]},t.pipeline))})]}),C.length===0&&e.jsx("div",{className:"py-12 text-center mb-8",children:e.jsxs("p",{className:"text-sm text-text-tertiary",children:["No MCP tool activity in the last ",c]})}),e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4",children:[e.jsxs("button",{onClick:()=>r("/mcp/servers"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(E,{size:16,className:"text-accent shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary",children:"Tool Servers"})]}),e.jsxs("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[L?"—":p.length,e.jsxs("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["server",p.length!==1?"s":""," · ",M," tool",M!==1?"s":""]})]}),e.jsx("p",{className:"text-2xs text-text-tertiary leading-relaxed mt-2",children:"Built-in and external MCP servers. Each server exposes tools that workflows and agents can call."})]}),e.jsxs("button",{onClick:()=>r("/mcp/workflows"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(O,{size:16,className:"text-purple-400 shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary",children:"Pipeline Registry"})]}),e.jsxs("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[_?"—":h.length,e.jsxs("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["workflow",h.length!==1?"s":""," · ",S," server",S!==1?"s":""]})]}),e.jsx("p",{className:"text-2xs text-text-tertiary leading-relaxed mt-2",children:"Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs."})]})]})]})}export{ee as McpOverview};
2
- //# sourceMappingURL=McpOverview-C2U1XfQw.js.map
1
+ import{a as o,j as e}from"./vendor-query-RUZdMvN6.js";import{u as A}from"./mcp-C-DMktCT.js";import{u as F}from"./pipelines-DNLwDumm.js";import{u as I}from"./yaml-workflows-YASUDPo0.js";import{u as W}from"./controlplane-BwGdcwXR.js";import{P as z}from"./PageHeader-xB92ELs3.js";import{S as b}from"./StatCard-BXQ8dD9Y.js";import{J as E,W as O}from"./vendor-icons-BCWsItQ7.js";import{u as U}from"./vendor-react-CdqEC2zv.js";import"./index-BaC3sbJH.js";const T=[{label:"1h",ms:36e5},{label:"24h",ms:864e5},{label:"7d",ms:6048e5},{label:"30d",ms:2592e6}];function q(r){return r<1e3?`${Math.round(r)}ms`:r<6e4?`${(r/1e3).toFixed(1)}s`:r<36e5?`${(r/6e4).toFixed(1)}m`:`${(r/36e5).toFixed(1)}h`}function j({value:r,colorClass:c,onClick:v}){return r===0?e.jsx("span",{className:"text-text-tertiary",children:"0"}):e.jsx("button",{onClick:v,className:`${c} hover:underline tabular-nums font-medium`,children:r})}function ee(){const r=U(),[c,v]=o.useState("24h"),[D,P]=o.useState(""),{data:d}=W(),k=o.useMemo(()=>((d==null?void 0:d.apps)??[]).map(t=>t.appId).sort(),[d==null?void 0:d.apps]),u=D||k[0]||"",{data:m}=F({limit:500,app_id:u}),{data:N,isLoading:L}=A(),{data:y,isLoading:_}=I({limit:200}),w=k,p=(N==null?void 0:N.servers)??[],h=(y==null?void 0:y.workflows)??[],M=o.useMemo(()=>p.reduce((t,l)=>t+(Array.isArray(l.tool_manifest)?l.tool_manifest.length:0),0),[p]),S=o.useMemo(()=>new Set(h.map(l=>l.app_id)).size,[h]),$=o.useMemo(()=>{const t=T.find(l=>l.label===c);return Date.now()-t.ms},[c]),i=o.useMemo(()=>((m==null?void 0:m.jobs)??[]).filter(t=>new Date(t.created_at).getTime()>=$),[m==null?void 0:m.jobs,$]),C=o.useMemo(()=>{const t=new Map;for(const s of i){const a=t.get(s.entity)??{total:0,running:0,completed:0,failed:0,durations:[]};if(a.total++,s.status==="running"&&a.running++,s.status==="completed"){a.completed++;const g=new Date(s.updated_at).getTime()-new Date(s.created_at).getTime();g>0&&a.durations.push(g)}s.status==="failed"&&a.failed++,t.set(s.entity,a)}const l=[];for(const[s,a]of t)l.push({pipeline:s,...a,avgDuration:a.durations.length>0?a.durations.reduce((g,R)=>g+R,0)/a.durations.length:null});return l.sort((s,a)=>a.total-s.total)},[i]),f=o.useMemo(()=>({total:i.length,running:i.filter(t=>t.status==="running").length,completed:i.filter(t=>t.status==="completed").length,failed:i.filter(t=>t.status==="failed").length}),[i]),n=(t,l)=>{const s=new URLSearchParams;u&&s.set("namespace",u),t&&s.set("entity",t),l&&s.set("status",l);const a=s.toString();r(`/mcp/executions${a?`?${a}`:""}`)},x="pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxs("div",{children:[e.jsx(z,{title:"Discovered"}),e.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[e.jsx("div",{className:"flex items-center gap-1",children:T.map(t=>e.jsx("button",{onClick:()=>v(t.label),className:`px-3 py-1 text-xs rounded-full transition-colors ${c===t.label?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:t.label},t.label))}),w.length>1&&e.jsx("select",{value:u,onChange:t=>P(t.target.value),className:"select text-xs py-1 px-2",children:w.map(t=>e.jsx("option",{value:t,children:t},t))})]}),e.jsxs("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsx(b,{label:"Total Runs",value:f.total,onClick:()=>n()}),e.jsx(b,{label:"Running",value:f.running,colorClass:"text-status-active",onClick:()=>n(void 0,"running")}),e.jsx(b,{label:"Completed",value:f.completed,colorClass:"text-status-success",onClick:()=>n(void 0,"completed")}),e.jsx(b,{label:"Failed",value:f.failed,colorClass:"text-status-error",onClick:()=>n(void 0,"failed")})]}),C.length>0&&e.jsxs("table",{className:"w-full text-left mb-10",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-surface-border",children:[e.jsx("th",{className:x,children:"Tool"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Total"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Running"}),e.jsx("th",{className:`${x} text-right w-24`,children:"Completed"}),e.jsx("th",{className:`${x} text-right w-20`,children:"Failed"}),e.jsx("th",{className:`${x} text-right w-28`,children:"Avg Duration"})]})}),e.jsx("tbody",{children:C.map(t=>e.jsxs("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsx("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsx("button",{onClick:()=>n(t.pipeline),className:"hover:text-accent hover:underline",children:t.pipeline})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.total,colorClass:"text-text-secondary",onClick:()=>n(t.pipeline)})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.running,colorClass:"text-status-active",onClick:()=>n(t.pipeline,"running")})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.completed,colorClass:"text-status-success",onClick:()=>n(t.pipeline,"completed")})}),e.jsx("td",{className:"py-3 text-sm text-right",children:e.jsx(j,{value:t.failed,colorClass:"text-status-error",onClick:()=>n(t.pipeline,"failed")})}),e.jsx("td",{className:"py-3 text-sm font-mono text-text-secondary text-right",children:t.avgDuration!==null?q(t.avgDuration):"—"})]},t.pipeline))})]}),C.length===0&&e.jsx("div",{className:"py-12 text-center mb-8",children:e.jsxs("p",{className:"text-sm text-text-tertiary",children:["No MCP tool activity in the last ",c]})}),e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4",children:[e.jsxs("button",{onClick:()=>r("/mcp/servers"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(E,{size:16,className:"text-accent shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary",children:"Tool Servers"})]}),e.jsxs("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[L?"—":p.length,e.jsxs("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["server",p.length!==1?"s":""," · ",M," tool",M!==1?"s":""]})]}),e.jsx("p",{className:"text-2xs text-text-tertiary leading-relaxed mt-2",children:"Built-in and external MCP servers. Each server exposes tools that workflows and agents can call."})]}),e.jsxs("button",{onClick:()=>r("/mcp/workflows"),className:"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-3",children:[e.jsx(O,{size:16,className:"text-purple-400 shrink-0"}),e.jsx("span",{className:"text-sm font-medium text-text-primary",children:"Pipeline Registry"})]}),e.jsxs("p",{className:"text-2xl font-light tabular-nums text-text-primary mb-1",children:[_?"—":h.length,e.jsxs("span",{className:"text-sm text-text-tertiary font-normal ml-2",children:["workflow",h.length!==1?"s":""," · ",S," server",S!==1?"s":""]})]}),e.jsx("p",{className:"text-2xs text-text-tertiary leading-relaxed mt-2",children:"Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs."})]})]})]})}export{ee as McpOverview};
2
+ //# sourceMappingURL=McpOverview-Ciq8r6-p.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"McpOverview-C2U1XfQw.js","sources":["../../src/pages/mcp/McpOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Server, Workflow } from 'lucide-react';\nimport { useMcpServers } from '../../api/mcp';\nimport { useMcpRuns } from '../../api/pipelines';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useControlPlaneApps } from '../../api/controlplane';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\nimport type { McpToolManifest } from '../../api/types';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface PipelineStats {\n pipeline: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Reusable components ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function McpOverview() {\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n const [namespace, setNamespace] = useState('');\n\n const { data: appsData } = useControlPlaneApps();\n\n // Auto-select the first namespace when available\n const nsNames = useMemo(() => (appsData?.apps ?? []).map((a: any) => a.appId).sort(), [appsData?.apps]);\n const effectiveNamespace = namespace || nsNames[0] || '';\n\n const { data: allRuns } = useMcpRuns({ limit: 500, app_id: effectiveNamespace });\n const { data: serverData, isLoading: serversLoading } = useMcpServers();\n const { data: yamlData, isLoading: yamlLoading } = useYamlWorkflows({ limit: 200 });\n\n const namespaces = nsNames;\n\n // ── Server counts ────────────────────────────────────────────\n const servers = serverData?.servers ?? [];\n const yamlWorkflows = yamlData?.workflows ?? [];\n\n const serverToolCount = useMemo(\n () => servers.reduce((sum, s) => sum + (Array.isArray(s.tool_manifest) ? (s.tool_manifest as McpToolManifest[]).length : 0), 0),\n [servers],\n );\n\n const workflowServerCount = useMemo(() => {\n const appIds = new Set(yamlWorkflows.map((wf) => wf.app_id));\n return appIds.size;\n }, [yamlWorkflows]);\n\n // ── Run stats ──────────────────────────────────────────────────\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const runs = useMemo(\n () => (allRuns?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allRuns?.jobs, cutoff],\n );\n\n const byPipeline = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of runs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: PipelineStats[] = [];\n for (const [pipeline, stats] of map) {\n result.push({\n pipeline,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [runs]);\n\n const totals = useMemo(() => ({\n total: runs.length,\n running: runs.filter((j) => j.status === 'running').length,\n completed: runs.filter((j) => j.status === 'completed').length,\n failed: runs.filter((j) => j.status === 'failed').length,\n }), [runs]);\n\n const goToRuns = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (effectiveNamespace) params.set('namespace', effectiveNamespace);\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/mcp/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Discovered\" />\n\n {/* ── Duration tabs + namespace ────────────────────────── */}\n <div className=\"flex items-center gap-4 mb-6\">\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n {namespaces.length > 1 && (\n <select\n value={effectiveNamespace}\n onChange={(e) => setNamespace(e.target.value)}\n className=\"select text-xs py-1 px-2\"\n >\n {namespaces.map((ns) => (\n <option key={ns} value={ns}>{ns}</option>\n ))}\n </select>\n )}\n </div>\n\n {/* ── Summary cards ────────────────────────────────────── */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total Runs\" value={totals.total} onClick={() => goToRuns()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToRuns(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(undefined, 'failed')} />\n </div>\n\n {/* ── By-pipeline table ────────────────────────────────── */}\n {byPipeline.length > 0 && (\n <table className=\"w-full text-left mb-10\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Tool</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byPipeline.map((row) => (\n <tr key={row.pipeline} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToRuns(row.pipeline)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.pipeline}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToRuns(row.pipeline)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToRuns(row.pipeline, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(row.pipeline, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(row.pipeline, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byPipeline.length === 0 && (\n <div className=\"py-12 text-center mb-8\">\n <p className=\"text-sm text-text-tertiary\">\n No MCP tool activity in the last {duration}\n </p>\n </div>\n )}\n\n {/* ── Server inventory (compact cards) ─────────────────── */}\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4\">\n <button\n onClick={() => navigate('/mcp/servers')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Server size={16} className=\"text-accent shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Tool Servers</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {serversLoading ? '—' : servers.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n server{servers.length !== 1 ? 's' : ''} · {serverToolCount} tool{serverToolCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-2xs text-text-tertiary leading-relaxed mt-2\">\n Built-in and external MCP servers. Each server exposes tools that workflows and agents can call.\n </p>\n </button>\n\n <button\n onClick={() => navigate('/mcp/workflows')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Workflow size={16} className=\"text-purple-400 shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Pipeline Registry</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {yamlLoading ? '—' : yamlWorkflows.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n workflow{yamlWorkflows.length !== 1 ? 's' : ''} · {workflowServerCount} server{workflowServerCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-2xs text-text-tertiary leading-relaxed mt-2\">\n Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs.\n </p>\n </button>\n </div>\n </div>\n );\n}\n"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","McpOverview","navigate","useNavigate","duration","setDuration","useState","namespace","setNamespace","appsData","useControlPlaneApps","nsNames","useMemo","a","effectiveNamespace","allRuns","useMcpRuns","serverData","serversLoading","useMcpServers","yamlData","yamlLoading","useYamlWorkflows","namespaces","servers","yamlWorkflows","serverToolCount","sum","s","workflowServerCount","wf","cutoff","d","runs","j","byPipeline","map","entry","dur","result","pipeline","stats","b","totals","goToRuns","entity","status","params","qs","thCls","PageHeader","jsxs","e","ns","StatCard","row","Server","Workflow"],"mappings":"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"}
1
+ {"version":3,"file":"McpOverview-Ciq8r6-p.js","sources":["../../src/pages/mcp/McpOverview.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Server, Workflow } from 'lucide-react';\nimport { useMcpServers } from '../../api/mcp';\nimport { useMcpRuns } from '../../api/pipelines';\nimport { useYamlWorkflows } from '../../api/yaml-workflows';\nimport { useControlPlaneApps } from '../../api/controlplane';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\nimport type { McpToolManifest } from '../../api/types';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', ms: 3_600_000 },\n { label: '24h', ms: 86_400_000 },\n { label: '7d', ms: 604_800_000 },\n { label: '30d', ms: 2_592_000_000 },\n] as const;\n\ntype DurationLabel = (typeof DURATIONS)[number]['label'];\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3_600_000) return `${(ms / 60_000).toFixed(1)}m`;\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\ninterface PipelineStats {\n pipeline: string;\n total: number;\n running: number;\n completed: number;\n failed: number;\n avgDuration: number | null;\n}\n\n// ── Reusable components ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function McpOverview() {\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationLabel>('24h');\n const [namespace, setNamespace] = useState('');\n\n const { data: appsData } = useControlPlaneApps();\n\n // Auto-select the first namespace when available\n const nsNames = useMemo(() => (appsData?.apps ?? []).map((a: any) => a.appId).sort(), [appsData?.apps]);\n const effectiveNamespace = namespace || nsNames[0] || '';\n\n const { data: allRuns } = useMcpRuns({ limit: 500, app_id: effectiveNamespace });\n const { data: serverData, isLoading: serversLoading } = useMcpServers();\n const { data: yamlData, isLoading: yamlLoading } = useYamlWorkflows({ limit: 200 });\n\n const namespaces = nsNames;\n\n // ── Server counts ────────────────────────────────────────────\n const servers = serverData?.servers ?? [];\n const yamlWorkflows = yamlData?.workflows ?? [];\n\n const serverToolCount = useMemo(\n () => servers.reduce((sum, s) => sum + (Array.isArray(s.tool_manifest) ? (s.tool_manifest as McpToolManifest[]).length : 0), 0),\n [servers],\n );\n\n const workflowServerCount = useMemo(() => {\n const appIds = new Set(yamlWorkflows.map((wf) => wf.app_id));\n return appIds.size;\n }, [yamlWorkflows]);\n\n // ── Run stats ──────────────────────────────────────────────────\n const cutoff = useMemo(() => {\n const d = DURATIONS.find((d) => d.label === duration)!;\n return Date.now() - d.ms;\n }, [duration]);\n\n const runs = useMemo(\n () => (allRuns?.jobs ?? []).filter((j) => new Date(j.created_at).getTime() >= cutoff),\n [allRuns?.jobs, cutoff],\n );\n\n const byPipeline = useMemo(() => {\n const map = new Map<string, { total: number; running: number; completed: number; failed: number; durations: number[] }>();\n for (const j of runs) {\n const entry = map.get(j.entity) ?? { total: 0, running: 0, completed: 0, failed: 0, durations: [] };\n entry.total++;\n if (j.status === 'running') entry.running++;\n if (j.status === 'completed') {\n entry.completed++;\n const dur = new Date(j.updated_at).getTime() - new Date(j.created_at).getTime();\n if (dur > 0) entry.durations.push(dur);\n }\n if (j.status === 'failed') entry.failed++;\n map.set(j.entity, entry);\n }\n\n const result: PipelineStats[] = [];\n for (const [pipeline, stats] of map) {\n result.push({\n pipeline,\n ...stats,\n avgDuration: stats.durations.length > 0\n ? stats.durations.reduce((a, b) => a + b, 0) / stats.durations.length\n : null,\n });\n }\n return result.sort((a, b) => b.total - a.total);\n }, [runs]);\n\n const totals = useMemo(() => ({\n total: runs.length,\n running: runs.filter((j) => j.status === 'running').length,\n completed: runs.filter((j) => j.status === 'completed').length,\n failed: runs.filter((j) => j.status === 'failed').length,\n }), [runs]);\n\n const goToRuns = (entity?: string, status?: string) => {\n const params = new URLSearchParams();\n if (effectiveNamespace) params.set('namespace', effectiveNamespace);\n if (entity) params.set('entity', entity);\n if (status) params.set('status', status);\n const qs = params.toString();\n navigate(`/mcp/executions${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-2xs font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Discovered\" />\n\n {/* ── Duration tabs + namespace ────────────────────────── */}\n <div className=\"flex items-center gap-4 mb-6\">\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.label}\n onClick={() => setDuration(d.label)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.label\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n {namespaces.length > 1 && (\n <select\n value={effectiveNamespace}\n onChange={(e) => setNamespace(e.target.value)}\n className=\"select text-xs py-1 px-2\"\n >\n {namespaces.map((ns) => (\n <option key={ns} value={ns}>{ns}</option>\n ))}\n </select>\n )}\n </div>\n\n {/* ── Summary cards ────────────────────────────────────── */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Total Runs\" value={totals.total} onClick={() => goToRuns()} />\n <StatCard label=\"Running\" value={totals.running} colorClass=\"text-status-active\" onClick={() => goToRuns(undefined, 'running')} />\n <StatCard label=\"Completed\" value={totals.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(undefined, 'completed')} />\n <StatCard label=\"Failed\" value={totals.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(undefined, 'failed')} />\n </div>\n\n {/* ── By-pipeline table ────────────────────────────────── */}\n {byPipeline.length > 0 && (\n <table className=\"w-full text-left mb-10\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Tool</th>\n <th className={`${thCls} text-right w-20`}>Total</th>\n <th className={`${thCls} text-right w-20`}>Running</th>\n <th className={`${thCls} text-right w-24`}>Completed</th>\n <th className={`${thCls} text-right w-20`}>Failed</th>\n <th className={`${thCls} text-right w-28`}>Avg Duration</th>\n </tr>\n </thead>\n <tbody>\n {byPipeline.map((row) => (\n <tr key={row.pipeline} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToRuns(row.pipeline)}\n className=\"hover:text-accent hover:underline\"\n >\n {row.pipeline}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.total} colorClass=\"text-text-secondary\" onClick={() => goToRuns(row.pipeline)} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.running} colorClass=\"text-status-active\" onClick={() => goToRuns(row.pipeline, 'running')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.completed} colorClass=\"text-status-success\" onClick={() => goToRuns(row.pipeline, 'completed')} />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell value={row.failed} colorClass=\"text-status-error\" onClick={() => goToRuns(row.pipeline, 'failed')} />\n </td>\n <td className=\"py-3 text-sm font-mono text-text-secondary text-right\">\n {row.avgDuration !== null ? formatDuration(row.avgDuration) : '—'}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n\n {byPipeline.length === 0 && (\n <div className=\"py-12 text-center mb-8\">\n <p className=\"text-sm text-text-tertiary\">\n No MCP tool activity in the last {duration}\n </p>\n </div>\n )}\n\n {/* ── Server inventory (compact cards) ─────────────────── */}\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4\">\n <button\n onClick={() => navigate('/mcp/servers')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Server size={16} className=\"text-accent shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Tool Servers</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {serversLoading ? '—' : servers.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n server{servers.length !== 1 ? 's' : ''} · {serverToolCount} tool{serverToolCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-2xs text-text-tertiary leading-relaxed mt-2\">\n Built-in and external MCP servers. Each server exposes tools that workflows and agents can call.\n </p>\n </button>\n\n <button\n onClick={() => navigate('/mcp/workflows')}\n className=\"bg-surface-raised border border-surface-border rounded-md p-5 text-left hover:border-accent/40 transition-colors\"\n >\n <div className=\"flex items-center gap-3 mb-3\">\n <Workflow size={16} className=\"text-purple-400 shrink-0\" />\n <span className=\"text-sm font-medium text-text-primary\">Pipeline Registry</span>\n </div>\n <p className=\"text-2xl font-light tabular-nums text-text-primary mb-1\">\n {yamlLoading ? '—' : yamlWorkflows.length}\n <span className=\"text-sm text-text-tertiary font-normal ml-2\">\n workflow{yamlWorkflows.length !== 1 ? 's' : ''} · {workflowServerCount} server{workflowServerCount !== 1 ? 's' : ''}\n </span>\n </p>\n <p className=\"text-2xs text-text-tertiary leading-relaxed mt-2\">\n Compiled from discovery runs. Deterministic tool-to-tool pipelines — no LLM, no token costs.\n </p>\n </button>\n </div>\n </div>\n );\n}\n"],"names":["DURATIONS","formatDuration","ms","StatCell","value","colorClass","onClick","jsx","McpOverview","navigate","useNavigate","duration","setDuration","useState","namespace","setNamespace","appsData","useControlPlaneApps","nsNames","useMemo","a","effectiveNamespace","allRuns","useMcpRuns","serverData","serversLoading","useMcpServers","yamlData","yamlLoading","useYamlWorkflows","namespaces","servers","yamlWorkflows","serverToolCount","sum","s","workflowServerCount","wf","cutoff","d","runs","j","byPipeline","map","entry","dur","result","pipeline","stats","b","totals","goToRuns","entity","status","params","qs","thCls","PageHeader","jsxs","e","ns","StatCard","row","Server","Workflow"],"mappings":"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"}