@hotmeshio/long-tail 0.17.0 → 0.17.1

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 (223) hide show
  1. package/dashboard/dist/assets/AdminDashboard-D-YHIR8w.js +2 -0
  2. package/dashboard/dist/assets/{AdminDashboard-Bx5G6Qb_.js.map → AdminDashboard-D-YHIR8w.js.map} +1 -1
  3. package/dashboard/dist/assets/{AgentConfigPage-S-YfPwCG.js → AgentConfigPage-CG54Ll2A.js} +7 -7
  4. package/dashboard/dist/assets/{AgentConfigPage-S-YfPwCG.js.map → AgentConfigPage-CG54Ll2A.js.map} +1 -1
  5. package/dashboard/dist/assets/{AgentDetailPage-pFVqLY4c.js → AgentDetailPage-rTcofeW4.js} +3 -3
  6. package/dashboard/dist/assets/{AgentDetailPage-pFVqLY4c.js.map → AgentDetailPage-rTcofeW4.js.map} +1 -1
  7. package/dashboard/dist/assets/AgentsPage-B7PNjrkn.js +2 -0
  8. package/dashboard/dist/assets/{AgentsPage-DjAluFkM.js.map → AgentsPage-B7PNjrkn.js.map} +1 -1
  9. package/dashboard/dist/assets/AvailableEscalationsPage-CEDwyzlx.js +2 -0
  10. package/dashboard/dist/assets/AvailableEscalationsPage-CEDwyzlx.js.map +1 -0
  11. package/dashboard/dist/assets/{BotPicker-h2YrxQS2.js → BotPicker-cg1qXRF3.js} +2 -2
  12. package/dashboard/dist/assets/{BotPicker-h2YrxQS2.js.map → BotPicker-cg1qXRF3.js.map} +1 -1
  13. package/dashboard/dist/assets/{BulkAssignModal-CNKZBgK5.js → BulkAssignModal-BDzaHGAb.js} +2 -2
  14. package/dashboard/dist/assets/{BulkAssignModal-CNKZBgK5.js.map → BulkAssignModal-BDzaHGAb.js.map} +1 -1
  15. package/dashboard/dist/assets/CapabilitiesPage-CswExj9-.js +2 -0
  16. package/dashboard/dist/assets/{CapabilitiesPage-DGsnIiJi.js.map → CapabilitiesPage-CswExj9-.js.map} +1 -1
  17. package/dashboard/dist/assets/{CollapsibleSection-ptEsXSl6.js → CollapsibleSection-CpVKfkkq.js} +2 -2
  18. package/dashboard/dist/assets/{CollapsibleSection-ptEsXSl6.js.map → CollapsibleSection-CpVKfkkq.js.map} +1 -1
  19. package/dashboard/dist/assets/CountdownTimer-ClJhYGg1.js +2 -0
  20. package/dashboard/dist/assets/{CountdownTimer-Cvif0QtN.js.map → CountdownTimer-ClJhYGg1.js.map} +1 -1
  21. package/dashboard/dist/assets/{CredentialsPage-CwKUAtAR.js → CredentialsPage-DYBp7v8W.js} +2 -2
  22. package/dashboard/dist/assets/{CredentialsPage-CwKUAtAR.js.map → CredentialsPage-DYBp7v8W.js.map} +1 -1
  23. package/dashboard/dist/assets/{CronLabel-B9RbqMR-.js → CronLabel-Bd_fipHy.js} +2 -2
  24. package/dashboard/dist/assets/{CronLabel-B9RbqMR-.js.map → CronLabel-Bd_fipHy.js.map} +1 -1
  25. package/dashboard/dist/assets/ElapsedCell-B-Wn6Y8B.js +2 -0
  26. package/dashboard/dist/assets/{ElapsedCell-BirS3yZq.js.map → ElapsedCell-B-Wn6Y8B.js.map} +1 -1
  27. package/dashboard/dist/assets/EntityTimelinePanel-DcgFUbk4.js +2 -0
  28. package/dashboard/dist/assets/{EntityTimelinePanel-D3QNqDiL.js.map → EntityTimelinePanel-DcgFUbk4.js.map} +1 -1
  29. package/dashboard/dist/assets/{EscalationListSchemaPage-Bke-30FY.js → EscalationListSchemaPage-DpnorXeU.js} +3 -3
  30. package/dashboard/dist/assets/{EscalationListSchemaPage-Bke-30FY.js.map → EscalationListSchemaPage-DpnorXeU.js.map} +1 -1
  31. package/dashboard/dist/assets/{EscalationSchemaPage-CTFE9vko.js → EscalationSchemaPage-LPTJJDfP.js} +3 -3
  32. package/dashboard/dist/assets/{EscalationSchemaPage-CTFE9vko.js.map → EscalationSchemaPage-LPTJJDfP.js.map} +1 -1
  33. package/dashboard/dist/assets/EscalationsOverview-Bq5_ICUt.js +2 -0
  34. package/dashboard/dist/assets/{EscalationsOverview-C2FaSmXk.js.map → EscalationsOverview-Bq5_ICUt.js.map} +1 -1
  35. package/dashboard/dist/assets/{EventTable-zFqzbEdC.js → EventTable-Cinbdm1u.js} +2 -2
  36. package/dashboard/dist/assets/{EventTable-zFqzbEdC.js.map → EventTable-Cinbdm1u.js.map} +1 -1
  37. package/dashboard/dist/assets/FilterBar-DyojX5m4.js +2 -0
  38. package/dashboard/dist/assets/FilterBar-DyojX5m4.js.map +1 -0
  39. package/dashboard/dist/assets/{GraphInvokePage-CA_XYI2W.js → GraphInvokePage-Ba5fNcgv.js} +2 -2
  40. package/dashboard/dist/assets/{GraphInvokePage-CA_XYI2W.js.map → GraphInvokePage-Ba5fNcgv.js.map} +1 -1
  41. package/dashboard/dist/assets/HomePage-DuFXqfz3.js +2 -0
  42. package/dashboard/dist/assets/HomePage-DuFXqfz3.js.map +1 -0
  43. package/dashboard/dist/assets/ListToolbar-GpwHcjkZ.js +2 -0
  44. package/dashboard/dist/assets/{ListToolbar-BEogxu1f.js.map → ListToolbar-GpwHcjkZ.js.map} +1 -1
  45. package/dashboard/dist/assets/{McpOverview-CdMR-5qh.js → McpOverview-Bi23-hih.js} +2 -2
  46. package/dashboard/dist/assets/{McpOverview-CdMR-5qh.js.map → McpOverview-Bi23-hih.js.map} +1 -1
  47. package/dashboard/dist/assets/{McpQueryDetailPage-BXo4UjJF.js → McpQueryDetailPage-FhHSfX9W.js} +4 -4
  48. package/dashboard/dist/assets/{McpQueryDetailPage-BXo4UjJF.js.map → McpQueryDetailPage-FhHSfX9W.js.map} +1 -1
  49. package/dashboard/dist/assets/McpQueryPage-czMlM7vR.js +2 -0
  50. package/dashboard/dist/assets/{McpQueryPage-BvvM0Ya1.js.map → McpQueryPage-czMlM7vR.js.map} +1 -1
  51. package/dashboard/dist/assets/McpRunDetailPage-BOh2M0Ca.js +2 -0
  52. package/dashboard/dist/assets/McpRunDetailPage-BOh2M0Ca.js.map +1 -0
  53. package/dashboard/dist/assets/McpRunsPage-DfJzbGYM.js +2 -0
  54. package/dashboard/dist/assets/McpRunsPage-DfJzbGYM.js.map +1 -0
  55. package/dashboard/dist/assets/OperationsPage-BS8blKLj.js +3 -0
  56. package/dashboard/dist/assets/OperationsPage-BS8blKLj.js.map +1 -0
  57. package/dashboard/dist/assets/OperatorDashboard-BWtTKrcJ.js +2 -0
  58. package/dashboard/dist/assets/OperatorDashboard-BWtTKrcJ.js.map +1 -0
  59. package/dashboard/dist/assets/{PersonaDetailPage-BHQ44UIu.js → PersonaDetailPage-VkhuauBf.js} +2 -2
  60. package/dashboard/dist/assets/{PersonaDetailPage-BHQ44UIu.js.map → PersonaDetailPage-VkhuauBf.js.map} +1 -1
  61. package/dashboard/dist/assets/PersonasPage-DRoneLfx.js +2 -0
  62. package/dashboard/dist/assets/PersonasPage-DRoneLfx.js.map +1 -0
  63. package/dashboard/dist/assets/ProcessDetailPage-B5mmkHS0.js +2 -0
  64. package/dashboard/dist/assets/{ProcessDetailPage-CZ09xiWf.js.map → ProcessDetailPage-B5mmkHS0.js.map} +1 -1
  65. package/dashboard/dist/assets/ProcessesListPage-BV0e2OfH.js +2 -0
  66. package/dashboard/dist/assets/ProcessesListPage-BV0e2OfH.js.map +1 -0
  67. package/dashboard/dist/assets/{RoleDetailPage-CDsJKPvV.js → RoleDetailPage-eenl_a5Z.js} +2 -2
  68. package/dashboard/dist/assets/{RoleDetailPage-CDsJKPvV.js.map → RoleDetailPage-eenl_a5Z.js.map} +1 -1
  69. package/dashboard/dist/assets/{RolesPage-D2cV92bL.js → RolesPage-BLfJcFf7.js} +2 -2
  70. package/dashboard/dist/assets/{RolesPage-D2cV92bL.js.map → RolesPage-BLfJcFf7.js.map} +1 -1
  71. package/dashboard/dist/assets/{RunAsSelector-Cvi8x8xx.js → RunAsSelector-BnLKKs51.js} +2 -2
  72. package/dashboard/dist/assets/{RunAsSelector-Cvi8x8xx.js.map → RunAsSelector-BnLKKs51.js.map} +1 -1
  73. package/dashboard/dist/assets/{ScanCodesPage-BWt_iRCu.js → ScanCodesPage-BWIcjnr4.js} +2 -2
  74. package/dashboard/dist/assets/{ScanCodesPage-BWt_iRCu.js.map → ScanCodesPage-BWIcjnr4.js.map} +1 -1
  75. package/dashboard/dist/assets/ScanSchemeDetailPage-sAuU8cZj.js +2 -0
  76. package/dashboard/dist/assets/{ScanSchemeDetailPage-C6mRYkxL.js.map → ScanSchemeDetailPage-sAuU8cZj.js.map} +1 -1
  77. package/dashboard/dist/assets/ScanStationPage-CA_q1uaI.js +2 -0
  78. package/dashboard/dist/assets/{ScanStationPage-YQiijAKy.js.map → ScanStationPage-CA_q1uaI.js.map} +1 -1
  79. package/dashboard/dist/assets/{StickyPagination-BsbSade1.js → StickyPagination-sVI21e82.js} +2 -2
  80. package/dashboard/dist/assets/{StickyPagination-BsbSade1.js.map → StickyPagination-sVI21e82.js.map} +1 -1
  81. package/dashboard/dist/assets/{StreamMessageDetail-jczXwuBw.js → StreamMessageDetail-Djm_zQAv.js} +2 -2
  82. package/dashboard/dist/assets/{StreamMessageDetail-jczXwuBw.js.map → StreamMessageDetail-Djm_zQAv.js.map} +1 -1
  83. package/dashboard/dist/assets/{SwimlaneTimeline-DSO6QXmX.js → SwimlaneTimeline-CwxXRmRQ.js} +2 -2
  84. package/dashboard/dist/assets/{SwimlaneTimeline-DSO6QXmX.js.map → SwimlaneTimeline-CwxXRmRQ.js.map} +1 -1
  85. package/dashboard/dist/assets/{TaskDetailPage-DWLfcAF4.js → TaskDetailPage-SiBSTsfp.js} +2 -2
  86. package/dashboard/dist/assets/{TaskDetailPage-DWLfcAF4.js.map → TaskDetailPage-SiBSTsfp.js.map} +1 -1
  87. package/dashboard/dist/assets/{TasksListPage-B0at3vJ3.js → TasksListPage-CBTFz3Bp.js} +2 -2
  88. package/dashboard/dist/assets/{TasksListPage-B0at3vJ3.js.map → TasksListPage-CBTFz3Bp.js.map} +1 -1
  89. package/dashboard/dist/assets/TimeAgo-Ctwwdamz.js +2 -0
  90. package/dashboard/dist/assets/{TimeAgo-poxwErGl.js.map → TimeAgo-Ctwwdamz.js.map} +1 -1
  91. package/dashboard/dist/assets/{TimestampCell-Be6tvFQd.js → TimestampCell-CI8UrDuQ.js} +2 -2
  92. package/dashboard/dist/assets/{TimestampCell-Be6tvFQd.js.map → TimestampCell-CI8UrDuQ.js.map} +1 -1
  93. package/dashboard/dist/assets/{ToolTestPanel-CYOqnqMz.js → ToolTestPanel-Cf9ZEBF7.js} +2 -2
  94. package/dashboard/dist/assets/{ToolTestPanel-CYOqnqMz.js.map → ToolTestPanel-Cf9ZEBF7.js.map} +1 -1
  95. package/dashboard/dist/assets/{TopicDetailPage-C82WIKaU.js → TopicDetailPage-BYIOSVNy.js} +3 -3
  96. package/dashboard/dist/assets/{TopicDetailPage-C82WIKaU.js.map → TopicDetailPage-BYIOSVNy.js.map} +1 -1
  97. package/dashboard/dist/assets/{TopicsPage-COH547ZD.js → TopicsPage-C9x4tIEi.js} +2 -2
  98. package/dashboard/dist/assets/{TopicsPage-COH547ZD.js.map → TopicsPage-C9x4tIEi.js.map} +1 -1
  99. package/dashboard/dist/assets/{UserName-D2SoVbe9.js → UserName-Ck-eLb-1.js} +2 -2
  100. package/dashboard/dist/assets/{UserName-D2SoVbe9.js.map → UserName-Ck-eLb-1.js.map} +1 -1
  101. package/dashboard/dist/assets/WorkflowExecutionPage-BPxoPK8g.js +2 -0
  102. package/dashboard/dist/assets/{WorkflowExecutionPage-C82Q-TYC.js.map → WorkflowExecutionPage-BPxoPK8g.js.map} +1 -1
  103. package/dashboard/dist/assets/WorkflowsDashboard-CDHQUYEr.js +2 -0
  104. package/dashboard/dist/assets/WorkflowsDashboard-CDHQUYEr.js.map +1 -0
  105. package/dashboard/dist/assets/WorkflowsOverview-DGp8J0G2.js +2 -0
  106. package/dashboard/dist/assets/{WorkflowsOverview-DdKRtWdK.js.map → WorkflowsOverview-DGp8J0G2.js.map} +1 -1
  107. package/dashboard/dist/assets/{YamlWorkflowDetailPage-D3qvyy_4.js → YamlWorkflowDetailPage-B112bGAY.js} +2 -2
  108. package/dashboard/dist/assets/{YamlWorkflowDetailPage-D3qvyy_4.js.map → YamlWorkflowDetailPage-B112bGAY.js.map} +1 -1
  109. package/dashboard/dist/assets/{YamlWorkflowsPage-BJsxZOBC.js → YamlWorkflowsPage-Cw5wddH7.js} +2 -2
  110. package/dashboard/dist/assets/{YamlWorkflowsPage-BJsxZOBC.js.map → YamlWorkflowsPage-Cw5wddH7.js.map} +1 -1
  111. package/dashboard/dist/assets/{agents-OQHCkIfJ.js → agents-CZ8WIdWH.js} +2 -2
  112. package/dashboard/dist/assets/{agents-OQHCkIfJ.js.map → agents-CZ8WIdWH.js.map} +1 -1
  113. package/dashboard/dist/assets/{bots-e8jsNOf4.js → bots-Xu3MUuXN.js} +2 -2
  114. package/dashboard/dist/assets/{bots-e8jsNOf4.js.map → bots-Xu3MUuXN.js.map} +1 -1
  115. package/dashboard/dist/assets/capabilities-XJukFiLn.js +2 -0
  116. package/dashboard/dist/assets/{capabilities-CEo0AB79.js.map → capabilities-XJukFiLn.js.map} +1 -1
  117. package/dashboard/dist/assets/{controlplane-CD6ti-QB.js → controlplane-D8ZQQUAV.js} +2 -2
  118. package/dashboard/dist/assets/{controlplane-CD6ti-QB.js.map → controlplane-D8ZQQUAV.js.map} +1 -1
  119. package/dashboard/dist/assets/escalation-columns-C1GyAMeK.js +2 -0
  120. package/dashboard/dist/assets/{escalation-columns-CUtDSbxl.js.map → escalation-columns-C1GyAMeK.js.map} +1 -1
  121. package/dashboard/dist/assets/index-BEeGFfuP.js +67 -0
  122. package/dashboard/dist/assets/index-BEeGFfuP.js.map +1 -0
  123. package/dashboard/dist/assets/{index-C8VhbKFU.js → index-CHAmwNDI.js} +2 -2
  124. package/dashboard/dist/assets/index-CHAmwNDI.js.map +1 -0
  125. package/dashboard/dist/assets/index-COtlcGK_.js +2 -0
  126. package/dashboard/dist/assets/index-COtlcGK_.js.map +1 -0
  127. package/dashboard/dist/assets/{index-B2aiEKtM.js → index-CR96SICL.js} +2 -2
  128. package/dashboard/dist/assets/{index-B2aiEKtM.js.map → index-CR96SICL.js.map} +1 -1
  129. package/dashboard/dist/assets/{index-Bf4IPu7I.js → index-CRxbF5vt.js} +2 -2
  130. package/dashboard/dist/assets/{index-Bf4IPu7I.js.map → index-CRxbF5vt.js.map} +1 -1
  131. package/dashboard/dist/assets/{index-BpwkKV5f.js → index-CgGR0kM6.js} +3 -3
  132. package/dashboard/dist/assets/{index-BpwkKV5f.js.map → index-CgGR0kM6.js.map} +1 -1
  133. package/dashboard/dist/assets/{index-BsP7vujM.js → index-DCaGxwKU.js} +2 -2
  134. package/dashboard/dist/assets/{index-BsP7vujM.js.map → index-DCaGxwKU.js.map} +1 -1
  135. package/dashboard/dist/assets/{index-COUj4v_W.js → index-DFmV19fc.js} +3 -3
  136. package/dashboard/dist/assets/{index-COUj4v_W.js.map → index-DFmV19fc.js.map} +1 -1
  137. package/dashboard/dist/assets/{index-CTZEzzN3.js → index-DWhyH1kV.js} +2 -2
  138. package/dashboard/dist/assets/{index-CTZEzzN3.js.map → index-DWhyH1kV.js.map} +1 -1
  139. package/dashboard/dist/assets/{index-B0C6wSrQ.js → index-DYIy3uT5.js} +2 -2
  140. package/dashboard/dist/assets/{index-B0C6wSrQ.js.map → index-DYIy3uT5.js.map} +1 -1
  141. package/dashboard/dist/assets/index-D_5_1D7U.js +2 -0
  142. package/dashboard/dist/assets/index-D_5_1D7U.js.map +1 -0
  143. package/dashboard/dist/assets/{index-B76fjEom.js → index-Dc43wixL.js} +2 -2
  144. package/dashboard/dist/assets/{index-B76fjEom.js.map → index-Dc43wixL.js.map} +1 -1
  145. package/dashboard/dist/assets/{index-DIHr2CvI.js → index-DeRM0-Xz.js} +2 -2
  146. package/dashboard/dist/assets/{index-DIHr2CvI.js.map → index-DeRM0-Xz.js.map} +1 -1
  147. package/dashboard/dist/assets/{knowledge-C89zT4Qe.js → knowledge-sjJNIdJY.js} +2 -2
  148. package/dashboard/dist/assets/{knowledge-C89zT4Qe.js.map → knowledge-sjJNIdJY.js.map} +1 -1
  149. package/dashboard/dist/assets/{mcp-BLKHykZS.js → mcp-CQeu19Jf.js} +2 -2
  150. package/dashboard/dist/assets/{mcp-BLKHykZS.js.map → mcp-CQeu19Jf.js.map} +1 -1
  151. package/dashboard/dist/assets/{mcp-query-CfiqUNDV.js → mcp-query-B9GuC88j.js} +2 -2
  152. package/dashboard/dist/assets/{mcp-query-CfiqUNDV.js.map → mcp-query-B9GuC88j.js.map} +1 -1
  153. package/dashboard/dist/assets/{personas-B1HzC94M.js → personas-CQr9sXg3.js} +2 -2
  154. package/dashboard/dist/assets/{personas-B1HzC94M.js.map → personas-CQr9sXg3.js.map} +1 -1
  155. package/dashboard/dist/assets/{pipelines-C73X50ES.js → pipelines-DzMf-VE7.js} +2 -2
  156. package/dashboard/dist/assets/{pipelines-C73X50ES.js.map → pipelines-DzMf-VE7.js.map} +1 -1
  157. package/dashboard/dist/assets/{tasks-DHbFpQk4.js → tasks-QKuXlyLe.js} +2 -2
  158. package/dashboard/dist/assets/{tasks-DHbFpQk4.js.map → tasks-QKuXlyLe.js.map} +1 -1
  159. package/dashboard/dist/assets/{topics-Fu8qCUOd.js → topics-DQAQnGV7.js} +2 -2
  160. package/dashboard/dist/assets/{topics-Fu8qCUOd.js.map → topics-DQAQnGV7.js.map} +1 -1
  161. package/dashboard/dist/assets/useDebouncedValue-DuE9Mj3I.js +2 -0
  162. package/dashboard/dist/assets/useDebouncedValue-DuE9Mj3I.js.map +1 -0
  163. package/dashboard/dist/assets/{useNamespace-CpO5Hogb.js → useNamespace-BTCrNkwo.js} +2 -2
  164. package/dashboard/dist/assets/{useNamespace-CpO5Hogb.js.map → useNamespace-BTCrNkwo.js.map} +1 -1
  165. package/dashboard/dist/assets/{useYamlActivityEvents-BwIl6_d2.js → useYamlActivityEvents-_aa1_rNu.js} +2 -2
  166. package/dashboard/dist/assets/{useYamlActivityEvents-BwIl6_d2.js.map → useYamlActivityEvents-_aa1_rNu.js.map} +1 -1
  167. package/dashboard/dist/assets/{users-C0ke1Z-8.js → users-D-DhFQBy.js} +2 -2
  168. package/dashboard/dist/assets/{users-C0ke1Z-8.js.map → users-D-DhFQBy.js.map} +1 -1
  169. package/dashboard/dist/assets/{workflows-DR9OQcuq.js → workflows-CEWX3imM.js} +2 -2
  170. package/dashboard/dist/assets/{workflows-DR9OQcuq.js.map → workflows-CEWX3imM.js.map} +1 -1
  171. package/dashboard/dist/assets/{yaml-workflows-DjEHh9Wy.js → yaml-workflows-Bek1Mg86.js} +2 -2
  172. package/dashboard/dist/assets/{yaml-workflows-DjEHh9Wy.js.map → yaml-workflows-Bek1Mg86.js.map} +1 -1
  173. package/dashboard/dist/index.html +1 -1
  174. package/docs/dashboard.md +18 -0
  175. package/package.json +1 -1
  176. package/dashboard/dist/assets/AdminDashboard-Bx5G6Qb_.js +0 -2
  177. package/dashboard/dist/assets/AgentsPage-DjAluFkM.js +0 -2
  178. package/dashboard/dist/assets/AvailableEscalationsPage-BHsRZk4v.js +0 -2
  179. package/dashboard/dist/assets/AvailableEscalationsPage-BHsRZk4v.js.map +0 -1
  180. package/dashboard/dist/assets/CapabilitiesPage-DGsnIiJi.js +0 -2
  181. package/dashboard/dist/assets/CountdownTimer-Cvif0QtN.js +0 -2
  182. package/dashboard/dist/assets/ElapsedCell-BirS3yZq.js +0 -2
  183. package/dashboard/dist/assets/EntityTimelinePanel-D3QNqDiL.js +0 -2
  184. package/dashboard/dist/assets/EscalationsOverview-C2FaSmXk.js +0 -2
  185. package/dashboard/dist/assets/FilterBar-fwUqeM-5.js +0 -2
  186. package/dashboard/dist/assets/FilterBar-fwUqeM-5.js.map +0 -1
  187. package/dashboard/dist/assets/HomePage-C2HnqdFX.js +0 -2
  188. package/dashboard/dist/assets/HomePage-C2HnqdFX.js.map +0 -1
  189. package/dashboard/dist/assets/ListToolbar-BEogxu1f.js +0 -2
  190. package/dashboard/dist/assets/McpQueryPage-BvvM0Ya1.js +0 -2
  191. package/dashboard/dist/assets/McpRunDetailPage-5eaJeupC.js +0 -2
  192. package/dashboard/dist/assets/McpRunDetailPage-5eaJeupC.js.map +0 -1
  193. package/dashboard/dist/assets/McpRunsPage-B5_-3NUF.js +0 -2
  194. package/dashboard/dist/assets/McpRunsPage-B5_-3NUF.js.map +0 -1
  195. package/dashboard/dist/assets/OperationsPage-CJXTw02Z.js +0 -3
  196. package/dashboard/dist/assets/OperationsPage-CJXTw02Z.js.map +0 -1
  197. package/dashboard/dist/assets/OperatorDashboard-Dx7639os.js +0 -2
  198. package/dashboard/dist/assets/OperatorDashboard-Dx7639os.js.map +0 -1
  199. package/dashboard/dist/assets/PersonasPage-Cnmb4uox.js +0 -2
  200. package/dashboard/dist/assets/PersonasPage-Cnmb4uox.js.map +0 -1
  201. package/dashboard/dist/assets/ProcessDetailPage-CZ09xiWf.js +0 -2
  202. package/dashboard/dist/assets/ProcessesListPage-BT76_7bW.js +0 -2
  203. package/dashboard/dist/assets/ProcessesListPage-BT76_7bW.js.map +0 -1
  204. package/dashboard/dist/assets/ScanSchemeDetailPage-C6mRYkxL.js +0 -2
  205. package/dashboard/dist/assets/ScanStationPage-YQiijAKy.js +0 -2
  206. package/dashboard/dist/assets/TimeAgo-poxwErGl.js +0 -2
  207. package/dashboard/dist/assets/WorkflowExecutionPage-C82Q-TYC.js +0 -2
  208. package/dashboard/dist/assets/WorkflowsDashboard-DDWwCT-v.js +0 -2
  209. package/dashboard/dist/assets/WorkflowsDashboard-DDWwCT-v.js.map +0 -1
  210. package/dashboard/dist/assets/WorkflowsOverview-DdKRtWdK.js +0 -2
  211. package/dashboard/dist/assets/capabilities-CEo0AB79.js +0 -2
  212. package/dashboard/dist/assets/escalation-columns-CUtDSbxl.js +0 -2
  213. package/dashboard/dist/assets/index-BYIN0l5M.js +0 -2
  214. package/dashboard/dist/assets/index-BYIN0l5M.js.map +0 -1
  215. package/dashboard/dist/assets/index-C8VhbKFU.js.map +0 -1
  216. package/dashboard/dist/assets/index-DSdqso-_.js +0 -67
  217. package/dashboard/dist/assets/index-DSdqso-_.js.map +0 -1
  218. package/dashboard/dist/assets/index-VsZyCFz8.js +0 -2
  219. package/dashboard/dist/assets/index-VsZyCFz8.js.map +0 -1
  220. package/dashboard/dist/assets/useDebouncedValue-C4P2jQuh.js +0 -2
  221. package/dashboard/dist/assets/useDebouncedValue-C4P2jQuh.js.map +0 -1
  222. package/dashboard/dist/assets/useEventHooks-DL3Vhz4g.js +0 -2
  223. package/dashboard/dist/assets/useEventHooks-DL3Vhz4g.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"FilterBar-fwUqeM-5.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react';\nimport { SlidersHorizontal, X } from 'lucide-react';\nimport { useShellPanelOptional } from '../../../hooks/useShellPanel';\n\n/**\n * Filter layout context — the same controlled FilterSelect/FilterInput\n * children render inline in the bar (label beside control) or stacked in the\n * shell panel (label above control, full width). State stays URL-driven, so\n * the two surfaces are always in sync.\n */\nconst FilterLayoutContext = createContext<'inline' | 'stacked'>('inline');\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n /** Count for the folded Filters button's badge (active, non-default filters). */\n activeFilterCount?: number;\n}\n\n/**\n * The filter band. Geometry follows the container: at `@filters` width the\n * controls render inline and wrap as whole units; below it they fold behind\n * one Filters button that opens the same controls, stacked, in the shell's\n * right panel. The outer div stays sticky — sticky elements are never\n * containers, so the container sits on the inner band.\n */\n/** Shell-panel ownership key — the slot is shared with page panels. */\nconst FILTERS_PANEL_KEY = 'filter-bar';\n\n/**\n * Live-children bridge. The stacked panel renders in the shell's subtree, so\n * a snapshot node would go stale the moment a URL-driven filter changes..\n * Re-invoking setPanel every render to freshen it is worse: it loops (each\n * setPanel re-renders the provider, which re-creates children) and the loop\n * races the close click — a stale pass re-opens the panel just closed. So the\n * slot is claimed ONCE with a subscriber that pulls the latest children.\n */\ninterface LiveChildrenStore {\n children: ReactNode;\n listeners: Set<() => void>;\n}\n\nfunction LiveChildren({ store }: { store: { current: LiveChildrenStore } }) {\n const children = useSyncExternalStore(\n (onChange) => {\n store.current.listeners.add(onChange);\n return () => store.current.listeners.delete(onChange);\n },\n () => store.current.children,\n );\n return <>{children}</>;\n}\n\nexport function FilterBar({ children, actions, activeFilterCount }: FilterBarProps) {\n // Outside the shell (tests, standalone surfaces) there is no panel to fold\n // into — the fold button becomes inert and inline mode carries the day.\n const shellPanel = useShellPanelOptional();\n const setPanel = shellPanel?.setPanel;\n const closePanel = shellPanel?.closePanel;\n const ownsPanel = (shellPanel?.open ?? false) && shellPanel?.ownerKey === FILTERS_PANEL_KEY;\n const [foldOpen, setFoldOpen] = useState(false);\n\n // Publish the freshest children to the mounted panel after every commit.\n const liveStore = useRef<LiveChildrenStore>({ children, listeners: new Set() });\n useEffect(() => {\n liveStore.current.children = children;\n liveStore.current.listeners.forEach((notify) => notify());\n }, [children]);\n\n const closeFold = () => {\n setFoldOpen(false);\n closePanel?.(FILTERS_PANEL_KEY);\n };\n\n // The slot is shared: when it closes from anywhere (route change, its own\n // X) or another claimant takes it, stand down so the button never lies.\n const ownedRef = useRef(false);\n useEffect(() => {\n if (ownsPanel) {\n ownedRef.current = true;\n return;\n }\n if (ownedRef.current) {\n ownedRef.current = false;\n setFoldOpen(false);\n }\n }, [ownsPanel]);\n\n // Unmount: release the slot if it is still ours (keyed — never yanks a\n // panel another claimant owns).\n useEffect(() => () => closePanel?.(FILTERS_PANEL_KEY), [closePanel]);\n\n return (\n <div className=\"sticky top-0 z-20 bg-surface pt-3 pb-3\">\n <div className=\"bg-surface-sunken border border-surface-border rounded-[var(--lt-radius-section)] px-4 py-2.5 @container/filters\">\n {/* One row, one actions slot. The children swap geometry: inline\n controls at @filters width, one Filters button below it. */}\n <div className=\"flex items-center gap-x-4 gap-y-2 flex-wrap\">\n <div className=\"hidden @filters/filters:contents\">{children}</div>\n <button\n onClick={() => {\n // Claim the slot on click — a click is intent, and it wins even\n // when a page panel (e.g. the faceted query) currently holds it.\n if (foldOpen) {\n closeFold();\n } else {\n setFoldOpen(true);\n setPanel?.(\n <StackedFilterPanel onClose={closeFold}>\n <LiveChildren store={liveStore} />\n </StackedFilterPanel>,\n { width: 320, key: FILTERS_PANEL_KEY },\n );\n }\n }}\n className=\"@filters/filters:hidden inline-flex items-center gap-1.5 text-xs font-medium text-accent hover:text-accent-hover transition-colors\"\n aria-expanded={foldOpen}\n aria-label=\"Filters\"\n >\n <SlidersHorizontal className=\"w-3.5 h-3.5\" />\n Filters\n {activeFilterCount != null && activeFilterCount > 0 && (\n <span className=\"rounded-full bg-accent/10 text-accent px-1.5 text-2xs tabular-nums font-semibold\">\n {activeFilterCount}\n </span>\n )}\n </button>\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n </div>\n );\n}\n\nfunction StackedFilterPanel({ children, onClose }: { children: ReactNode; onClose: () => void }) {\n return (\n <div className=\"h-full overflow-y-auto\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface-raised border-b border-surface-border/50\">\n <span className=\"text-xs font-semibold text-text-primary\">Filters</span>\n <button\n onClick={onClose}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-3 space-y-4\">\n <FilterLayoutContext.Provider value=\"stacked\">\n {children}\n </FilterLayoutContext.Provider>\n </div>\n </div>\n );\n}\n\n/**\n * @deprecated The pipe separator is retired — the field fill + gap already\n * separate filters. Kept as a no-op so existing call sites don't break.\n */\nexport function FilterDivider() {\n return null;\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n const layout = useContext(FilterLayoutContext);\n return (\n <div className={layout === 'stacked' ? 'flex flex-col gap-1' : 'flex items-center gap-2'}>\n <label className=\"text-2xs font-medium text-text-tertiary whitespace-nowrap\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={`select text-2xs py-1 ${layout === 'stacked' ? 'w-full' : 'w-auto min-w-[6rem]'}`}\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const layout = useContext(FilterLayoutContext);\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className={layout === 'stacked' ? 'flex flex-col gap-1' : 'flex items-center gap-2'}>\n <label className=\"text-2xs font-medium text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className={`input text-2xs py-1 font-mono ${layout === 'stacked' ? 'w-full' : 'w-36 min-w-0 max-w-full'}`}\n />\n </div>\n );\n}\n"],"names":["FilterLayoutContext","createContext","FILTERS_PANEL_KEY","LiveChildren","store","children","useSyncExternalStore","onChange","FilterBar","actions","activeFilterCount","shellPanel","useShellPanelOptional","setPanel","closePanel","ownsPanel","foldOpen","setFoldOpen","useState","liveStore","useRef","useEffect","notify","closeFold","ownedRef","jsx","jsxs","StackedFilterPanel","SlidersHorizontal","onClose","X","FilterDivider","FilterSelect","label","value","options","required","placeholder","layout","useContext","e","opt","FilterInput","local","setLocal","timerRef","handleChange","v"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as u,b as ye,j as e}from"./vendor-query-RUZdMvN6.js";import{L as O,T as me,ai as ve,aF as Ne,aB as pe,I as he,v as we,aG as ke,R as _e,aH as Ce,b as D}from"./index-DSdqso-_.js";import{b as Ee}from"./workflows-DR9OQcuq.js";import{u as Pe}from"./pipelines-C73X50ES.js";import{u as Re}from"./controlplane-CD6ti-QB.js";import{e as Se,b as qe,j as Fe}from"./useEventHooks-DL3Vhz4g.js";import{R as Te}from"./RolePill-Di_5hfvw.js";import{W as H}from"./WorkflowPill-CN-952iI.js";import{L as E}from"./ListToolbar-BEogxu1f.js";import{j as $e,b as Ie,P as Me}from"./OperationsPage-CJXTw02Z.js";import{i as Ae}from"./task-queues-7-sHKPsN.js";import{b9 as Qe,ax as j,ao as We,_ as Le,L as re,I as g,k as oe,W as le}from"./vendor-icons-h-jlRSb9.js";import{u as W,f as Be}from"./vendor-react-CdqEC2zv.js";import"./EntityTimelinePanel-D3QNqDiL.js";import"./PageHeader-CFVw67M6.js";function De(){const{user:s}=O();return u.useMemo(()=>{const n=((s==null?void 0:s.roles)??[]).map(t=>t.role).filter(t=>!Ae(t));return Array.from(new Set(n)).sort((t,i)=>t.localeCompare(i))},[s])}function He(){const{user:s}=O(),n=s==null?void 0:s.userId,t=ye(),{data:i}=me({assigned_to:n,status:"pending",limit:1});return ve(Ne(),()=>{n&&t.invalidateQueries({queryKey:["escalations"]})}),(i==null?void 0:i.total)??0}function B({n:s,label:n,tone:t}){return e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:`text-2xl font-light tabular-nums leading-none ${t==="muted"?"text-text-tertiary":"text-text-primary"}`,children:s}),e.jsx("div",{className:"text-2xs uppercase tracking-wider text-text-quaternary mt-1 truncate",children:n})]})}function Oe({role:s,title:n,metric:t,priorityFacet:i,periodLabel:l}){const d=W(),o=(t==null?void 0:t.pending)??0,x=(t==null?void 0:t.claimed)??0,b=(t==null?void 0:t.resolved)??0,m=(t==null?void 0:t.priority_count)??0;return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>d(`/escalations/available?role=${encodeURIComponent(s)}`),onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),d(`/escalations/available?role=${encodeURIComponent(s)}`))},className:"group h-full border-l-2 border-accent/30 bg-surface-sunken/40 rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-surface-sunken/70 focus:outline-none focus-visible:ring-1 focus-visible:ring-accent/40",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-3",children:[e.jsx("span",{className:"text-2xs font-semibold uppercase tracking-wider text-text-secondary truncate",children:n||s}),e.jsx(j,{className:"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity",strokeWidth:1.5})]}),e.jsxs("div",{className:"flex items-baseline gap-5",children:[e.jsx(B,{n:o,label:"pending"}),e.jsx(B,{n:x,label:"claimed"}),e.jsx(B,{n:b,label:`resolved · ${l}`,tone:"muted"})]}),e.jsx("div",{className:"mt-3 h-6 flex items-center",children:m>0?e.jsxs("button",{type:"button",onClick:p=>{p.stopPropagation(),d($e({role:s,priority_facet:i}))},className:"inline-flex items-center gap-1.5 pl-1.5 pr-2.5 py-1 rounded-full text-2xs font-semibold tabular-nums bg-status-error text-text-inverse transition-transform hover:scale-[1.05]",title:"Past the priority threshold — a hard limit; open oldest first",children:[e.jsx(We,{className:"w-3 h-3",strokeWidth:2.5}),m," in jeopardy"]}):e.jsx("span",{className:"text-2xs text-text-quaternary",children:"on pace"})})]})}function ce({count:s}){const n=W();return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>n("/escalations/queue"),onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),n("/escalations/queue"))},className:"group h-full border-l-2 border-status-warning/70 bg-status-warning/[0.06] rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-status-warning/[0.1] focus:outline-none focus-visible:ring-1 focus-visible:ring-status-warning/40",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 mb-3",children:[e.jsxs("span",{className:"flex items-center gap-1.5 text-2xs font-semibold uppercase tracking-wider text-status-warning",children:[e.jsx(Qe,{className:"w-3 h-3",strokeWidth:2}),"Claimed"]}),e.jsx(j,{className:"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity",strokeWidth:1.5})]}),e.jsx("div",{className:"text-2xl font-light tabular-nums leading-none text-text-primary",children:s}),e.jsx("div",{className:"text-2xs uppercase tracking-wider text-text-quaternary mt-1",children:"assigned to you"}),e.jsx("div",{className:"mt-3 h-6 flex items-center",children:e.jsx("span",{className:"text-2xs font-medium text-status-warning",children:s>0?"Finish these first →":"Nothing claimed"})})]})}const Ue=["15m","1h","24h","7d"];function ze({maxRows:s}){const[n,t]=u.useState("24h"),i=De(),l=He(),d=pe(n),o=he(),x=u.useMemo(()=>{var r;return new Map((((r=d.data)==null?void 0:r.stations)??[]).map(c=>[c.role,c]))},[d.data]),b=u.useMemo(()=>{var r;return new Map((((r=o.data)==null?void 0:r.roles)??[]).map(c=>[c.role,c]))},[o.data]),m=u.useMemo(()=>[...i].sort((r,c)=>{var T,v;const h=((T=x.get(r))==null?void 0:T.priority_count)??0,F=((v=x.get(c))==null?void 0:v.priority_count)??0;return F!==h?F-h:r.localeCompare(c)}),[i,x]),q=s*4-1,R=m.slice(0,q),y=m.length-R.length;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4 pb-2 border-b border-surface-border",children:[e.jsxs("h2",{className:"flex items-center gap-2 text-sm font-medium text-text-primary",children:[e.jsx(Le,{className:"w-4 h-4 text-accent",strokeWidth:1.5}),"Task Queues"]}),e.jsx("div",{className:"flex items-center gap-0.5",children:Ue.map(r=>e.jsx("button",{onClick:()=>t(r),className:`px-2.5 py-1 text-2xs font-mono rounded transition-colors ${n===r?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:r},r))})]}),i.length===0?e.jsxs("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4",children:[e.jsx(ce,{count:l}),e.jsx("div",{className:"lg:col-span-3 flex items-center px-4 py-3.5 text-sm text-text-tertiary",children:"You are not a member of a role. Task queues appear here once you join one."})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4 auto-rows-fr",children:[e.jsx(ce,{count:l}),R.map(r=>{var c,h;return e.jsx(Oe,{role:r,title:((c=b.get(r))==null?void 0:c.title)??null,metric:x.get(r),priorityFacet:((h=b.get(r))==null?void 0:h.priority_facet)??null,periodLabel:n},r)})]}),y>0&&e.jsxs("p",{className:"mt-3 text-2xs text-text-quaternary",children:["+",y," more ",y===1?"lane":"lanes"," in the Task Queues sidebar."]})]})]})}const Ke={completed:"bg-status-success",active:"bg-status-active",running:"bg-status-active",pending:"bg-status-pending",error:"bg-status-error",failed:"bg-status-error"};function de(s){return Ke[s]??"bg-text-tertiary"}function k({icon:s,text:n}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-10 text-center",children:[e.jsx(s,{className:"w-6 h-6 text-text-quaternary/50 mb-2",strokeWidth:1}),e.jsx("p",{className:"text-xs text-text-quaternary",children:n})]})}function Ge(s,n=37){if(!s||s.length<=n)return s;const t=Math.floor((n-3)/2);return`${s.slice(0,t)}...${s.slice(-t)}`}function xe({dot:s,pill:n,id:t,date:i,onClick:l}){return e.jsxs("button",{onClick:l,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${s}`}),e.jsx("span",{className:"text-xs text-text-primary font-mono truncate flex-1 min-w-0",children:Ge(t)}),e.jsx("span",{className:"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0 whitespace-nowrap",children:e.jsx(D,{date:i})})]}),e.jsxs("div",{className:"pl-3.5 flex items-center gap-1 overflow-hidden",children:[n,e.jsx("span",{className:"flex-1 min-w-0"}),e.jsx("span",{className:"@dict-inline:hidden text-2xs text-text-quaternary shrink-0 whitespace-nowrap",children:e.jsx(D,{date:i})})]})]})}function Q({esc:s,onClick:n}){const t=e.jsx(D,{date:s.updated_at??s.created_at});return e.jsxs("button",{onClick:n,className:"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-0.5",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary font-medium shrink-0",children:["P",s.priority??2]}),e.jsx("span",{className:"text-xs text-text-primary truncate flex-1 min-w-0",children:s.description||s.subtype||s.type}),e.jsx("span",{className:"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0",children:t})]}),e.jsxs("div",{className:"flex items-center gap-2 pl-5 overflow-hidden",children:[e.jsx("span",{className:"hidden @dict-inline:inline-flex min-w-0",children:e.jsx(H,{type:s.type||"unknown",size:"xs"})}),e.jsx("span",{className:"flex-1 min-w-0"}),e.jsx(Te,{role:s.role}),e.jsx("span",{className:"@dict-inline:hidden text-2xs text-text-quaternary shrink-0",children:t})]})]})}function _({to:s,icon:n,title:t}){const i=W();return e.jsx("button",{onClick:()=>i(s),className:"text-text-quaternary hover:text-accent transition-colors",title:t,children:e.jsx(n,{className:"w-2.5 h-2.5",strokeWidth:1.5})})}function ue({appIds:s,selected:n,onSelect:t}){const[i,l]=u.useState(!1),d=u.useRef(null);return u.useEffect(()=>{if(!i)return;const o=x=>{d.current&&!d.current.contains(x.target)&&l(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[i]),s.length<=1?null:e.jsxs("div",{className:"relative mb-3 -mt-2",ref:d,children:[e.jsxs("button",{onClick:()=>l(o=>!o),className:"flex items-center gap-1 px-2 py-0.5 text-2xs rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors",children:[n,e.jsx("svg",{className:`w-2.5 h-2.5 transition-transform ${i?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),i&&e.jsx("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100] py-1 min-w-[120px]",children:s.map(o=>e.jsx("button",{onClick:()=>{t(o),l(!1)},className:`w-full text-left px-3 py-1.5 text-2xs transition-colors ${n===o?"text-accent bg-accent/5":"text-text-secondary hover:bg-surface-hover"}`,children:o},o))})]})}function P({icon:s,title:n,count:t,actions:i,children:l}){return e.jsxs("div",{className:"flex-1 min-w-0 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between pt-4 pb-2 px-5 shrink-0 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:n}),t!==void 0&&t>0&&e.jsx("span",{className:"px-1.5 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-semibold tabular-nums",children:Ce(t)})]}),i&&e.jsx("div",{className:"flex items-center gap-2",children:i})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto py-2 px-5 @container",children:l})]})}function ds(){var J,V,X,Y,Z,ee,se,te;const s=W(),{user:n}=O(),{isBuilder:t}=we(),i=ke(),[l,d]=Be(),{data:o}=Re({enabled:t}),x=u.useMemo(()=>((o==null?void 0:o.apps)??[]).map(a=>a.appId).sort(),[o]),b=x[0]??"",m=l.get("pipelinenamespace")||b,p=l.get("durablenamespace")||b,q=u.useCallback((a,M)=>{d(A=>{const C=new URLSearchParams(A);return C.set(a,M),C},{replace:!1})},[d]);Se(),qe(),Fe();const R=!i.showTaskQueueCards,y=i.canSeeWorkflows&&!i.canSeePaceBoard,r=he({enabled:i.canSeePaceBoard}),c=pe("1h",{enabled:i.canSeePaceBoard}),h=Ee({limit:5,sort_by:"updated_at",order:"desc",namespace:p},{enabled:y}),F=x,T=x,v=Pe({limit:5,app_id:m,sort_by:"updated_at",order:"desc"},{enabled:y}),N=_e({limit:5,sort_by:"created_at",order:"desc",enabled:R}),w=me({assigned_to:n==null?void 0:n.userId,status:"pending",limit:5,sort_by:"created_at",order:"desc",enabled:R});u.useEffect(()=>{const a=setTimeout(()=>{w.refetch(),N.refetch()},2e3);return()=>clearTimeout(a)},[]);const S=u.useMemo(()=>{var ae,ne,ie;const a=((ae=r.data)==null?void 0:ae.roles)??[],M=Ie(a),A=(ne=a.find(f=>f.ops_home_default))==null?void 0:ne.role,C=A&&M.find(f=>f.stations.some(L=>L.role.role===A))||M[0],ge=(C==null?void 0:C.stations)??[],be=((ie=c.data)==null?void 0:ie.stations)??[];return ge.map(({role:f})=>({role:f.role,title:f.title,parent_role:f.parent_role,target_per_hour:f.target_per_hour??null,upstream_roles:f.upstream_roles??[],metric:be.find(L=>L.role===f.role)}))},[r.data,c.data]),U=((J=h.data)==null?void 0:J.jobs)??[],fe=(V=h.data)==null?void 0:V.total,z=((X=v.data)==null?void 0:X.jobs)??[],je=(Y=v.data)==null?void 0:Y.total,$=((Z=N.data)==null?void 0:Z.escalations)??[],K=(ee=N.data)==null?void 0:ee.total,I=((se=w.data)==null?void 0:se.escalations)??[],G=(te=w.data)==null?void 0:te.total;return i.showTaskQueueCards?e.jsxs("div",{children:[e.jsx("h1",{className:"heading-1 mb-6",children:"Console"}),e.jsx(ze,{maxRows:2})]}):i.canSeePaceBoard?e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between pb-3 px-5 shrink-0 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(re,{className:"w-3.5 h-3.5 text-accent/60",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:"Pace Board"}),S.length>0&&e.jsxs("span",{className:"text-2xs text-text-quaternary",children:[S.length," ",S.length===1?"station":"stations"," · 1h"]})]}),e.jsx(_,{to:"/operations",icon:j,title:"Open the full Pace Board"})]}),e.jsx("div",{className:"flex-1 min-h-0 cursor-pointer",onClick:()=>s("/operations"),children:S.length===0?e.jsx(k,{icon:re,text:"No stations yet — mark roles visible in Operations"}):e.jsx(Me,{stations:S,selectedRole:null,onSelect:()=>s("/operations"),onUpstreamSelect:()=>s("/operations"),periodHours:1,logScale:!0,fill:!0})})]}),e.jsxs("div",{className:"hidden sm:flex flex-1 min-h-0 border-t border-surface-border",children:[e.jsx(P,{icon:g,title:"All Escalations",count:K,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>N.refetch(),isFetching:N.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(_,{to:"/escalations/available",icon:j,title:"All escalations"})]}),children:$.length===0?e.jsx(k,{icon:g,text:"No pending escalations"}):e.jsx("div",{className:"space-y-0.5",children:$.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsx(P,{icon:g,title:"My Escalations",count:G,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>w.refetch(),isFetching:w.isFetching,apiPath:`/escalations?assigned_to=${(n==null?void 0:n.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(_,{to:"/escalations/queue",icon:j,title:"My escalation queue"})]}),children:I.length===0?e.jsx(k,{icon:g,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-0.5",children:I.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})})]})]}):e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col",children:[e.jsxs("div",{className:"flex-1 min-h-0 flex border-b border-surface-border",children:[e.jsx(P,{icon:g,title:"All Escalations",count:K,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>N.refetch(),isFetching:N.isFetching,apiPath:"/escalations?status=pending&limit=5&sort_by=created_at&order=desc"}),e.jsx(_,{to:"/escalations/available",icon:j,title:"All escalations"})]}),children:$.length===0?e.jsx(k,{icon:g,text:"No pending escalations"}):e.jsx("div",{className:"space-y-0.5",children:$.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsx(P,{icon:g,title:"My Escalations",count:G,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>w.refetch(),isFetching:w.isFetching,apiPath:`/escalations?assigned_to=${(n==null?void 0:n.userId)??""}&status=pending&limit=5&sort_by=created_at&order=desc`}),e.jsx(_,{to:"/escalations/queue",icon:j,title:"My escalation queue"})]}),children:I.length===0?e.jsx(k,{icon:g,text:"No assigned escalations"}):e.jsx("div",{className:"space-y-0.5",children:I.map(a=>e.jsx(Q,{esc:a,onClick:()=>s(`/escalations/detail/${a.id}`)},a.id))})})]}),y&&e.jsxs("div",{className:"flex-1 min-h-0 flex",children:[e.jsxs(P,{icon:oe,title:"Procedural",count:fe,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>h.refetch(),isFetching:h.isFetching,apiPath:`/workflow-states/jobs?namespace=${p}&limit=5`}),e.jsx(_,{to:"/workflows/executions",icon:j,title:"All procedural executions"})]}),children:[e.jsx(ue,{appIds:F,selected:p,onSelect:a=>q("durablenamespace",a)}),U.length===0?e.jsx(k,{icon:oe,text:"No recent procedural runs"}):e.jsx("div",{className:"space-y-0.5",children:U.map(a=>e.jsx(xe,{dot:de(a.status),pill:e.jsx(H,{type:a.entity||a.type||"workflow",size:"xs"}),id:a.workflow_id,date:a.updated_at??a.created_at,onClick:()=>s(`/workflows/executions/${a.workflow_id}`)},a.workflow_id))})]}),e.jsx("div",{className:"w-px bg-surface-border shrink-0"}),e.jsxs(P,{icon:le,title:"Graph",count:je,actions:e.jsxs(e.Fragment,{children:[e.jsx(E,{onRefresh:()=>v.refetch(),isFetching:v.isFetching,apiPath:`/pipelines?app_id=${m}&limit=5`}),e.jsx(_,{to:"/mcp/executions",icon:j,title:"All graph executions"})]}),children:[e.jsx(ue,{appIds:T,selected:m,onSelect:a=>q("pipelinenamespace",a)}),z.length===0?e.jsx(k,{icon:le,text:"No recent graph runs"}):e.jsx("div",{className:"space-y-0.5",children:z.map(a=>e.jsx(xe,{dot:de(a.status),pill:e.jsx(H,{type:a.entity||a.workflow_name||"pipeline",variant:"pipeline",size:"xs"}),id:a.workflow_id,date:a.updated_at??a.created_at,onClick:()=>s(`/mcp/executions/${a.workflow_id}?namespace=${m}`)},a.workflow_id))})]})]})]})}export{ds as HomePage};
2
- //# sourceMappingURL=HomePage-C2HnqdFX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HomePage-C2HnqdFX.js","sources":["../../src/hooks/useTaskQueueRoles.ts","../../src/hooks/useMyEscalationCount.ts","../../src/pages/home/TaskQueueCard.tsx","../../src/pages/home/TaskQueueCards.tsx","../../src/pages/home/HomePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useAuth } from './useAuth';\nimport { isSystemTierRole } from '../lib/task-queues';\n\n/**\n * The roles that surface as task queues for the current user: every role they\n * are a member of (a person or service account working that lane), minus the\n * capability tiers. Sorted and de-duplicated. Any further queue views a user\n * wants come from personal pins.\n */\nexport function useTaskQueueRoles(): string[] {\n const { user } = useAuth();\n\n return useMemo(() => {\n const names = (user?.roles ?? []).map((r) => r.role).filter((r) => !isSystemTierRole(r));\n return Array.from(new Set(names)).sort((a, b) => a.localeCompare(b));\n }, [user]);\n}\n","import { useQueryClient } from '@tanstack/react-query';\nimport { useAuth } from './useAuth';\nimport { useEscalations } from '../api/escalations';\nimport { useEventSubscriptions } from './useEventContext';\nimport { useMemberEscalationPatterns } from './useMemberEscalationPatterns';\n\n/**\n * Returns the number of active (non-expired) escalations assigned to the current user.\n * The API filters expired claims server-side (assigned_until > NOW()) when\n * assigned_to is provided, so the total from the query is accurate.\n */\nexport function useMyEscalationCount(): number {\n const { user } = useAuth();\n const userId = user?.userId;\n const qc = useQueryClient();\n\n const { data } = useEscalations({\n assigned_to: userId,\n status: 'pending',\n limit: 1,\n });\n\n // My count can only move inside queues I belong to — the subscription is\n // the union of my member roles (global viewers span the family).\n useEventSubscriptions(useMemberEscalationPatterns(), () => {\n if (userId) {\n qc.invalidateQueries({ queryKey: ['escalations'] });\n }\n });\n\n return data?.total ?? 0;\n}\n","import { useNavigate } from 'react-router-dom';\nimport { ExternalLink, TriangleAlert, Hand } from 'lucide-react';\nimport type { StationMetric } from '../../api/escalations';\nimport { jeopardyQueueLink } from '../operations/priority-link';\n\nfunction Stat({ n, label, tone }: { n: number; label: string; tone?: 'muted' }) {\n return (\n <div className=\"min-w-0\">\n <div className={`text-2xl font-light tabular-nums leading-none ${tone === 'muted' ? 'text-text-tertiary' : 'text-text-primary'}`}>\n {n}\n </div>\n <div className=\"text-2xs uppercase tracking-wider text-text-quaternary mt-1 truncate\">{label}</div>\n </div>\n );\n}\n\n/**\n * One lane's shape at a glance: pending / claimed / resolved over the selected\n * window, plus the jeopardy signal when items sit past the role's priority\n * threshold. The card opens the role's queue; the jeopardy pill opens it\n * sorted oldest-first so the at-risk items sit on top.\n */\nexport function TaskQueueCard({\n role,\n title,\n metric,\n priorityFacet,\n periodLabel,\n}: {\n role: string;\n title: string | null;\n metric: StationMetric | undefined;\n priorityFacet: string | null;\n periodLabel: string;\n}) {\n const navigate = useNavigate();\n const pending = metric?.pending ?? 0;\n const claimed = metric?.claimed ?? 0;\n const resolved = metric?.resolved ?? 0;\n const jeopardy = metric?.priority_count ?? 0;\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => navigate(`/escalations/available?role=${encodeURIComponent(role)}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigate(`/escalations/available?role=${encodeURIComponent(role)}`);\n }\n }}\n className=\"group h-full border-l-2 border-accent/30 bg-surface-sunken/40 rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-surface-sunken/70 focus:outline-none focus-visible:ring-1 focus-visible:ring-accent/40\"\n >\n <div className=\"flex items-center justify-between gap-2 mb-3\">\n <span className=\"text-2xs font-semibold uppercase tracking-wider text-text-secondary truncate\">\n {title || role}\n </span>\n <ExternalLink className=\"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity\" strokeWidth={1.5} />\n </div>\n\n <div className=\"flex items-baseline gap-5\">\n <Stat n={pending} label=\"pending\" />\n <Stat n={claimed} label=\"claimed\" />\n <Stat n={resolved} label={`resolved · ${periodLabel}`} tone=\"muted\" />\n </div>\n\n <div className=\"mt-3 h-6 flex items-center\">\n {jeopardy > 0 ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n navigate(jeopardyQueueLink({ role, priority_facet: priorityFacet }));\n }}\n className=\"inline-flex items-center gap-1.5 pl-1.5 pr-2.5 py-1 rounded-full text-2xs font-semibold tabular-nums bg-status-error text-text-inverse transition-transform hover:scale-[1.05]\"\n title=\"Past the priority threshold — a hard limit; open oldest first\"\n >\n <TriangleAlert className=\"w-3 h-3\" strokeWidth={2.5} />\n {jeopardy} in jeopardy\n </button>\n ) : (\n <span className=\"text-2xs text-text-quaternary\">on pace</span>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * The runner's own work, across every lane. First and highlighted — what to\n * finish before pulling anything new. Opens their personal queue.\n */\nexport function ClaimedCard({ count }: { count: number }) {\n const navigate = useNavigate();\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => navigate('/escalations/queue')}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigate('/escalations/queue');\n }\n }}\n className=\"group h-full border-l-2 border-status-warning/70 bg-status-warning/[0.06] rounded-[0.125em] px-4 py-3.5 cursor-pointer transition-colors hover:bg-status-warning/[0.1] focus:outline-none focus-visible:ring-1 focus-visible:ring-status-warning/40\"\n >\n <div className=\"flex items-center justify-between gap-2 mb-3\">\n <span className=\"flex items-center gap-1.5 text-2xs font-semibold uppercase tracking-wider text-status-warning\">\n <Hand className=\"w-3 h-3\" strokeWidth={2} />\n Claimed\n </span>\n <ExternalLink className=\"w-3 h-3 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity\" strokeWidth={1.5} />\n </div>\n\n <div className=\"text-2xl font-light tabular-nums leading-none text-text-primary\">{count}</div>\n <div className=\"text-2xs uppercase tracking-wider text-text-quaternary mt-1\">assigned to you</div>\n\n <div className=\"mt-3 h-6 flex items-center\">\n <span className=\"text-2xs font-medium text-status-warning\">\n {count > 0 ? 'Finish these first →' : 'Nothing claimed'}\n </span>\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Layers } from 'lucide-react';\nimport { useStationMetrics } from '../../api/escalations';\nimport { useRoleDetails } from '../../api/roles';\nimport { useTaskQueueRoles } from '../../hooks/useTaskQueueRoles';\nimport { useMyEscalationCount } from '../../hooks/useMyEscalationCount';\nimport { TaskQueueCard, ClaimedCard } from './TaskQueueCard';\n\nconst PERIODS = ['15m', '1h', '24h', '7d'] as const;\ntype Period = (typeof PERIODS)[number];\n\n/**\n * The scoped runner's home: their own claimed work first, then one card per\n * lane they belong to — pending / claimed / resolved and a jeopardy signal over\n * a chosen window. A poor-man's Pace Board: no cross-role trend, just \"what is\n * in my lanes and what needs attention.\" Engineers get a single compact row\n * (workflows sit below); operators get the fuller two-row surface.\n */\nexport function TaskQueueCards({ maxRows }: { maxRows: 1 | 2 }) {\n const [period, setPeriod] = useState<Period>('24h');\n const roles = useTaskQueueRoles();\n const claimedCount = useMyEscalationCount();\n const metricsQ = useStationMetrics(period);\n const rolesQ = useRoleDetails();\n\n const metricByRole = useMemo(\n () => new Map((metricsQ.data?.stations ?? []).map((m) => [m.role, m])),\n [metricsQ.data],\n );\n const detailByRole = useMemo(\n () => new Map((rolesQ.data?.roles ?? []).map((r) => [r.role, r])),\n [rolesQ.data],\n );\n\n // Lanes lead with the most at-risk: sort by jeopardy count (a hard limit the\n // plant manager pulls to the front of the line), then alphabetically for a\n // stable order among ties. Card #1 is always Claimed, ahead of these.\n const sortedRoles = useMemo(() => {\n return [...roles].sort((a, b) => {\n const ja = metricByRole.get(a)?.priority_count ?? 0;\n const jb = metricByRole.get(b)?.priority_count ?? 0;\n if (jb !== ja) return jb - ja;\n return a.localeCompare(b);\n });\n }, [roles, metricByRole]);\n\n // The rest of the grid is lanes. Cap to the persona's row budget and surface\n // any overflow rather than hiding it.\n const slots = maxRows * 4;\n const laneBudget = slots - 1;\n const shownRoles = sortedRoles.slice(0, laneBudget);\n const overflow = sortedRoles.length - shownRoles.length;\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-4 pb-2 border-b border-surface-border\">\n <h2 className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Layers className=\"w-4 h-4 text-accent\" strokeWidth={1.5} />\n Task Queues\n </h2>\n <div className=\"flex items-center gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => setPeriod(p)}\n className={`px-2.5 py-1 text-2xs font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n </div>\n\n {roles.length === 0 ? (\n <div className=\"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4\">\n <ClaimedCard count={claimedCount} />\n <div className=\"lg:col-span-3 flex items-center px-4 py-3.5 text-sm text-text-tertiary\">\n You are not a member of a role. Task queues appear here once you join one.\n </div>\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-1 @grp-cols:grid-cols-2 @wall:grid-cols-4 gap-4 auto-rows-fr\">\n <ClaimedCard count={claimedCount} />\n {shownRoles.map((role) => (\n <TaskQueueCard\n key={role}\n role={role}\n title={detailByRole.get(role)?.title ?? null}\n metric={metricByRole.get(role)}\n priorityFacet={detailByRole.get(role)?.priority_facet ?? null}\n periodLabel={period}\n />\n ))}\n </div>\n {overflow > 0 && (\n <p className=\"mt-3 text-2xs text-text-quaternary\">\n +{overflow} more {overflow === 1 ? 'lane' : 'lanes'} in the Task Queues sidebar.\n </p>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useState, useRef, useCallback, useEffect, useMemo } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport {\n Inbox, Code2, Workflow, LayoutDashboard, ExternalLink,\n} from 'lucide-react';\nimport { formatCountCompact } from '../../lib/format';\nimport { useAvailableEscalations, useEscalations, useStationMetrics } from '../../api/escalations';\nimport { useRoleDetails } from '../../api/roles';\nimport { useJobs } from '../../api/workflows';\nimport { useMcpRuns } from '../../api/pipelines';\nimport { useControlPlaneApps } from '../../api/controlplane';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useAccess } from '../../hooks/useAccess';\nimport { usePersona } from '../../hooks/usePersona';\nimport { useEscalationStatsEvents, useWorkflowListEvents, useStationMetricsEvents } from '../../hooks/useEventHooks';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { PaceChart, type ChartStation } from '../operations/PaceChart';\nimport { buildFragments } from '../operations/OperationsPage';\nimport { TaskQueueCards } from './TaskQueueCards';\n\nconst STATUS_DOT: Record<string, string> = {\n completed: 'bg-status-success',\n active: 'bg-status-active',\n running: 'bg-status-active',\n pending: 'bg-status-pending',\n error: 'bg-status-error',\n failed: 'bg-status-error',\n};\nfunction statusDotClass(status: string): string {\n return STATUS_DOT[status] ?? 'bg-text-tertiary';\n}\n\nfunction EmptyPanel({ icon: Icon, text }: { icon: React.ElementType; text: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-10 text-center\">\n <Icon className=\"w-6 h-6 text-text-quaternary/50 mb-2\" strokeWidth={1} />\n <p className=\"text-xs text-text-quaternary\">{text}</p>\n </div>\n );\n}\n\n/** Middle-ellipsis: keep first N and last N chars with ... in between */\nfunction midEllipsis(s: string, maxLen = 37): string {\n if (!s || s.length <= maxLen) return s;\n const keep = Math.floor((maxLen - 3) / 2);\n return `${s.slice(0, keep)}...${s.slice(-keep)}`;\n}\n\n/** Consistent console row for all execution lists. The COLUMN is the\n * container: with room (@dict-inline) the date shares the id line; in a\n * tight half column it drops below beside the pill — the row condenses,\n * the pair of columns never stacks. */\nfunction ExecutionRow({ dot, pill, id, date, onClick }: {\n dot: string;\n pill: React.ReactNode;\n id: string;\n date: string;\n onClick: () => void;\n}) {\n return (\n <button onClick={onClick} className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${dot}`} />\n <span className=\"text-xs text-text-primary font-mono truncate flex-1 min-w-0\">{midEllipsis(id)}</span>\n <span className=\"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0 whitespace-nowrap\"><DateValue date={date} /></span>\n </div>\n <div className=\"pl-3.5 flex items-center gap-1 overflow-hidden\">\n {pill}\n <span className=\"flex-1 min-w-0\" />\n <span className=\"@dict-inline:hidden text-2xs text-text-quaternary shrink-0 whitespace-nowrap\"><DateValue date={date} /></span>\n </div>\n </button>\n );\n}\n\n/** Console row for the escalation firehose lists — same condensing law.\n * The workflow pill is enrichment (the column budget): it returns when the\n * column has room; the floor is priority, title, role, age. */\nfunction EscalationRow({ esc, onClick }: { esc: any; onClick: () => void }) {\n const date = <DateValue date={esc.updated_at ?? esc.created_at} />;\n return (\n <button onClick={onClick} className=\"w-full text-left hover:bg-surface-hover/50 rounded-md px-1 py-1.5 transition-colors\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"text-2xs text-text-quaternary font-medium shrink-0\">P{esc.priority ?? 2}</span>\n <span className=\"text-xs text-text-primary truncate flex-1 min-w-0\">{esc.description || esc.subtype || esc.type}</span>\n <span className=\"hidden @dict-inline:inline text-2xs text-text-quaternary shrink-0\">{date}</span>\n </div>\n <div className=\"flex items-center gap-2 pl-5 overflow-hidden\">\n <span className=\"hidden @dict-inline:inline-flex min-w-0\"><WorkflowPill type={esc.type || 'unknown'} size=\"xs\" /></span>\n <span className=\"flex-1 min-w-0\" />\n <RolePill role={esc.role} />\n <span className=\"@dict-inline:hidden text-2xs text-text-quaternary shrink-0\">{date}</span>\n </div>\n </button>\n );\n}\n\nfunction NavIcon({ to, icon: Icon, title }: { to: string; icon: React.ElementType; title: string }) {\n const navigate = useNavigate();\n return (\n <button\n onClick={() => navigate(to)}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title={title}\n >\n <Icon className=\"w-2.5 h-2.5\" strokeWidth={1.5} />\n </button>\n );\n}\n\n// ── Namespace Picker ────────────────────────────────────────────────────────\n\nfunction AppPicker({ appIds, selected, onSelect }: {\n appIds: string[];\n selected: string;\n onSelect: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (appIds.length <= 1) return null;\n\n return (\n <div className=\"relative mb-3 -mt-2\" ref={ref}>\n <button\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1 px-2 py-0.5 text-2xs rounded bg-accent/10 text-accent hover:bg-accent/20 transition-colors\"\n >\n {selected}\n <svg className={`w-2.5 h-2.5 transition-transform ${open ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {open && (\n <div className=\"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100] py-1 min-w-[120px]\">\n {appIds.map((id) => (\n <button\n key={id}\n onClick={() => { onSelect(id); setOpen(false); }}\n className={`w-full text-left px-3 py-1.5 text-2xs transition-colors ${\n selected === id ? 'text-accent bg-accent/5' : 'text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {id}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Panel column — titled, independently-scrolling console pane ──────────────\n\nfunction PanelCol({ icon: Icon, title, count, actions, children }: {\n icon: React.ElementType;\n title: string;\n count?: number;\n actions?: React.ReactNode;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"flex-1 min-w-0 min-h-0 flex flex-col\">\n <div className=\"flex items-center justify-between pt-4 pb-2 px-5 shrink-0 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n <h2 className=\"section-h2\">{title}</h2>\n {count !== undefined && count > 0 && (\n <span className=\"px-1.5 py-0.5 rounded-full bg-accent/10 text-accent text-2xs font-semibold tabular-nums\">\n {formatCountCompact(count)}\n </span>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n <div className=\"flex-1 min-h-0 overflow-y-auto py-2 px-5 @container\">\n {children}\n </div>\n </div>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function HomePage() {\n const navigate = useNavigate();\n const { user } = useAuth();\n const { isBuilder } = useAccess();\n const persona = usePersona();\n const [searchParams, setSearchParams] = useSearchParams();\n const { data: cpData } = useControlPlaneApps({ enabled: isBuilder });\n const allAppIds = useMemo(() => (cpData?.apps ?? []).map((a: any) => a.appId).sort(), [cpData]);\n const firstAppId = allAppIds[0] ?? '';\n const pipelineNs = searchParams.get('pipelinenamespace') || firstAppId;\n const durableNs = searchParams.get('durablenamespace') || firstAppId;\n const setNs = useCallback((key: string, ns: string) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set(key, ns);\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n useEscalationStatsEvents();\n useWorkflowListEvents();\n useStationMetricsEvents();\n\n // Gate each data source to the tiers that render it.\n const builderHome = !persona.showTaskQueueCards;\n const showWorkflowColumns = persona.canSeeWorkflows && !persona.canSeePaceBoard;\n const rolesQ = useRoleDetails({ enabled: persona.canSeePaceBoard });\n const stationQ = useStationMetrics('1h', { enabled: persona.canSeePaceBoard });\n const jobsQ = useJobs({ limit: 5, sort_by: 'updated_at', order: 'desc', namespace: durableNs }, { enabled: showWorkflowColumns });\n const durableAppIds = allAppIds;\n const pipelineAppIds = allAppIds;\n const mcpQ = useMcpRuns({ limit: 5, app_id: pipelineNs, sort_by: 'updated_at', order: 'desc' }, { enabled: showWorkflowColumns });\n const allEscQ = useAvailableEscalations({ limit: 5, sort_by: 'created_at', order: 'desc', enabled: builderHome });\n const myEscQ = useEscalations({ assigned_to: user?.userId, status: 'pending', limit: 5, sort_by: 'created_at', order: 'desc', enabled: builderHome });\n\n useEffect(() => {\n const timer = setTimeout(() => {\n myEscQ.refetch();\n allEscQ.refetch();\n }, 2000);\n return () => clearTimeout(timer);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const paceStations = useMemo((): ChartStation[] => {\n const roles = rolesQ.data?.roles ?? [];\n const fragments = buildFragments(roles);\n // A role flagged ops_home_default picks the segment the home board opens\n // on; unset anywhere, the first (primary) segment leads as before.\n const homeRole = roles.find((r) => r.ops_home_default)?.role;\n const fragment =\n (homeRole && fragments.find((f) => f.stations.some((s) => s.role.role === homeRole)))\n || fragments[0];\n const primary = fragment?.stations ?? [];\n const metrics = stationQ.data?.stations ?? [];\n return primary.map(({ role: r }) => ({\n role: r.role,\n title: r.title,\n parent_role: r.parent_role,\n target_per_hour: r.target_per_hour ?? null,\n upstream_roles: r.upstream_roles ?? [],\n metric: metrics.find((m) => m.role === r.role),\n }));\n }, [rolesQ.data, stationQ.data]);\n\n const jobs = jobsQ.data?.jobs ?? [];\n const jobsTotal = jobsQ.data?.total;\n const mcpRuns = (mcpQ.data as any)?.jobs ?? [];\n const mcpTotal = (mcpQ.data as any)?.total as number | undefined;\n const allEscalations = allEscQ.data?.escalations ?? [];\n const allEscTotal = allEscQ.data?.total;\n const myEscalations = myEscQ.data?.escalations ?? [];\n const myEscTotal = myEscQ.data?.total;\n\n // ── Operator: task queue cards, scrolling page ─────────────────────────────\n if (persona.showTaskQueueCards) {\n return (\n <div>\n <h1 className=\"heading-1 mb-6\">Console</h1>\n <TaskQueueCards maxRows={2} />\n </div>\n );\n }\n\n // ── Admin / superadmin: Pace Board console ─────────────────────────────────\n // Top half: Pace Board anchored — the operational heartbeat, always visible.\n // Bottom half: escalation panels, each with its own scrollbar.\n // On small screens (phone) the bottom half collapses — chart fills the view.\n if (persona.canSeePaceBoard) {\n return (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n\n {/* Pace Board — never scrolls ──────────────────────────────────────── */}\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <div className=\"flex items-center justify-between pb-3 px-5 shrink-0 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <LayoutDashboard className=\"w-3.5 h-3.5 text-accent/60\" strokeWidth={1.5} />\n <h2 className=\"section-h2\">Pace Board</h2>\n {paceStations.length > 0 && (\n <span className=\"text-2xs text-text-quaternary\">\n {paceStations.length} {paceStations.length === 1 ? 'station' : 'stations'} · 1h\n </span>\n )}\n </div>\n <NavIcon to=\"/operations\" icon={ExternalLink} title=\"Open the full Pace Board\" />\n </div>\n <div className=\"flex-1 min-h-0 cursor-pointer\" onClick={() => navigate('/operations')}>\n {paceStations.length === 0 ? (\n <EmptyPanel icon={LayoutDashboard} text=\"No stations yet — mark roles visible in Operations\" />\n ) : (\n <PaceChart\n stations={paceStations}\n selectedRole={null}\n onSelect={() => navigate('/operations')}\n onUpstreamSelect={() => navigate('/operations')}\n periodHours={1}\n logScale\n fill\n />\n )}\n </div>\n </div>\n\n {/* Escalation panels — hidden on phone, each scrolls independently ── */}\n <div className=\"hidden sm:flex flex-1 min-h-0 border-t border-surface-border\">\n <PanelCol\n icon={Inbox}\n title=\"All Escalations\"\n count={allEscTotal}\n actions={\n <>\n <ListToolbar onRefresh={() => allEscQ.refetch()} isFetching={allEscQ.isFetching} apiPath=\"/escalations?status=pending&limit=5&sort_by=created_at&order=desc\" />\n <NavIcon to=\"/escalations/available\" icon={ExternalLink} title=\"All escalations\" />\n </>\n }\n >\n {allEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No pending escalations\" />\n ) : (\n <div className=\"space-y-0.5\">\n {allEscalations.map((esc: any) => (\n <EscalationRow key={esc.id} esc={esc} onClick={() => navigate(`/escalations/detail/${esc.id}`)} />\n ))}\n </div>\n )}\n </PanelCol>\n\n <div className=\"w-px bg-surface-border shrink-0\" />\n\n <PanelCol\n icon={Inbox}\n title=\"My Escalations\"\n count={myEscTotal}\n actions={\n <>\n <ListToolbar onRefresh={() => myEscQ.refetch()} isFetching={myEscQ.isFetching} apiPath={`/escalations?assigned_to=${user?.userId ?? ''}&status=pending&limit=5&sort_by=created_at&order=desc`} />\n <NavIcon to=\"/escalations/queue\" icon={ExternalLink} title=\"My escalation queue\" />\n </>\n }\n >\n {myEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No assigned escalations\" />\n ) : (\n <div className=\"space-y-0.5\">\n {myEscalations.map((esc: any) => (\n <EscalationRow key={esc.id} esc={esc} onClick={() => navigate(`/escalations/detail/${esc.id}`)} />\n ))}\n </div>\n )}\n </PanelCol>\n </div>\n </div>\n );\n }\n\n // ── Engineer: 4-quadrant console ──────────────────────────────────────────\n // Top row: All Escalations | My Escalations — each scrolls independently.\n // Bottom row: Procedural | Graph — each scrolls independently.\n return (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n\n {/* Top row: escalations ───────────────────────────────────────────────── */}\n <div className=\"flex-1 min-h-0 flex border-b border-surface-border\">\n <PanelCol\n icon={Inbox}\n title=\"All Escalations\"\n count={allEscTotal}\n actions={\n <>\n <ListToolbar onRefresh={() => allEscQ.refetch()} isFetching={allEscQ.isFetching} apiPath=\"/escalations?status=pending&limit=5&sort_by=created_at&order=desc\" />\n <NavIcon to=\"/escalations/available\" icon={ExternalLink} title=\"All escalations\" />\n </>\n }\n >\n {allEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No pending escalations\" />\n ) : (\n <div className=\"space-y-0.5\">\n {allEscalations.map((esc: any) => (\n <EscalationRow key={esc.id} esc={esc} onClick={() => navigate(`/escalations/detail/${esc.id}`)} />\n ))}\n </div>\n )}\n </PanelCol>\n\n <div className=\"w-px bg-surface-border shrink-0\" />\n\n <PanelCol\n icon={Inbox}\n title=\"My Escalations\"\n count={myEscTotal}\n actions={\n <>\n <ListToolbar onRefresh={() => myEscQ.refetch()} isFetching={myEscQ.isFetching} apiPath={`/escalations?assigned_to=${user?.userId ?? ''}&status=pending&limit=5&sort_by=created_at&order=desc`} />\n <NavIcon to=\"/escalations/queue\" icon={ExternalLink} title=\"My escalation queue\" />\n </>\n }\n >\n {myEscalations.length === 0 ? (\n <EmptyPanel icon={Inbox} text=\"No assigned escalations\" />\n ) : (\n <div className=\"space-y-0.5\">\n {myEscalations.map((esc: any) => (\n <EscalationRow key={esc.id} esc={esc} onClick={() => navigate(`/escalations/detail/${esc.id}`)} />\n ))}\n </div>\n )}\n </PanelCol>\n </div>\n\n {/* Bottom row: workflow executions ────────────────────────────────────── */}\n {showWorkflowColumns && (\n <div className=\"flex-1 min-h-0 flex\">\n <PanelCol\n icon={Code2}\n title=\"Procedural\"\n count={jobsTotal}\n actions={\n <>\n <ListToolbar onRefresh={() => jobsQ.refetch()} isFetching={jobsQ.isFetching} apiPath={`/workflow-states/jobs?namespace=${durableNs}&limit=5`} />\n <NavIcon to=\"/workflows/executions\" icon={ExternalLink} title=\"All procedural executions\" />\n </>\n }\n >\n <AppPicker appIds={durableAppIds} selected={durableNs} onSelect={(ns) => setNs('durablenamespace', ns)} />\n {jobs.length === 0 ? (\n <EmptyPanel icon={Code2} text=\"No recent procedural runs\" />\n ) : (\n <div className=\"space-y-0.5\">\n {jobs.map((job: any) => (\n <ExecutionRow\n key={job.workflow_id}\n dot={statusDotClass(job.status)}\n pill={<WorkflowPill type={job.entity || job.type || 'workflow'} size=\"xs\" />}\n id={job.workflow_id}\n date={job.updated_at ?? job.created_at}\n onClick={() => navigate(`/workflows/executions/${job.workflow_id}`)}\n />\n ))}\n </div>\n )}\n </PanelCol>\n\n <div className=\"w-px bg-surface-border shrink-0\" />\n\n <PanelCol\n icon={Workflow}\n title=\"Graph\"\n count={mcpTotal}\n actions={\n <>\n <ListToolbar onRefresh={() => mcpQ.refetch()} isFetching={mcpQ.isFetching} apiPath={`/pipelines?app_id=${pipelineNs}&limit=5`} />\n <NavIcon to=\"/mcp/executions\" icon={ExternalLink} title=\"All graph executions\" />\n </>\n }\n >\n <AppPicker appIds={pipelineAppIds} selected={pipelineNs} onSelect={(ns) => setNs('pipelinenamespace', ns)} />\n {mcpRuns.length === 0 ? (\n <EmptyPanel icon={Workflow} text=\"No recent graph runs\" />\n ) : (\n <div className=\"space-y-0.5\">\n {mcpRuns.map((run: any) => (\n <ExecutionRow\n key={run.workflow_id}\n dot={statusDotClass(run.status)}\n pill={<WorkflowPill type={run.entity || run.workflow_name || 'pipeline'} variant=\"pipeline\" size=\"xs\" />}\n id={run.workflow_id}\n date={run.updated_at ?? run.created_at}\n onClick={() => navigate(`/mcp/executions/${run.workflow_id}?namespace=${pipelineNs}`)}\n />\n ))}\n </div>\n )}\n </PanelCol>\n </div>\n )}\n </div>\n );\n}\n"],"names":["useTaskQueueRoles","user","useAuth","useMemo","names","r","isSystemTierRole","a","b","useMyEscalationCount","userId","qc","useQueryClient","data","useEscalations","useEventSubscriptions","useMemberEscalationPatterns","Stat","n","label","tone","jsxs","jsx","TaskQueueCard","role","title","metric","priorityFacet","periodLabel","navigate","useNavigate","pending","claimed","resolved","jeopardy","e","ExternalLink","jeopardyQueueLink","TriangleAlert","ClaimedCard","count","Hand","PERIODS","TaskQueueCards","maxRows","period","setPeriod","useState","roles","claimedCount","metricsQ","useStationMetrics","rolesQ","useRoleDetails","metricByRole","_a","m","detailByRole","sortedRoles","ja","jb","_b","laneBudget","shownRoles","overflow","Layers","p","Fragment","STATUS_DOT","statusDotClass","status","EmptyPanel","Icon","text","midEllipsis","maxLen","keep","ExecutionRow","dot","pill","id","date","onClick","DateValue","EscalationRow","esc","WorkflowPill","RolePill","NavIcon","to","AppPicker","appIds","selected","onSelect","open","setOpen","ref","useRef","useEffect","handler","v","PanelCol","actions","children","formatCountCompact","HomePage","isBuilder","useAccess","persona","usePersona","searchParams","setSearchParams","useSearchParams","cpData","useControlPlaneApps","allAppIds","firstAppId","pipelineNs","durableNs","setNs","useCallback","key","ns","prev","next","useEscalationStatsEvents","useWorkflowListEvents","useStationMetricsEvents","builderHome","showWorkflowColumns","stationQ","jobsQ","useJobs","durableAppIds","pipelineAppIds","mcpQ","useMcpRuns","allEscQ","useAvailableEscalations","myEscQ","timer","paceStations","fragments","buildFragments","homeRole","fragment","s","primary","metrics","_c","jobs","jobsTotal","mcpRuns","mcpTotal","_d","allEscalations","_e","allEscTotal","_f","myEscalations","_g","myEscTotal","_h","LayoutDashboard","PaceChart","Inbox","ListToolbar","Code2","job","Workflow","run"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as C,j as s}from"./vendor-query-RUZdMvN6.js";import{ak as u,al as j}from"./index-DSdqso-_.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]=C.useState(null),i=(e,l)=>{navigator.clipboard.writeText(e).then(()=>{r(l),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}`,l=j(),$=l?`curl -H "Authorization: Bearer ${l}" "${e}"`:`curl "${e}"`;i($,"curl")},o="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:o,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:o,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:`${o} disabled:opacity-50`,title:"Refresh",children:s.jsx(k,{className:`${a} ${n?"animate-spin":""}`})})]})}export{g as L};
2
- //# sourceMappingURL=ListToolbar-BEogxu1f.js.map
@@ -1,2 +0,0 @@
1
- import{j as e}from"./vendor-query-RUZdMvN6.js";import{P as j}from"./PageHeader-CFVw67M6.js";import{D as _}from"./DataTable-DFPMeqyQ.js";import{F as v,b as f}from"./FilterBar-fwUqeM-5.js";import{S as P}from"./StickyPagination-BsbSade1.js";import{L as N}from"./ListToolbar-BEogxu1f.js";import{b as C}from"./api-path-u2Jf9QXS.js";import{T as h}from"./TimestampCell-Be6tvFQd.js";import{E as $}from"./ElapsedCell-BirS3yZq.js";import{W}from"./WorkflowPill-CN-952iI.js";import{E as S}from"./EmptyState-lpUFYfun.js";import{R as c}from"./RowActions-eYrzgQSj.js";import{u as q}from"./useFilterParams-crmlBw_l.js";import{b as T}from"./useEventHooks-DL3Vhz4g.js";import{u as D}from"./mcp-query-CfiqUNDV.js";import{l as y,Y as B,_ as g,$ as k,a0 as F,a1 as L}from"./vendor-icons-h-jlRSb9.js";import{u as M}from"./vendor-react-CdqEC2zv.js";import"./index-DSdqso-_.js";const E={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 R(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const o=p(t),a=E[o]??"bg-status-pending",l=o==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${a}${l}`,title:o}),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(W,{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 o=p(t);return e.jsx($,{startDate:t.created_at,endDate:o==="in_progress"?null:t.updated_at,isLive:o==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const a=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(B,{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 ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Build":"Planning...",disabled:!a,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 ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Profile":"Building...",disabled:!a,children:e.jsx(F,{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(L,{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 ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Compile":"Complete discovery first",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function ae(){const s=M(),t=R(s),{filters:o,setFilter:a,pagination:l,sort:d,setSort:r}=q({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:b}=D({limit:l.pageSize,offset:l.offset,search:o.search,status:o.status,entity:o.type||void 0});T();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(N,{onRefresh:()=>b(),apiPath:C("/workflow-states/jobs",{entity:o.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner",limit:l.pageSize,offset:l.offset,sort_by:"created_at",order:"desc",status:o.status||void 0,search:o.search||void 0})}),children:[e.jsx(f,{label:"Type",value:o.type,onChange:i=>a("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:o.status,onChange:i=>a("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(S,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(P,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{ae as McpQueryPage};
2
- //# sourceMappingURL=McpQueryPage-BvvM0Ya1.js.map
@@ -1,2 +0,0 @@
1
- import{j as e,b as V,a as m}from"./vendor-query-RUZdMvN6.js";import{b as J,c as B}from"./pipelines-C73X50ES.js";import{P as n,b as y,D as F,c as O,d as U,u as $,e as H,J as S,N as K}from"./index-DSdqso-_.js";import{P as k}from"./PageHeader-CFVw67M6.js";import{S as Q}from"./SegmentedTabs-DXNzY05q.js";import{u as W,E as q}from"./EventTable-zFqzbEdC.js";import{L as z}from"./ListToolbar-BEogxu1f.js";import{S as X}from"./SwimlaneTimeline-DSO6QXmX.js";import{S as Y}from"./StatusBadge-BDeUwPtb.js";import{C as _}from"./CopyableId-4Lqlc5cU.js";import{J as T,K as G,O as Z,Q as ee,V as se,s as te}from"./vendor-icons-h-jlRSb9.js";import{e as ae,f as le}from"./vendor-react-CdqEC2zv.js";import"./FilterBar-fwUqeM-5.js";import"./StreamMessageDetail-jczXwuBw.js";const ne={running:"in_progress",completed:"completed",failed:"failed"};function ie({execution:s,namespace:c,traceUrl:t,headerActions:o,open:a}){const{summary:l}=s,i=[{id:"details",icon:T,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(n,{label:"Status",children:e.jsx(Y,{status:ne[s.status]??s.status})}),e.jsx(n,{label:"Server",children:e.jsx("span",{className:"font-mono",children:c||"—"})}),e.jsx(n,{label:"Tool",children:e.jsx("span",{className:"font-mono",children:s.workflow_type||"—"})}),e.jsx(n,{label:"Workflow ID",children:e.jsx(_,{bare:!0,value:s.workflow_id})}),e.jsx(n,{label:"Started",children:s.start_time?e.jsx(y,{date:s.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Completed",children:s.close_time?e.jsx(y,{date:s.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(n,{label:"Duration",children:e.jsx(F,{ms:s.duration_ms,className:"font-mono"})}),s.trace_id&&e.jsx(n,{label:"Trace",children:e.jsx(_,{bare:!0,value:s.trace_id,href:t?t.replace("{traceId}",s.trace_id):void 0,external:!0})}),e.jsx(n,{label:"Tools",children:l.activities.user}),e.jsx(n,{label:"System",children:l.activities.system}),l.child_workflows.total>0&&e.jsx(n,{label:"Children",children:l.child_workflows.total}),l.timers>0&&e.jsx(n,{label:"Timers",children:l.timers}),l.signals>0&&e.jsx(n,{label:"Signals",children:l.signals})]})}];return e.jsx(O,{open:a,width:384,className:"h-full",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(U,{views:i,activeId:"details",onViewChange:()=>{},headerActions:o,stickyClassName:"h-full min-h-0",labelInline:!0})})})}const re=["details","timeline","events"],P="lt:mcp-run-detail:tab";function oe({isRunning:s,onTerminate:c}){const[t,o]=m.useState(!1),a=m.useRef(null);return m.useEffect(()=>{if(!t)return;const l=i=>{a.current&&!a.current.contains(i.target)&&o(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[t]),s?e.jsxs("div",{className:"relative",ref:a,children:[e.jsxs("button",{onClick:()=>o(!t),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(te,{className:`w-3 h-3 transition-transform ${t?"rotate-180":""}`})]}),t&&e.jsx("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]",children:e.jsx("button",{onClick:()=>{c(),o(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"})})]}):null}function ye(){var g,w;const{jobId:s}=ae(),[c]=le(),t=c.get("namespace")||"",o=V(),{data:a,isLoading:l,error:i,refetch:b,isFetching:E}=J(s,t),x=B(),{data:p}=$(),{isCollapsed:I,toggle:C}=W("mcp-run-detail"),h=!I("side-panel"),A=((g=p==null?void 0:p.telemetry)==null?void 0:g.traceUrl)??null,[d,D]=m.useState(()=>{try{const r=localStorage.getItem(P);return r&&re.includes(r)?r:"details"}catch{return"details"}}),R=r=>{D(r);try{localStorage.setItem(P,r)}catch{}},M=m.useCallback(r=>{!s||r.workflowId!==s||o.invalidateQueries({queryKey:["mcpRunExecution",s]})},[s,o]);if(H(`${K}.system.>`,M),l)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||!a)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:(w=i==null?void 0:i.message)!=null&&w.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:f}=a,j=f.find(r=>{var N;return r.category==="activity"&&((N=r.attributes.kind)==null?void 0:N.includes("completed"))}),L=(j==null?void 0:j.attributes.result)??null,u=a.result,v=(u==null?void 0:u.data)??u??null;return e.jsxs("div",{className:"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col min-h-0",children:[e.jsxs("div",{className:"shrink-0 pt-8 pr-page-x",children:[e.jsx(k,{title:"Pipeline Execution",actions:e.jsx("button",{onClick:()=>C("side-panel"),className:"text-accent/60 hover:text-accent transition-colors",title:h?"Hide side panel":"Show side panel",children:h?e.jsx(G,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(Z,{className:"w-5 h-5",strokeWidth:1.5})})}),x.error&&e.jsxs("p",{className:"text-xs text-status-error py-2",children:["Interrupt failed: ",x.error.message]}),e.jsx("div",{className:"mt-2",children:e.jsx(Q,{"aria-label":"Execution section",active:d,onChange:R,tabs:[{key:"details",label:"Details",icon:e.jsx(T,{className:"w-3.5 h-3.5"})},{key:"timeline",label:"Execution Timeline",icon:e.jsx(ee,{className:"w-3.5 h-3.5"})},{key:"events",label:"Events",icon:e.jsx(se,{className:"w-3.5 h-3.5"})}]})})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in",children:[d==="details"&&e.jsx("div",{className:"@container",children:e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4",children:[e.jsx(S,{data:L??{},label:"Input"}),v!==null&&e.jsx(S,{data:v,label:"Result"})]})}),d==="timeline"&&e.jsx(X,{events:f,outline:!0,jid:s,appId:t||"durable"}),d==="events"&&e.jsx(q,{events:f,jid:s,appId:t||"durable"})]},d)]}),e.jsx(ie,{execution:a,namespace:t,traceUrl:A,headerActions:e.jsxs(e.Fragment,{children:[e.jsx(z,{onRefresh:()=>b(),isFetching:E,apiPath:`/pipelines/${s}/execution?app_id=${t}`}),e.jsx(oe,{isRunning:a.status==="running",onTerminate:()=>{confirm("Interrupt this pipeline execution? This cannot be undone.")&&x.mutate({jobId:a.workflow_id,topic:a.workflow_type,appId:t},{onSuccess:()=>b()})}})]}),open:h})]})}export{ye as McpRunDetailPage};
2
- //# sourceMappingURL=McpRunDetailPage-5eaJeupC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpRunDetailPage-5eaJeupC.js","sources":["../../src/pages/mcp/McpExecutionSidePanel.tsx","../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { Info } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../../components/common/layout/SlidePanel';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\n\nconst STATUS_MAP: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n/**\n * The pipeline-execution detail side panel — the run's facts beside the timeline,\n * the same shell the workflow-execution page uses. Identity, timing, the trace\n * link, and the activity counts that used to sit in a header card now live here;\n * the page's Actions menu and refresh toolbar ride the panel's header row.\n */\nexport function McpExecutionSidePanel({ execution, namespace, traceUrl, headerActions, open }: {\n execution: {\n workflow_id: string;\n workflow_type: string;\n status: string;\n start_time?: string | null;\n close_time?: string | null;\n duration_ms?: number | null;\n trace_id?: string | null;\n summary: {\n activities: { user: number; system: number };\n child_workflows: { total: number };\n timers: number;\n signals: number;\n };\n };\n namespace: string;\n traceUrl: string | null;\n /** Page controls (toolbar, Actions menu) shown at the right of the panel header. */\n headerActions?: React.ReactNode;\n open: boolean;\n}) {\n const { summary } = execution;\n\n const views: SlidePanelView[] = [\n {\n id: 'details',\n icon: Info,\n label: 'Details',\n content: (\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={STATUS_MAP[execution.status] ?? execution.status} /></PanelField>\n <PanelField label=\"Server\"><span className=\"font-mono\">{namespace || '—'}</span></PanelField>\n <PanelField label=\"Tool\"><span className=\"font-mono\">{execution.workflow_type || '—'}</span></PanelField>\n <PanelField label=\"Workflow ID\"><CopyableId bare value={execution.workflow_id} /></PanelField>\n <PanelField label=\"Started\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Completed\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Duration\"><DurationValue ms={execution.duration_ms} className=\"font-mono\" /></PanelField>\n {execution.trace_id && (\n <PanelField label=\"Trace\">\n <CopyableId\n bare\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n </PanelField>\n )}\n <PanelField label=\"Tools\">{summary.activities.user}</PanelField>\n <PanelField label=\"System\">{summary.activities.system}</PanelField>\n {summary.child_workflows.total > 0 && <PanelField label=\"Children\">{summary.child_workflows.total}</PanelField>}\n {summary.timers > 0 && <PanelField label=\"Timers\">{summary.timers}</PanelField>}\n {summary.signals > 0 && <PanelField label=\"Signals\">{summary.signals}</PanelField>}\n </dl>\n ),\n },\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"h-full\">\n <div className=\"h-full pl-6\">\n <SlidePanelViews\n views={views}\n activeId=\"details\"\n onViewChange={() => {}}\n headerActions={headerActions}\n stickyClassName=\"h-full min-h-0\"\n labelInline\n />\n </div>\n </SlidePanel>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution, useInterruptJob } from '../../api/pipelines';\nimport { useSettings } from '../../api/settings';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { SegmentedTabs } from '../../components/common/layout/SegmentedTabs';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { PanelRightClose, PanelRightOpen, ChevronDown, Info, Activity, List } from 'lucide-react';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\nimport { McpExecutionSidePanel } from './McpExecutionSidePanel';\n\ntype McpTab = 'details' | 'timeline' | 'events';\nconst MCP_TABS = ['details', 'timeline', 'events'] as const;\nconst MCP_TAB_KEY = 'lt:mcp-run-detail:tab';\n\n// ── Actions dropdown ────────────────────────────────────────────────────────\n\nfunction ActionsDropdown({ isRunning, onTerminate }: {\n isRunning: boolean;\n onTerminate: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (!isRunning) return null;\n\n return (\n <div className=\"relative\" ref={ref}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-accent hover:text-accent-hover hover:bg-surface-hover transition-colors\"\n title=\"Actions\"\n >\n Actions\n <ChevronDown className={`w-3 h-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]\">\n <button\n onClick={() => { onTerminate(); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n </div>\n )}\n </div>\n );\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') || '';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const interruptMutation = useInterruptJob();\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n const sidePanelOpen = !isCollapsed('side-panel');\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // The main content is a segmented switch, not an accordion: one section at a\n // time, tabs at the top, the choice persisted across visits.\n const [tab, setTab] = useState<McpTab>(() => {\n try {\n const saved = localStorage.getItem(MCP_TAB_KEY) as McpTab | null;\n return saved && MCP_TABS.includes(saved) ? saved : 'details';\n } catch {\n return 'details';\n }\n });\n const selectTab = (next: McpTab) => {\n setTab(next);\n try { localStorage.setItem(MCP_TAB_KEY, next); } catch { /* private mode */ }\n };\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}.system.>`, 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 } = 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 // Two fixed-height columns, like the workflow-execution page: the header and\n // tabs stay put while only the active section scrolls, and the panel is\n // affixed with its own internal scroll and bleeds to the page edge.\n <div className=\"flex-1 min-h-0 min-w-0 flex items-stretch -mt-8 -mr-page-x -mb-16\">\n <div className=\"flex-1 min-w-0 flex flex-col min-h-0\">\n {/* Fixed header: title + the panel toggle, then the tab strip. Facts,\n the toolbar, and the Actions menu all live in the panel. */}\n <div className=\"shrink-0 pt-8 pr-page-x\">\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <button\n onClick={() => toggle('side-panel')}\n className=\"text-accent/60 hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n }\n />\n\n {interruptMutation.error && (\n <p className=\"text-xs text-status-error py-2\">\n Interrupt failed: {(interruptMutation.error as Error).message}\n </p>\n )}\n\n <div className=\"mt-2\">\n <SegmentedTabs<McpTab>\n aria-label=\"Execution section\"\n active={tab}\n onChange={selectTab}\n tabs={[\n { key: 'details', label: 'Details', icon: <Info className=\"w-3.5 h-3.5\" /> },\n { key: 'timeline', label: 'Execution Timeline', icon: <Activity className=\"w-3.5 h-3.5\" /> },\n { key: 'events', label: 'Events', icon: <List className=\"w-3.5 h-3.5\" /> },\n ]}\n />\n </div>\n </div>\n\n {/* Only the active section scrolls; the key restarts the reveal and\n resets the scroll position on each switch. */}\n <div key={tab} className=\"flex-1 min-h-0 overflow-y-auto pr-page-x pt-6 pb-16 animate-page-in\">\n {tab === 'details' && (\n <div className=\"@container\">\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4\">\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n {result !== null && <JsonViewer data={result} label=\"Result\" />}\n </div>\n </div>\n )}\n {tab === 'timeline' && (\n <SwimlaneTimeline events={events} outline jid={jobId} appId={namespace || 'durable'} />\n )}\n {tab === 'events' && (\n <EventTable events={events} jid={jobId} appId={namespace || 'durable'} />\n )}\n </div>\n </div>\n\n <McpExecutionSidePanel\n execution={execution}\n namespace={namespace}\n traceUrl={traceUrl}\n headerActions={\n <>\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/pipelines/${jobId}/execution?app_id=${namespace}`}\n />\n <ActionsDropdown\n isRunning={execution.status === 'running'}\n onTerminate={() => {\n if (confirm('Interrupt this pipeline execution? This cannot be undone.')) {\n interruptMutation.mutate(\n { jobId: execution.workflow_id, topic: execution.workflow_type, appId: namespace },\n { onSuccess: () => refetch() },\n );\n }\n }}\n />\n </>\n }\n open={sidePanelOpen}\n />\n </div>\n );\n}\n"],"names":["STATUS_MAP","McpExecutionSidePanel","execution","namespace","traceUrl","headerActions","open","summary","views","Info","jsxs","jsx","PanelField","StatusBadge","CopyableId","DateValue","DurationValue","SlidePanel","SlidePanelViews","MCP_TABS","MCP_TAB_KEY","ActionsDropdown","isRunning","onTerminate","setOpen","useState","ref","useRef","useEffect","handler","e","ChevronDown","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","queryClient","useQueryClient","isLoading","error","refetch","isFetching","useMcpRunExecution","interruptMutation","useInterruptJob","settings","useSettings","isCollapsed","toggle","useCollapsedSections","sidePanelOpen","_a","tab","setTab","saved","selectTab","next","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","PageHeader","_b","events","triggerCompleted","triggerInput","rawResult","result","PanelRightClose","PanelRightOpen","SegmentedTabs","Activity","List","JsonViewer","SwimlaneTimeline","EventTable","Fragment","ListToolbar"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as d,j as s}from"./vendor-query-RUZdMvN6.js";import{a as R,u as T}from"./pipelines-C73X50ES.js";import{a as M}from"./yaml-workflows-DjEHh9Wy.js";import{u as z}from"./useFilterParams-crmlBw_l.js";import{u as E}from"./useNamespace-CpO5Hogb.js";import{b as $}from"./api-path-u2Jf9QXS.js";import{D as A}from"./DataTable-DFPMeqyQ.js";import{W as L}from"./WorkflowPill-CN-952iI.js";import{E as U}from"./ElapsedCell-BirS3yZq.js";import{b}from"./index-DSdqso-_.js";import{P as W}from"./PageHeader-CFVw67M6.js";import{F as H,b as g}from"./FilterBar-fwUqeM-5.js";import{S as I}from"./StickyPagination-BsbSade1.js";import{L as O}from"./ListToolbar-BEogxu1f.js";import{R as B,a as q}from"./RowActions-eYrzgQSj.js";import{H as G}from"./vendor-icons-h-jlRSb9.js";import{u as V}from"./vendor-react-CdqEC2zv.js";import"./controlplane-CD6ti-QB.js";import"./EmptyState-lpUFYfun.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},D={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},J={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function K(x,f){return[{key:"workflow_id",label:"Run ID",render:t=>{const a=D[Y[t.status]??t.status]??"bg-status-pending",n=t.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[s.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${a}${n}`,title:t.status}),s.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:t.workflow_id})]})}},{key:"entity",label:"Tool",render:t=>t.entity?s.jsx(L,{type:t.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-2xs text-text-tertiary",children:"—"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",sortable:!0,render:t=>s.jsx(b,{date:t.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"updated_at",label:"Updated",sortable:!0,render:t=>s.jsx(b,{date:t.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"duration",label:"Duration",render:t=>s.jsx(U,{startDate:t.created_at,endDate:t.status==="running"?null:t.updated_at,isLive:t.status==="running"}),className:"w-28"},{key:"actions",label:"",render:t=>s.jsxs(B,{children:[s.jsx(q,{icon:G,title:`Filter by ${t.entity}`,onClick:()=>x(t.entity)}),s.jsx("button",{onClick:a=>{a.stopPropagation(),f(t.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${t.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${J[t.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function ge(){const x=V(),{namespace:f,available:t}=E("namespace"),{filters:a,setFilter:n,setFilters:v,pagination:o,sort:u,setSort:j}=z({filters:{search:"",entity:"",status:"",namespace:""}}),[m,_]=d.useState(a.search);d.useEffect(()=>{if(m===a.search)return;const e=setTimeout(()=>n("search",m),300);return()=>clearTimeout(e)},[m,n,a.search]);const{data:l}=M(),h=d.useMemo(()=>{const e=new Set(t);for(const r of(l==null?void 0:l.app_ids)??[])e.add(r);return[...e].sort()},[t,l==null?void 0:l.app_ids]),i=a.namespace||f,{data:c}=R(i),{data:p,isLoading:k,refetch:S,isFetching:N}=T({app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"}),y=(p==null?void 0:p.total)??0,w=(p==null?void 0:p.jobs)??[],C=K(e=>n("entity",e),e=>n("status",e)),P=d.useMemo(()=>{const e=new Set(h);return i&&e.add(i),[...e].sort().map(r=>({value:r,label:r}))},[h,i]),F=d.useMemo(()=>{const e=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!e.has(a.entity)&&e.add(a.entity),[...e].sort().map(r=>({value:r,label:r}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(W,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:graph-executions"}),s.jsxs(H,{actions:s.jsx(O,{onRefresh:()=>S(),isFetching:N,apiPath:$("/pipelines",{app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,status:a.status||void 0,search:a.search||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"})}),children:[s.jsx(g,{label:"Namespace",value:i,onChange:e=>{v({namespace:e,entity:""})},options:P,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:m,onChange:e=>_(e.target.value),className:"input text-2xs py-1 px-2 w-56"}),s.jsx(g,{label:"Tool",value:a.entity,onChange:e=>n("entity",e),options:F}),s.jsx(g,{label:"Status",value:a.status,onChange:e=>n("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(A,{columns:C,data:w,keyFn:e=>e.workflow_id,onRowClick:e=>x(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${i}`),isLoading:k,emptyMessage:"No pipeline executions found",sort:u,onSort:j}),s.jsx(I,{page:o.page,totalPages:o.totalPages(y),onPageChange:o.setPage,total:y,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ge as McpRunsPage};
2
- //# sourceMappingURL=McpRunsPage-B5_-3NUF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpRunsPage-B5_-3NUF.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/pipelines';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\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',\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-center gap-2 min-w-0\">\n <span className={`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-2xs text-text-tertiary\">—</span>,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\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=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\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 { namespace: hookNamespace, available } = useNamespace('namespace');\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\n // Merge real HotMesh namespaces (from controlplane/apps) with YAML workflow app_ids\n const allNamespaceNames = useMemo(() => {\n const set = new Set(available);\n for (const id of appIdData?.app_ids ?? []) {\n set.add(id);\n }\n return [...set].sort();\n }, [available, appIdData?.app_ids]);\n\n const activeNamespace = filters.namespace || hookNamespace;\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 || 'created_at',\n order: sort.order || 'desc',\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:graph-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/pipelines', {\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n status: filters.status || undefined,\n search: filters.search || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n })}\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-2xs 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","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","hookNamespace","available","useNamespace","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","allNamespaceNames","useMemo","set","id","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","entities","known","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import{a as h,j as e}from"./vendor-query-RUZdMvN6.js";import{U as te,m as $t,Y as tt,M as we,n as St,aB as st,I as qt,ae as Mt,v as Ct}from"./index-DSdqso-_.js";import{j as _t,i as Rt}from"./useEventHooks-DL3Vhz4g.js";import{s as Pe,a as he,u as B,b as ze,E as We,c as nt,i as Le,d as at}from"./EntityTimelinePanel-D3QNqDiL.js";import{aq as Pt,aY as Lt,at as rt,C as Et,s as Ge,ay as Ot,c as At,X as Bt,ax as Ft,an as It,aZ as Tt,E as Wt,a0 as Dt,ao as ot}from"./vendor-icons-h-jlRSb9.js";import{u as lt,f as it,L as le}from"./vendor-react-CdqEC2zv.js";import{P as Ut}from"./PageHeader-CFVw67M6.js";function zt({groups:t,colors:s}){const o=h.useMemo(()=>{const a=(t??[]).filter(n=>(n.dwellSeconds??0)>0),c=a.reduce((n,r)=>n+(r.dwellSeconds??0),0);return c?a.map(n=>({key:he(n.subtype),label:Pe(n.subtype),seconds:n.dwellSeconds??0,pct:(n.dwellSeconds??0)/c})).sort((n,r)=>r.seconds-n.seconds):null},[t]);if(!o)return e.jsx("span",{className:"text-2xs text-text-quaternary",children:"—"});const i=o.map(a=>`${a.label} ${te(a.seconds*1e3)} · ${Math.round(a.pct*100)}%`).join(`
2
- `);return e.jsxs("div",{className:"flex items-center gap-1.5",title:i,children:[e.jsx("div",{className:"w-16 h-1.5 bg-surface-sunken rounded-full overflow-hidden flex shrink-0",children:o.map(a=>e.jsx("div",{style:{width:`${a.pct*100}%`,backgroundColor:s.get(a.key)}},a.key))}),e.jsxs("span",{className:"text-2xs font-mono text-text-quaternary tabular-nums",children:[Math.round(o[0].pct*100),"%"]})]})}function Ee(t){return t.reduce((s,o)=>s+(o.dwellSeconds??0),0)||1}function ct(t,s){const o=[];for(const i of t){const a=i.facets[s];a==null||(i.dwellSeconds??0)<=0||o.push(a)}return o}function dt(t,s,o,i){const a=new Map;for(const r of s){const d=r.facets[i];if(d==null||(r.dwellSeconds??0)<=0)continue;const u=a.get(d)??[];u.push(r),a.set(d,u)}const c=new Map;for(const r of o){const d=r.facets[i];d==null||(r.count??0)<=0||r.state==null||c.has(d)||c.set(d,r.state)}const n=[];for(const r of t){const d=r.facets[i];if(d==null||(r.dwellSeconds??0)<=0)continue;const u=[...a.get(d)??[]].sort((m,w)=>(w.dwellSeconds??0)-(m.dwellSeconds??0));n.push({value:d,groups:u,total:r.dwellSeconds??0,nowState:c.get(d)??null})}return n}function Gt(t,s,o=12){const i=new Map;for(const a of t){if((a.dwellSeconds??0)<=0)continue;const c=a.facets[s]??"no value",n=i.get(c)??[];n.push(a),i.set(c,n)}return[...i.entries()].map(([a,c])=>({value:a,groups:[...c].sort((n,r)=>(r.dwellSeconds??0)-(n.dwellSeconds??0)),total:Ee(c)})).sort((a,c)=>c.total-a.total).slice(0,o)}function Oe({groups:t,colors:s,height:o,className:i=""}){const a=Ee(t),c=new Map([...s.keys()].map((r,d)=>[r,d])),n=[...t].sort((r,d)=>(c.get(r.state??"—")??1/0)-(c.get(d.state??"—")??1/0));return e.jsx("div",{className:`${o} flex rounded-full overflow-hidden bg-surface-sunken ${i}`,children:n.map(r=>e.jsx("div",{title:`${r.state??"—"} · ${te((r.dwellSeconds??0)*1e3)}`,style:{width:`${(r.dwellSeconds??0)/a*100}%`,backgroundColor:s.get(r.state??"—")}},r.state??"—"))})}function xt({text:t,tail:s=6,className:o=""}){if(t.length<=s+1)return e.jsx("span",{className:`truncate ${o}`,title:t,children:t});const i=t.slice(0,t.length-s),a=t.slice(t.length-s);return e.jsxs("span",{className:`flex items-baseline min-w-0 ${o}`,title:t,children:[e.jsx("span",{className:"truncate min-w-0",children:i}),e.jsx("span",{className:"shrink-0",children:a})]})}const Ye=15,ut="grid grid-cols-[0.6rem_7rem_minmax(2rem,1fr)_1rem] items-center gap-2.5",Ht=[25,50,100],Yt=50;function Vt({facetKey:t,row:s,colors:o,stateLabel:i,onOpen:a}){const c=lt(),n=r=>{if(r.metaKey||r.ctrlKey){c($t(t,s.value));return}a(s.value)};return e.jsxs("div",{role:"button",tabIndex:0,onClick:n,onKeyDown:r=>{r.key==="Enter"&&n(r)},className:`${ut} text-2xs cursor-pointer group py-0.5`,children:[e.jsx("span",{className:"w-2 h-2 rounded-full justify-self-center",style:{backgroundColor:s.nowState?o.get(s.nowState):"transparent"},title:s.nowState?i(s.nowState):"no current state"}),e.jsx(xt,{text:s.value,className:"font-mono text-text-secondary group-hover:text-accent transition-colors"}),e.jsx(Oe,{groups:s.groups,colors:o,height:"h-1.5",className:"min-w-[2rem]"}),e.jsx("button",{className:"icon-link justify-self-center",title:`${te(s.total*1e3)} tracked · open timeline · ⌘-click row searches every queue`,onClick:r=>{r.stopPropagation(),a(s.value)},children:e.jsx(rt,{className:"w-3 h-3"})})]})}function mt({facetKey:t,sliced:s,header:o,rows:i,colors:a,stateLabel:c,onOpen:n,onTarget:r,hasMore:d,emptyText:u}){return e.jsxs("div",{className:s?"w-72 shrink-0":"flex-1 max-w-3xl",children:[o&&e.jsxs("button",{type:"button",onClick:()=>r==null?void 0:r(o.value),className:`${ut} w-full text-left mb-2 group`,children:[e.jsx("span",{"aria-hidden":!0}),e.jsx(xt,{text:o.value,className:"font-mono text-xs font-medium text-text-primary group-hover:text-accent transition-colors"}),e.jsx(Oe,{groups:o.groups,colors:a,height:"h-2.5",className:"min-w-[2rem]"}),e.jsx("span",{className:"icon-link justify-self-center",title:`${te(o.total*1e3)} total in ${o.value} — the band shows the state split`,children:e.jsx(Pt,{className:"w-3 h-3"})})]}),i.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:u??"No entities on this page."}):e.jsx("div",{className:"space-y-0.5",children:i.map(m=>e.jsx(Vt,{facetKey:t,row:m,colors:a,stateLabel:c,onOpen:n},m.value))}),d&&o&&r&&e.jsxs("button",{type:"button",onClick:()=>r(o.value),className:"mt-2 inline-flex items-center gap-1 text-2xs text-accent hover:text-accent-hover transition-colors",children:["More ",e.jsx(Lt,{className:"w-3 h-3"})]})]})}function Qt({entityKey:t,sliceKey:s,value:o,headerGroups:i,headerTotal:a,window:c,find:n,colors:r,stateLabel:d,onOpen:u,onTarget:m}){var C;const w={entity:t,equals:{[s]:o}},j=B({query:{...w,...n?{prefix:{[t]:n}}:{}},groupBy:{facets:[t]},measure:{kind:"dwell",window:c},orderBy:[{field:"dwellSeconds",direction:"desc"}],limit:Ye}),f=h.useMemo(()=>{var b;return ct(((b=j.data)==null?void 0:b.groups)??[],t)},[j.data,t]),q=f.map(b=>({[t]:b})),k=B(f.length?{query:{entity:t,anyOf:q},groupBy:{state:!0,facets:[t]},measure:{kind:"dwell",window:c},limit:Ye*4}:null),P=B(f.length?{query:{entity:t,anyOf:q},groupBy:{state:!0,facets:[t]},measure:{kind:"membership"}}:null),$=h.useMemo(()=>{var b,F,L;return dt(((b=j.data)==null?void 0:b.groups)??[],((F=k.data)==null?void 0:F.groups)??[],((L=P.data)==null?void 0:L.groups)??[],t)},[j.data,k.data,P.data,t]);return e.jsx(mt,{facetKey:t,sliced:!0,header:{value:o,groups:i,total:a},rows:$,colors:r,stateLabel:d,onOpen:u,onTarget:m,hasMore:((C=j.data)==null?void 0:C.overflow)??!1})}function Zt({facetKey:t,rows:s,colors:o,stateLabel:i,onOpen:a,emptyText:c}){return e.jsx(mt,{facetKey:t,sliced:!1,rows:s,colors:o,stateLabel:i,onOpen:a,emptyText:c})}const Se="entity-timeline",Xt=300,Ie=12;function Jt({entityKey:t,periodHours:s,roles:o,find:i,onFindChange:a,entityValue:c,onEntityChange:n,sliceKey:r=null,onSliceKeyChange:d,sliceValue:u=null,onSliceValueChange:m}){var pe,ke,$e,K,He;const w=ze(s),j=tt(),f=r??"",q=!!f,k=q&&!!u,P=q&&!u,[$,C]=h.useState(0),[b,F]=h.useState(Yt);h.useEffect(()=>{C(0)},[i,w.from,w.to,t,f,u,b]);const[L,v]=h.useState(i??""),E=h.useRef(void 0);h.useEffect(()=>()=>clearTimeout(E.current),[]),h.useEffect(()=>{v(i??"")},[i]);const Y=p=>{v(p),clearTimeout(E.current),E.current=setTimeout(()=>{const M=p.trim();a(M||null)},Xt)},g=h.useMemo(()=>{const p=new Map;for(const M of o)p.set(M.role,we(M));return p},[o]),_=p=>p==null?"—":g.get(p)??p,z=B({query:{entity:t},groupBy:{state:!0},measure:{kind:"dwell",window:w},orderBy:[{field:"dwellSeconds",direction:"desc"}]}),G=B({query:{entity:t},groupBy:{state:!0},measure:{kind:"membership"}}),fe=B({query:{entity:t},groupBy:{},measure:{kind:"membership"},distinctBy:t}),T=B(q?{query:{entity:t},groupBy:{state:!0,facets:[f]},measure:{kind:"dwell",window:w},limit:200}:null),R=B(!P?{query:{entity:t,...k?{equals:{[f]:u}}:{},...i?{prefix:{[t]:i}}:{}},groupBy:{facets:[t]},measure:{kind:"dwell",window:w},orderBy:[{field:"dwellSeconds",direction:"desc"}],limit:b,offset:$*b}:null),se=h.useMemo(()=>{var p;return ct(((p=R==null?void 0:R.data)==null?void 0:p.groups)??[],t)},[R==null?void 0:R.data,t]),X=se.length?{entity:t,anyOf:se.map(p=>({[t]:p}))}:null,xe=B(X?{query:X,groupBy:{state:!0,facets:[t]},measure:{kind:"dwell",window:w},limit:b*10}:null),ne=B(X?{query:X,groupBy:{state:!0,facets:[t]},measure:{kind:"membership"}}:null),ue=h.useMemo(()=>{var p,M,Z;return dt(((p=R==null?void 0:R.data)==null?void 0:p.groups)??[],((M=xe.data)==null?void 0:M.groups)??[],((Z=ne.data)==null?void 0:Z.groups)??[],t)},[R==null?void 0:R.data,xe.data,ne.data,t]),V=h.useRef(()=>{}),l=h.useRef(p=>V.current(p)).current,S=h.useRef(null),O=h.useRef(!1);h.useEffect(()=>{j&&c!==S.current&&(S.current=c,c?j.setPanel(e.jsx(We,{facetKey:t,value:c,entity:t,intervalColor:l}),{key:Se,width:420}):(O.current=!1,j.closePanel(Se)))},[c,t,j]),h.useEffect(()=>{if(!(!j||!c)){if(j.open&&j.ownerKey===Se){O.current=!0;return}O.current&&(O.current=!1,n(null))}},[j,c,n]);const U=h.useRef(j);U.current=j,h.useEffect(()=>()=>{var p;S.current&&((p=U.current)==null||p.closePanel(Se))},[]);const{data:A}=St(),J=h.useMemo(()=>((A==null?void 0:A.keys)??[]).filter(p=>p!==t),[A,t]),W=(((pe=z.data)==null?void 0:pe.groups)??[]).filter(p=>(p.dwellSeconds??0)>0),D=h.useMemo(()=>{var p;return nt([...W,...((p=G.data)==null?void 0:p.groups)??[]].map(M=>({label:M.state??"—",weight:M.dwellSeconds??M.count??0})))},[W,G.data]),ae=new Map((((ke=G.data)==null?void 0:ke.groups)??[]).map(p=>[p.state??"—",p.count??0])),me=((K=($e=fe.data)==null?void 0:$e.groups[0])==null?void 0:K.count)??null,ye=h.useMemo(()=>new Set(o.filter(p=>p.entity_state_source==="subtype").map(p=>p.role)),[o]);V.current=p=>{const M=ye.has(p.role)?p.subtype??p.role:p.role;return D.get(M)};const re=h.useMemo(()=>{var p;return q?Gt(((p=T.data)==null?void 0:p.groups)??[],f,Ie):[]},[q,T.data,f]),Q=h.useMemo(()=>{var M;const p=new Set;for(const Z of((M=T.data)==null?void 0:M.groups)??[])(Z.dwellSeconds??0)>0&&Z.facets[f]!=null&&p.add(Z.facets[f]);return p.size},[T.data,f]),ve=h.useMemo(()=>{var M;if(!k)return{groups:[],total:0};const p=(((M=T.data)==null?void 0:M.groups)??[]).filter(Z=>Z.facets[f]===u);return{groups:p,total:Ee(p)}},[k,T.data,f,u]),x=((He=R==null?void 0:R.data)==null?void 0:He.overflow)??!1,N=Le(R==null?void 0:R.error),y=q&&Le(T.error);return e.jsxs("div",{className:"flex-1 min-h-0 flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"shrink-0 px-2 pt-4 pb-3 flex items-start gap-6 border-b border-surface-border/40",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-4 mb-2.5",children:[e.jsxs("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:["Where the time went · ",e.jsx("span",{className:"normal-case font-mono",children:t})," system"]}),me!=null&&e.jsxs("p",{className:"text-2xs text-text-quaternary whitespace-nowrap",children:[e.jsx("span",{className:"text-xs font-mono font-semibold text-text-primary tabular-nums",children:me})," ",e.jsx("span",{className:"font-mono",children:t})," in queue now"]})]}),W.length>0?e.jsxs(e.Fragment,{children:[e.jsx(Oe,{groups:W,colors:D,height:"h-3"}),e.jsx("div",{className:"flex flex-wrap gap-x-5 gap-y-1 mt-2.5",children:W.map(p=>{const M=ae.get(p.state??"—")??0,Z=Math.round((p.dwellSeconds??0)/Ee(W)*100),kt=`${te((p.dwellSeconds??0)*1e3)} · ${Z}%${M>0?` · ${M} now`:""}`;return e.jsxs("span",{className:"flex items-center gap-1.5 text-2xs",title:kt,children:[e.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:D.get(p.state??"—")}}),e.jsx("span",{className:"font-mono text-text-secondary",children:_(p.state)})]},p.state)})})]}):e.jsx("p",{className:"text-2xs text-text-quaternary",children:"No tracked time in this window."})]}),e.jsxs("div",{className:"shrink-0 w-56 space-y-2.5",children:[e.jsxs("label",{className:"block",children:[e.jsx("span",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Slice by"}),e.jsxs("select",{value:f,onChange:p=>d==null?void 0:d(p.target.value||null),className:"select text-xs font-mono w-full",children:[e.jsx("option",{value:"",children:"— none —"}),J.map(p=>e.jsx("option",{value:p,children:p},p))]})]}),e.jsx("input",{type:"text",value:L,onChange:p=>Y(p.target.value),placeholder:`Find by ${t}…`,"aria-label":`Find by ${t}`,className:"w-full bg-transparent border-b border-surface-border/60 focus:border-accent focus:outline-none text-xs font-mono text-text-primary placeholder:text-text-quaternary pb-0.5 transition-colors"})]})]}),k&&e.jsxs("div",{className:"shrink-0 px-2 pt-3 flex items-center gap-3",children:[e.jsxs("button",{type:"button",onClick:()=>m==null?void 0:m(null),className:"inline-flex items-center gap-1 text-2xs text-accent hover:text-accent-hover transition-colors shrink-0",children:[e.jsx(Et,{className:"w-3 h-3"})," all ",f]}),e.jsx("span",{className:"font-mono text-xs text-text-primary shrink-0",children:u}),e.jsx(Oe,{groups:ve.groups,colors:D,height:"h-2",className:"flex-1 max-w-md"}),e.jsx("span",{className:"font-mono tabular-nums text-2xs text-text-tertiary shrink-0",children:te(ve.total*1e3)})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-auto px-2 py-4",children:P?y?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"Slicing requires full read access to the system's queues."}):re.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"No tracked time for this slice in the window."}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex gap-6 min-w-max",children:re.map(p=>e.jsx(Qt,{entityKey:t,sliceKey:f,value:p.value,headerGroups:p.groups,headerTotal:p.total,window:w,find:i,colors:D,stateLabel:_,onOpen:n,onTarget:M=>m==null?void 0:m(M)},p.value))}),Q>Ie&&e.jsxs("p",{className:"text-2xs text-text-quaternary pt-4",children:["Showing the top ",Ie," of ",Q," ",e.jsx("span",{className:"font-mono",children:f})," values — a facet this wide isn't a good slice dimension."]})]}):N?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The per-entity view requires full read access to the system's queues."}):e.jsx(Zt,{facetKey:t,rows:ue,colors:D,stateLabel:_,onOpen:n,emptyText:i?`No ${t} starts with “${i}” in this window.`:"No entities tracked in this window."})}),!P&&e.jsxs("div",{className:"shrink-0 border-t border-surface-border bg-surface/95 px-2 pt-2 pb-3 flex items-center gap-3 text-2xs",children:[e.jsx("button",{disabled:$===0,onClick:()=>C($-1),className:"text-text-tertiary hover:text-accent transition-colors disabled:opacity-40 disabled:hover:text-text-tertiary",children:"Prev"}),e.jsxs("span",{className:"font-mono tabular-nums text-text-quaternary",children:["page ",$+1]}),e.jsx("button",{disabled:!x,onClick:()=>C($+1),className:"text-text-tertiary hover:text-accent transition-colors disabled:opacity-40 disabled:hover:text-text-tertiary",children:"Next"}),e.jsxs("span",{className:"ml-auto flex items-center gap-1.5 text-text-quaternary",children:[e.jsx("span",{children:"per page"}),e.jsx("select",{value:b,onChange:p=>F(Number(p.target.value)),"aria-label":"Results per page",className:"select text-2xs font-mono py-0.5",children:Ht.map(p=>e.jsx("option",{value:p,children:p},p))})]})]})]})}function Kt({lenses:t,activeLens:s,stationCount:o,onSelect:i}){const[a,c]=h.useState(!1),n=h.useRef(null);h.useEffect(()=>{if(!a)return;const d=m=>{n.current&&!n.current.contains(m.target)&&c(!1)},u=m=>{m.key==="Escape"&&c(!1)};return document.addEventListener("mousedown",d),document.addEventListener("keydown",u),()=>{document.removeEventListener("mousedown",d),document.removeEventListener("keydown",u)}},[a]);const r=d=>{i(d),c(!1)};return e.jsxs("div",{ref:n,className:"relative",title:"View: the board station-first, or an entity system (roles sharing an entity facet) entity-first",children:[e.jsxs("button",{type:"button",onClick:()=>c(d=>!d),className:"group flex items-baseline gap-1.5","aria-expanded":a,"aria-haspopup":"listbox","aria-label":"Board view",children:[e.jsx("span",{className:"text-2xs uppercase tracking-widest text-text-quaternary",children:"View"}),e.jsx("span",{className:"text-xs font-medium text-text-primary group-hover:text-accent transition-colors",children:s?e.jsxs(e.Fragment,{children:["by ",e.jsx("span",{className:"font-mono",children:s})]}):"Stations"}),e.jsx(Ge,{className:`w-3 h-3 self-center shrink-0 text-text-tertiary group-hover:text-accent transition-transform ${a?"rotate-180":""}`,strokeWidth:1.5})]}),a&&e.jsxs("div",{role:"listbox",className:"absolute z-[100] top-full right-0 mt-1.5 min-w-[16rem] max-h-80 overflow-y-auto bg-surface-raised border border-surface-border rounded-md shadow-lg py-1",children:[e.jsx(pt,{label:"Stations",note:`${o} station${o===1?"":"s"}`,active:s===null,onClick:()=>r(null)}),t.map(d=>e.jsx(es,{lens:d,active:s===d,fetchCount:a,onClick:()=>r(d)},d))]})]})}function pt({label:t,note:s,active:o,onClick:i,mono:a}){return e.jsxs("button",{type:"button",role:"option","aria-selected":o,onClick:i,className:`w-full text-left px-3 py-1.5 flex items-baseline gap-2.5 transition-colors ${o?"text-accent bg-accent/5":"text-text-primary hover:bg-surface-hover"}`,children:[e.jsx("span",{className:`text-xs font-medium truncate ${a?"font-mono":""}`,children:t}),s&&e.jsx("span",{className:"ml-auto text-2xs font-mono text-text-quaternary tabular-nums shrink-0",children:s})]})}function es({lens:t,active:s,fetchCount:o,onClick:i}){var n,r;const c=(r=(n=B({query:{entity:t},groupBy:{},measure:{kind:"membership"},distinctBy:t},{enabled:o}).data)==null?void 0:n.groups[0])==null?void 0:r.count;return e.jsx(pt,{label:`by ${t}`,mono:!0,note:c!=null?`${c} in queue`:null,active:s,onClick:i})}const ht=800,ft=270,ie=28,ts=60,Ae=24,ss=72,Re=ht-ie-ts,De=ft-Ae-ss,H=Ae+De,Te=ie+Re,I="0.5s cubic-bezier(0.4, 0, 0.2, 1)",Ve=9;function ns(t){return`M ${(t.x-Ve).toFixed(1)} ${t.y.toFixed(1)} L ${(t.x+Ve).toFixed(1)} ${t.y.toFixed(1)}`}function ge(t){if(t.length===0)return"";if(t.length===1)return ns(t[0]);const s=[];for(let o=0;o<t.length-1;o++){const i=t[Math.max(0,o-1)],a=t[o],c=t[o+1],n=t[Math.min(t.length-1,o+2)],r=(a.x+(c.x-i.x)/6).toFixed(1),d=(a.y+(c.y-i.y)/6).toFixed(1),u=(c.x-(n.x-a.x)/6).toFixed(1),m=(c.y-(n.y-a.y)/6).toFixed(1);o===0&&s.push(`M ${a.x.toFixed(1)} ${a.y.toFixed(1)}`),s.push(`C ${r} ${d}, ${u} ${m}, ${c.x.toFixed(1)} ${c.y.toFixed(1)}`)}return s.join(" ")}function as(t,s){if(t.length<2||s.length<2)return"";const o=ge(t),i=[...s].reverse(),a=ge(i),c=a.slice(a.indexOf("C"));return`${o} L ${i[0].x.toFixed(1)} ${i[0].y.toFixed(1)} ${c} Z`}function Qe(t){return t>=1e4?`${Math.round(t/1e3)}k`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function qe(t){return t.length>0?t[t.length-1]:void 0}function rs(t){return[1,2,5,10,20,50,100,200,500,1e3,2e3,5e3,1e4,2e4,5e4].filter(o=>o>0&&o<t*.98)}function os(t){return[.25,.5,.75].map(o=>Math.round(o*t)).filter(o=>o>0)}const ce="rgb(var(--lt-status-claimed-graphic))",je="rgb(var(--lt-status-queued-graphic))",ee="rgb(var(--lt-status-success-graphic))",de="rgb(var(--lt-text-quaternary))",be="rgb(var(--lt-status-error))";function Be(t,s){return t.replace(/\)$/,` / ${s})`)}const ls=13;function is(t,s){const o=[...t].sort((n,r)=>n.y-r.y);let i=-1/0;const a=o.map(n=>{const r=Math.max(n.y+3,i+ls);return i=r,{...n,labelY:r}}),c=a.length>0?a[a.length-1].labelY-s:0;if(c>0)for(const n of a)n.labelY-=c;return a}function cs({stations:t,selectedRole:s,onSelect:o,onUpstreamSelect:i,onCmdClick:a,periodHours:c,logScale:n=!1,fill:r=!1}){const[d,u]=h.useState(null),m=t.length;if(m===0)return null;const w=l=>m===1?ie+Re/2:ie+l/(m-1)*Re,j=new Map(t.map((l,S)=>[l.role,w(S)])),f=t.map((l,S)=>{var A,J,W,D;const O=l.target_per_hour??null,U=O!=null?O*c:null;return{idx:S,x:w(S),expected:U,actual:((A=l.metric)==null?void 0:A.resolved)??0,active:((J=l.metric)==null?void 0:J.claimed)??0,pending:((W=l.metric)==null?void 0:W.pending)??0,priorityCount:((D=l.metric)==null?void 0:D.priority_count)??0}}),q=f.some(l=>l.expected!=null),P=Math.max(1,...f.map(l=>l.expected??0),...f.map(l=>l.actual),...f.map(l=>l.expected!=null?l.pending:0))*1.15,$=n?l=>{const S=Math.log(1+P);return Ae+De*(1-Math.log(1+Math.max(0,l))/S)}:l=>Ae+De*(1-Math.max(0,Math.min(l,P))/P),C=n?rs(P):os(P),b=f.filter(l=>l.expected!=null),F=b.map(l=>({...l,y:$(l.expected)})),L=b.map(l=>({...l,y:$(l.actual)})),v=b.map(l=>({...l,y:$(l.active)})),E=b.map(l=>({...l,y:$(l.pending)})),Y=ge(F),g=ge(L),_=ge(v),z=ge(E),G=qe(L),fe=qe(F),T=qe(v),Ne=qe(E),R=L.length>=2&&G?`${g} L ${G.x.toFixed(1)} ${H} L ${L[0].x.toFixed(1)} ${H} Z`:"",se=b.some(l=>l.pending>0||l.active>0),X=se&&v.length>=2&&T?`${_} L ${T.x.toFixed(1)} ${H} L ${v[0].x.toFixed(1)} ${H} Z`:"",xe=se?as(E,v):"",ne=b.some(l=>l.active>0),ue=b.some(l=>l.pending>l.active),V=is([fe?{key:"target",text:"Target",color:de,y:fe.y}:null,G?{key:"actual",text:"Resolved",color:ee,y:G.y}:null,ne&&T?{key:"active",text:"Claimed",color:ce,y:T.y}:null,ue&&Ne?{key:"queued",text:"Pending",color:je,y:Ne.y}:null].filter(Boolean),H+4);return e.jsxs("svg",{viewBox:`0 0 ${ht} ${ft}`,className:r?"w-full h-full":"w-full",preserveAspectRatio:"xMidYMid meet",style:{display:"block",...r?{}:{height:"auto"}},children:[C.map(l=>{const S=$(l);return e.jsxs("g",{children:[e.jsx("line",{x1:ie,y1:S,x2:Te,y2:S,className:"stroke-surface-border",strokeWidth:.5,opacity:n?.45:.3,strokeDasharray:n?"2 5":void 0,style:{transition:`y1 ${I}, y2 ${I}`}}),e.jsx("text",{x:ie-4,y:S+2.5,textAnchor:"end",fontSize:6,fontFamily:"ui-monospace, monospace",opacity:.35,className:"fill-text-quaternary",children:Qe(l)})]},`grid-${l}`)}),t.map(l=>{if(!l.parent_role)return null;const S=j.get(l.parent_role);if(S==null)return null;const O=w(t.findIndex(U=>U.role===l.role));return e.jsx("line",{x1:S,y1:H,x2:O,y2:H,className:"stroke-surface-border",strokeWidth:.75},`dep-${l.role}`)}),R&&e.jsx("path",{d:R,opacity:.05,style:{fill:ee,transition:`d ${I}`}}),X&&e.jsx("path",{d:X,opacity:.12,style:{fill:ce,transition:`d ${I}`}}),xe&&e.jsx("path",{d:xe,opacity:.12,style:{fill:je,transition:`d ${I}`}}),Y&&e.jsx("path",{d:Y,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.7,style:{stroke:de,transition:`d ${I}`}}),F.map(l=>e.jsxs("g",{transform:`translate(${l.x} ${l.y})`,style:{transition:`transform ${I}`},children:[e.jsx("circle",{r:2,opacity:.8,style:{fill:de}}),e.jsx("text",{y:-5,textAnchor:"middle",fontSize:6.5,fontFamily:"ui-monospace, monospace",fontWeight:"500",opacity:.7,style:{fill:de},children:Math.round(l.expected)})]},`tval-${l.idx}`)),se&&z&&e.jsx("path",{d:z,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.55,style:{stroke:je,transition:`d ${I}`}}),_&&e.jsx("path",{d:_,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.5,style:{stroke:ce,transition:`d ${I}`}}),g&&e.jsx("path",{d:g,fill:"none",strokeWidth:.6,strokeLinejoin:"round",strokeLinecap:"round",opacity:.65,style:{stroke:ee,transition:`d ${I}`}}),v.map((l,S)=>{if(l.pending<=0&&l.active<=0)return null;const O=Math.max(2.5,Math.min(5,2.5+l.active/10)),U=l.pending>l.active,A=Math.min(E[S].y-4,l.y-O-4);return e.jsxs("g",{children:[l.pending>0&&e.jsx("text",{x:l.x,y:A,textAnchor:"middle",fontSize:7.5,fontFamily:"ui-monospace, monospace",fontWeight:"600",style:{fill:U?je:"rgb(var(--lt-text-tertiary))",transition:`y ${I}`},children:l.pending}),e.jsxs("g",{transform:`translate(${l.x} ${l.y})`,style:{transition:`transform ${I}`},children:[e.jsx("circle",{r:O,opacity:.85,style:{fill:ce}}),l.active>0&&e.jsx("text",{y:O+9,textAnchor:"middle",fontSize:7.5,fontFamily:"ui-monospace, monospace",fontWeight:"600",style:{fill:ce},children:l.active})]})]},`active-${l.idx}`)}),f.map(l=>{var re;const S=t[l.idx],O=l.x,U=l.expected!=null?$(l.actual):H,A=Math.max(2.25,Math.min(4,2.25+l.actual/160)),J=S.role===s,W=d===l.idx,D=l.expected==null?"idle · set a target rate to plot pace":`${l.actual} resolved · target ${Math.round(l.expected)}`+(l.pending>l.active?` · ${l.pending-l.active} pending`:"")+(l.active>0?` · ${l.active} claimed`:"")+(l.priorityCount>0?` · ${l.priorityCount} in jeopardy`:""),ae=D.length*5.5+20,me=Math.max(ie+ae/2+4,Math.min(Te-ae/2-4,O)),ye=U-A-10;return e.jsxs("g",{onClick:Q=>{Q.metaKey||Q.ctrlKey?(Q.stopPropagation(),a==null||a(S.role)):o(S.role)},onMouseEnter:()=>u(l.idx),onMouseLeave:()=>u(null),style:{cursor:"pointer"},children:[e.jsxs("g",{transform:`translate(${O} ${U})`,style:{transition:`transform ${I}`},children:[e.jsx("circle",{r:22,fill:"transparent"}),e.jsx("circle",{r:A,opacity:.9,style:{fill:ee,transition:`r ${I}`}}),l.expected!=null&&e.jsx("text",{y:-A-5,textAnchor:"middle",fontSize:9.5,fontFamily:"ui-monospace, monospace",fontWeight:"500",style:{fill:ee},children:Qe(l.actual)}),W&&!J&&e.jsx("circle",{r:A+3,fill:"none",strokeWidth:1,opacity:.4,style:{stroke:ee}}),J&&e.jsx("circle",{r:A+4,fill:"none",className:"stroke-accent",strokeWidth:2})]}),(((re=S.upstream_roles)==null?void 0:re.length)??0)>0&&e.jsxs("g",{transform:`translate(${O-20} ${H})`,onClick:Q=>{Q.stopPropagation(),i==null||i(S.upstream_roles[0])},style:{cursor:"pointer"},children:[e.jsx("title",{children:`Fed by ${S.upstream_roles.join(", ")} — click to view that sequence`}),e.jsx("circle",{r:9,cy:-6,fill:"transparent"}),e.jsx("path",{d:"M -7 -14 C -3 -14 -1 -9 0 -2",fill:"none",className:"stroke-text-quaternary",strokeWidth:1,strokeDasharray:"2 2",strokeLinecap:"round"}),e.jsx("path",{d:"M 0 -2 L 8 -2",className:"stroke-text-quaternary",strokeWidth:1,strokeLinecap:"round"}),e.jsx("path",{d:"M 8 -2 l -3.5 -2 v 4 z",className:"fill-text-quaternary"})]}),e.jsx("text",{x:O,y:H+(l.idx%2===0?14:27),textAnchor:"middle",fontSize:9.5,className:"fill-text-tertiary",fontFamily:"ui-sans-serif, sans-serif",fontWeight:"500",children:we(S)}),W&&e.jsxs("g",{children:[e.jsx("rect",{x:me-ae/2,y:ye-16,width:ae,height:19,rx:3,className:"fill-text-primary",opacity:.88}),e.jsx("text",{x:me,y:ye-3,textAnchor:"middle",fontSize:8.5,className:"fill-surface",fontFamily:"ui-monospace, monospace",children:D})]})]},S.role)}),!q&&e.jsx("text",{x:ie+Re/2,y:H+48,textAnchor:"middle",fontSize:8.5,className:"fill-text-quaternary",fontFamily:"ui-sans-serif, sans-serif",children:"Set target_per_hour on each role in Admin → Roles to enable the pace chart"}),V.map(l=>e.jsx("text",{x:Te+6,y:l.labelY,fontSize:8,fontFamily:"ui-sans-serif, sans-serif",fontWeight:l.key==="actual"?700:500,opacity:l.key==="active"?.85:1,style:{fill:l.color,transition:`y ${I}`},children:l.text},l.key))]})}function yt(t){const s=t.priority_facet?`metadata.${t.priority_facet}`:"created_at",o=JSON.stringify([{field:s,direction:"asc"}]);return`/escalations/available?role=${encodeURIComponent(t.role)}&jeopardy=1&view=table&orderBy=${encodeURIComponent(o)}`}function ds({role:t,periodHours:s,onOpenEntity:o}){var C,b,F,L,v,E,Y;const i=ze(s),a=t.entity_facet,[c,n]=h.useState(!1),[,r]=it(),d=()=>{a&&r(g=>{const _=new URLSearchParams(g);return _.set("lens",a),_})},u=B({query:{roles:[t.role]},groupBy:{columns:["subtype"]},measure:{kind:"dwell",window:i},orderBy:[{field:"dwellSeconds",direction:"desc"}]}),m=B({query:{roles:[t.role]},groupBy:{columns:["subtype"]},measure:{kind:"membership"},orderBy:[{field:"count",direction:"desc"}]}),w=B(a?{query:{roles:[t.role]},groupBy:{},measure:{kind:"membership"},distinctBy:a}:null),j=B(a&&c?{query:{roles:[t.role],exists:[a]},groupBy:{facets:[a]},measure:{kind:"dwell",window:i},orderBy:[{field:"dwellSeconds",direction:"desc"}],limit:8}:null),f=h.useMemo(()=>{var g,_;return at([...((g=u.data)==null?void 0:g.groups)??[],...((_=m.data)==null?void 0:_.groups)??[]])},[u.data,m.data]);if(Le(u.error))return e.jsx("div",{className:"border-t border-surface-border/40 pt-4 mt-5",children:e.jsx("p",{className:"text-2xs text-text-quaternary",children:"Analytics require full read access to this station's queue."})});const q=(((C=u.data)==null?void 0:C.groups)??[]).filter(g=>(g.dwellSeconds??0)>0),k=q.reduce((g,_)=>g+(_.dwellSeconds??0),0),P=(((b=m.data)==null?void 0:b.groups)??[]).filter(g=>(g.count??0)>0),$=((L=(F=w.data)==null?void 0:F.groups[0])==null?void 0:L.count)??null;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"border-t border-surface-border/40 pt-4 mt-5",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2.5",children:"Where the time went"}),k>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"h-2 flex rounded-full overflow-hidden bg-surface-sunken mb-2.5",children:q.map(g=>e.jsx("div",{style:{width:`${(g.dwellSeconds??0)/k*100}%`,backgroundColor:f.get(he(g.subtype))}},he(g.subtype)))}),e.jsx("div",{className:"space-y-1",children:q.map(g=>e.jsxs("div",{className:"flex items-center gap-2 text-2xs",children:[e.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:f.get(he(g.subtype))}}),e.jsx("span",{className:`font-mono truncate flex-1 ${g.subtype?"text-text-secondary":"text-text-tertiary"}`,children:Pe(g.subtype)}),e.jsx("span",{className:"font-mono tabular-nums text-text-secondary shrink-0",children:te((g.dwellSeconds??0)*1e3)}),e.jsxs("span",{className:"font-mono tabular-nums text-text-quaternary w-8 text-right shrink-0",children:[Math.round((g.dwellSeconds??0)/k*100),"%"]})]},he(g.subtype)))}),((v=u.data)==null?void 0:v.overflow)&&e.jsx("p",{className:"text-2xs text-text-quaternary mt-1.5",children:"more groups exist — narrow the window"})]}):e.jsx("p",{className:"text-2xs text-text-quaternary",children:"No tracked time in this window."})]}),e.jsxs("div",{className:"border-t border-surface-border/40 pt-4 mt-5",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2.5",children:"In queue now"}),a&&$!=null&&e.jsxs("button",{onClick:d,className:"group flex items-center gap-1 text-2xs mb-2 text-left",title:`Open the ${a} lens — the whole system, entity-first`,children:[e.jsx("span",{className:"text-xs font-mono font-semibold text-text-primary tabular-nums",children:$})," ",e.jsx("span",{className:"font-mono text-text-tertiary group-hover:text-accent transition-colors",children:a}),e.jsx("span",{className:"text-text-quaternary",children:" in queue"}),e.jsx(Ot,{className:"w-3 h-3 text-text-quaternary group-hover:text-accent transition-colors"})]}),P.length>0?e.jsx("div",{className:"space-y-1",children:P.map(g=>e.jsxs("div",{className:"flex items-center gap-2 text-2xs",children:[e.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:f.get(he(g.subtype))}}),e.jsx("span",{className:`font-mono truncate flex-1 ${g.subtype?"text-text-secondary":"text-text-tertiary"}`,children:Pe(g.subtype)}),e.jsx("span",{className:"font-mono tabular-nums text-text-primary shrink-0",children:g.count})]},he(g.subtype)))}):e.jsx("p",{className:"text-2xs text-text-quaternary",children:"Queue clear."}),a&&e.jsxs("div",{className:"mt-3",children:[e.jsxs("button",{onClick:()=>n(g=>!g),className:"flex items-center gap-1 text-2xs text-text-tertiary hover:text-accent transition-colors",children:[c?e.jsx(Ge,{className:"w-3 h-3"}):e.jsx(At,{className:"w-3 h-3"}),"By entity"]}),c&&(Le(j.error)?e.jsx("p",{className:"text-2xs text-text-quaternary mt-1.5",children:"Requires full read access to this station's queue."}):e.jsxs("div",{className:"space-y-1 mt-1.5",children:[(((E=j.data)==null?void 0:E.groups)??[]).map(g=>{const _=g.facets[a];return _==null?null:e.jsxs("div",{className:"flex items-center gap-2 text-2xs",children:[e.jsx("span",{className:"font-mono truncate flex-1 text-text-secondary",title:_,children:_}),e.jsx("span",{className:"font-mono tabular-nums text-text-secondary shrink-0",children:te((g.dwellSeconds??0)*1e3)}),e.jsx("button",{className:"icon-link shrink-0",title:"Open timeline",onClick:()=>o(a,_),children:e.jsx(rt,{className:"w-3 h-3"})})]},_)}),j.data&&j.data.groups.length===0&&e.jsx("p",{className:"text-2xs text-text-quaternary",children:"No entities in this window."}),((Y=j.data)==null?void 0:Y.overflow)&&e.jsx("p",{className:"text-2xs text-text-quaternary",children:"top 8 by dwell"})]}))]})]})]})}const gt=["15m","1h","24h","7d","30d"],xs=t=>gt.includes(t),us={"15m":.25,"1h":1,"24h":24,"7d":168,"30d":720};function Me(t){if(t==null)return"—";if(t<1){const s=Math.round(t*60);return s<=0?"< 1s":`${s}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function Ce({label:t,value:s}){return e.jsxs("div",{className:"flex items-center justify-between py-1.5",children:[e.jsx("span",{className:"text-2xs text-text-tertiary uppercase tracking-wider",children:t}),e.jsx("span",{className:"text-xs font-mono font-medium text-text-primary tabular-nums",children:s})]})}function ms({period:t,onChange:s}){return e.jsx("div",{className:"flex items-center gap-1 mb-4",children:gt.map(o=>e.jsx("button",{onClick:()=>s(o),className:`px-2 py-0.5 text-2xs font-mono rounded transition-colors ${t===o?"bg-accent/10 text-accent font-semibold":"icon-link"}`,children:o},o))})}function ps({role:t,globalPeriod:s,onClose:o}){const[i,a]=h.useState(xs(s)?s:"24h"),{data:c}=st(i),n=c==null?void 0:c.stations.find(j=>j.role===t.role),r=t.sla_minutes??void 0,d=t.target_per_hour??void 0,u=t.worker_count??void 0,m=tt(),w=h.useCallback((j,f)=>{m==null||m.setPanel(t.entity_facet?e.jsx(We,{facetKey:j,value:f,entity:t.entity_facet}):e.jsx(We,{facetKey:j,value:f,role:t.role}),{key:"entity-timeline",width:420})},[m,t.role,t.entity_facet]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-baseline gap-1.5 flex-wrap",children:[e.jsx("span",{className:"text-sm font-bold text-text-primary",children:we(t)}),e.jsx("span",{className:"text-2xs font-mono text-text-secondary",children:t.role})]}),t.description&&e.jsx("p",{className:"text-2xs text-text-tertiary mt-1 line-clamp-2 leading-relaxed",children:t.description})]}),e.jsx("button",{onClick:o,className:"icon-link mt-0.5 shrink-0 ml-2",children:e.jsx(Bt,{className:"w-4 h-4"})})]}),n&&n.priority_count>0&&e.jsxs(le,{to:yt(t),className:"flex items-center justify-between group mb-4",children:[e.jsxs("span",{className:"text-2xs",style:{color:be},children:[n.priority_count," in jeopardy — pull oldest first"]}),e.jsx(Ft,{className:"w-3 h-3 transition-colors",style:{color:be}})]}),e.jsx(ms,{period:i,onChange:a}),(d||r||u)&&e.jsxs("div",{className:"flex items-center gap-6 mb-6 text-2xs border-b border-surface-border/30 pb-5",children:[d&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[d,"/h"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"target"})]}),r&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[r,"m"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"SLA"})]}),u&&e.jsxs("div",{children:[e.jsx("div",{className:"font-mono font-semibold text-text-primary text-sm",children:u}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"workers"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 mb-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-2",children:"Wait (queue)"}),e.jsx(Ce,{label:"P99",value:Me((n==null?void 0:n.wait.p99)??null)}),e.jsx(Ce,{label:"avg",value:Me((n==null?void 0:n.wait.avg)??null)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-2",children:"Work (proc.)"}),e.jsx(Ce,{label:"P99",value:Me((n==null?void 0:n.work.p99)??null)}),e.jsx(Ce,{label:"avg",value:Me((n==null?void 0:n.work.avg)??null)})]})]}),r&&e.jsx("div",{className:"border-t border-surface-border/40 pt-4 mt-5",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-tertiary",children:"SLA target"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[r,"m"]})]})}),e.jsx(ds,{role:t,periodHours:us[i],onOpenEntity:w})]})}function hs({allMetrics:t,orderedRoles:s,period:o}){const i=t.reduce((u,m)=>u+m.pending,0),a=t.reduce((u,m)=>u+m.resolved,0),c=t.reduce((u,m)=>u+m.priority_count,0),n=new Map(t.map(u=>[u.role,u])),r=t.filter(u=>u.priority_count>0).length,d=t.filter(u=>u.pending>0).length;return e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-3",children:["Pipeline · ",o]}),e.jsx("div",{className:"mb-4",children:r>0?e.jsxs("p",{className:"text-2xs",style:{color:be},children:[r," station",r>1?"s":""," with items in jeopardy"]}):d>0?e.jsxs("p",{className:"text-2xs text-status-warning",children:[d," station",d>1?"s":""," with backlog"]}):a>0?e.jsx("p",{className:"text-2xs text-status-success",children:"Flowing — queue clear"}):e.jsx("p",{className:"text-2xs text-text-quaternary",children:"Quiet — awaiting work"})}),e.jsxs("div",{className:"space-y-1.5 mb-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:"Pending"}),e.jsx("span",{className:`text-xs font-mono tabular-nums ${i>0?"text-text-primary font-semibold":"text-text-quaternary"}`,children:i})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:["Resolved · ",o]}),e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:a})]}),c>0&&e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:"Priority"}),e.jsx("span",{className:"text-xs font-mono tabular-nums font-semibold",style:{color:be},children:c})]})]}),e.jsx("div",{className:"border-t border-surface-border/40 pt-2 mb-1",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider flex-1",children:"Station"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"pend"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"clmd"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"res"})]})}),e.jsx("div",{className:"space-y-0.5",children:s.map(u=>{const m=n.get(u.role),w=(m==null?void 0:m.pending)??0,j=(m==null?void 0:m.claimed)??0,f=(m==null?void 0:m.resolved)??0,q=(m==null?void 0:m.priority_count)??0,k=u.title||u.role,P=q>0,$=w>0;return e.jsxs("div",{className:"flex items-center gap-2 py-0.5",children:[e.jsx("span",{className:`text-2xs font-mono flex-1 truncate ${$?"text-text-primary":"text-text-quaternary"}`,title:k,children:k}),e.jsx("span",{className:"text-[0.625rem] leading-none font-semibold tabular-nums w-4 text-right shrink-0",style:{color:be},title:P?`${q} priority — pull oldest first`:void 0,children:P?q:""}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${$?"text-text-primary font-semibold":"text-text-quaternary"}`,children:w>0?w:"—"}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${j>0?"text-accent font-semibold":"text-text-quaternary"}`,children:j>0?j:"—"}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${f>0?"text-text-secondary":"text-text-quaternary"}`,children:f>0?f:"—"})]},u.role)})}),e.jsx("p",{className:"text-2xs text-text-quaternary mt-5",children:"Select a station for queue detail."})]})}function fs({role:t,allMetrics:s,orderedRoles:o,globalPeriod:i,mixGroups:a,onClose:c}){return e.jsx("div",{className:"w-[280px] shrink-0 px-7 py-10 flex flex-col overflow-y-auto min-h-0",children:t?e.jsx(ps,{role:t,globalPeriod:i,onClose:c}):e.jsxs(e.Fragment,{children:[e.jsx(hs,{allMetrics:s,orderedRoles:o,period:i}),e.jsx(ys,{mixGroups:a,orderedRoles:o})]})})}function ys({mixGroups:t,orderedRoles:s}){const o=new Set(s.map(r=>r.role)),i=(t??[]).filter(r=>r.role&&o.has(r.role)&&(r.dwellSeconds??0)>0);if(i.length===0)return null;const a=new Map(s.map(r=>[r.role,r.title||r.role])),c=Ze(i,r=>r.role),n=Ze(i,r=>Pe(r.subtype));return e.jsxs(e.Fragment,{children:[e.jsx(Xe,{label:"Time by station",entries:c,display:r=>a.get(r)??r}),e.jsx(Xe,{label:"Time by subtype",entries:n,display:r=>r})]})}function Ze(t,s){const o=new Map;for(const i of t){const a=s(i);o.set(a,(o.get(a)??0)+(i.dwellSeconds??0))}return[...o.entries()].sort(([,i],[,a])=>a-i)}function Xe({label:t,entries:s,display:o}){const i=nt(s.map(([c,n])=>({label:c,weight:n}))),a=s.reduce((c,[,n])=>c+n,0)||1;return e.jsxs("div",{className:"border-t border-surface-border/40 pt-4 mt-5",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2.5",children:t}),e.jsx("div",{className:"h-2 flex rounded-full overflow-hidden bg-surface-sunken mb-2",children:s.map(([c,n])=>e.jsx("div",{style:{width:`${n/a*100}%`,backgroundColor:i.get(c)}},c))}),e.jsxs("div",{className:"space-y-0.5",children:[s.slice(0,6).map(([c,n])=>e.jsxs("div",{className:"flex items-center gap-2 text-2xs",children:[e.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:i.get(c)}}),e.jsx("span",{className:"font-mono text-text-secondary truncate flex-1",children:o(c)}),e.jsx("span",{className:"font-mono tabular-nums text-text-tertiary shrink-0",children:te(n*1e3)}),e.jsxs("span",{className:"font-mono tabular-nums text-text-quaternary w-8 text-right shrink-0",children:[Math.round(n/a*100),"%"]})]},c)),s.length>6&&e.jsxs("p",{className:"text-2xs text-text-quaternary",children:["+",s.length-6," more"]})]})]})}const gs=de,Fe=Be(de,.09),jt=Fe,bt=Fe,wt=Be(je,.15),Nt=Be(ce,.15),vt=Be(ee,.15),js=["15m","1h","24h","7d","30d"],_e={"15m":.25,"1h":1,"24h":24,"7d":168,"30d":720};function Ue(t){const s=t.filter(n=>n.ops_visible),o=new Map(s.map(n=>[n.role,n])),i=new Set,c=s.filter(n=>!n.parent_role||!o.has(n.parent_role)).map(n=>{const r=[],d=[{role:n,depth:0}];for(;d.length>0;){const u=d.shift();i.has(u.role.role)||(i.add(u.role.role),r.push(u),s.filter(m=>m.parent_role===u.role.role&&!i.has(m.role)).forEach(m=>d.push({role:m,depth:u.depth+1})))}return{origin:n,stations:r}});return s.filter(n=>!i.has(n.role)).forEach(n=>c.push({origin:n,stations:[{role:n,depth:0}]})),c.sort((n,r)=>r.stations.length-n.stations.length||n.origin.role.localeCompare(r.origin.role))}function Je(t){if(t==null)return"—";if(t<1){const s=Math.round(t*60);return s<=0?"< 1s":`${s}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function bs(t,s){if(!s||t===0)return{pct:null,color:"bg-surface-border"};const o=t/s,i=Math.round(o*100),a=o>1?"bg-status-warning":o<.2?"bg-status-draft":"bg-status-success";return{pct:i,color:a}}function Ke({value:t,onSave:s}){const[o,i]=h.useState(t!=null?String(t):""),a=h.useRef(void 0),c=n=>{const r=parseInt(n,10);s(!n.trim()||isNaN(r)||r<0?null:r)};return e.jsx("input",{type:"number",min:0,step:1,value:o,onChange:n=>{const r=n.target.value;i(r),clearTimeout(a.current),a.current=setTimeout(()=>c(r),400)},onBlur:n=>{clearTimeout(a.current),c(n.target.value)},onClick:n=>n.stopPropagation(),onKeyDown:n=>n.stopPropagation(),className:"w-full bg-transparent text-xs font-mono tabular-nums text-right focus:outline-none"})}function ws({role:t,metric:s,mixGroups:o,mixColors:i,selected:a,periodHours:c,onClick:n}){var L;const r=Mt(),{isBuilder:d,isOps:u}=Ct(),m=(s==null?void 0:s.pending)??0,w=(s==null?void 0:s.claimed)??0,j=(s==null?void 0:s.resolved)??0,f=(s==null?void 0:s.priority_count)??0,q=t.target_per_hour??null,{pct:k,color:P}=bs(m,q),$=k!=null?Math.min(100,k):0,C=ks(t.target_per_hour??null,t.sla_minutes??null,m,c),b=v=>r.mutate({role:t.role,target_per_hour:v}),F=v=>r.mutate({role:t.role,sla_minutes:v});return e.jsxs("tr",{tabIndex:0,onClick:n,onKeyDown:v=>{v.key==="Enter"&&n()},className:`cursor-pointer border-b border-surface-border/30 last:border-b-0 transition-colors ${a?"border-l-2 !border-l-accent":""}`,children:[e.jsx("td",{className:"pl-3 pr-2 py-1.5 overflow-hidden",children:e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("span",{className:"font-bold text-text-primary truncate text-xs",children:we(t)}),(((L=t.upstream_roles)==null?void 0:L.length)??0)>0&&e.jsx("span",{title:`Fed by ${t.upstream_roles.join(", ")}`,className:"shrink-0 leading-none",children:e.jsx(Tt,{className:"w-3 h-3 text-text-quaternary"})})]})}),e.jsx("td",{className:"hidden xl:table-cell pr-2 py-1.5 overflow-hidden",children:e.jsx("span",{className:"block font-mono text-2xs text-text-tertiary truncate",children:t.role})}),e.jsx("td",{className:"px-2 py-1.5",style:{backgroundColor:Fe},children:e.jsx(Ke,{value:t.target_per_hour??null,onSave:b})}),e.jsx("td",{className:"px-2 py-1.5",style:{backgroundColor:jt},children:e.jsx(Ke,{value:t.sla_minutes??null,onSave:F})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:bt},title:C!=null?`~${C} concurrent worker${C===1?"":"s"} to sustain ${t.target_per_hour}/h within ${t.sla_minutes}m SLA`:void 0,children:e.jsx("span",{className:`text-xs font-mono tabular-nums ${C!=null?"":"text-text-quaternary"}`,children:C??"—"})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:wt},children:e.jsx(le,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=available`,className:`text-xs font-mono tabular-nums hover:underline ${m>0?"text-text-primary font-semibold":"text-text-quaternary"}`,onClick:v=>v.stopPropagation(),children:m})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:Nt},children:e.jsx(le,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=claimed`,className:`text-xs font-mono tabular-nums hover:underline ${w>0?"font-semibold":"text-text-quaternary"}`,style:w>0?{color:ce}:void 0,onClick:v=>v.stopPropagation(),children:w})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:vt},children:e.jsx(le,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=resolved`,className:`text-xs font-mono tabular-nums hover:underline ${j>0?"text-text-secondary":"text-text-quaternary"}`,style:j>0?{color:ee}:void 0,onClick:v=>v.stopPropagation(),children:j})}),e.jsx("td",{className:"hidden xl:table-cell px-2 py-1.5 text-right",children:e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:Je((s==null?void 0:s.wait.p99)??null)})}),e.jsx("td",{className:"hidden xl:table-cell px-2 py-1.5 text-right",children:e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:Je((s==null?void 0:s.work.p99)??null)})}),e.jsx("td",{className:"hidden lg:table-cell px-2 py-1.5",children:e.jsx(zt,{groups:o,colors:i})}),e.jsx("td",{className:"hidden lg:table-cell px-2 py-1.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0",children:e.jsx("div",{className:`h-full rounded-full ${P}`,style:{width:`${$}%`}})}),e.jsx("span",{className:`text-2xs font-mono tabular-nums ${k!=null&&k>100?"text-status-warning font-semibold":"text-text-quaternary"}`,children:k!=null?`${k}%`:"—"})]})}),e.jsx("td",{className:"py-1.5",children:e.jsxs("div",{className:"flex items-center justify-center gap-1.5",children:[e.jsx(le,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=all`,className:"icon-link",title:"View all items in queue",onClick:v=>v.stopPropagation(),children:e.jsx(Wt,{className:"w-3.5 h-3.5"})}),e.jsx("span",{className:"w-3.5 flex items-center justify-center",children:(d||u)&&e.jsx(le,{to:`/admin/roles/${encodeURIComponent(t.role)}?section=pace-board`,className:"icon-link",title:"Configure this station",onClick:v=>v.stopPropagation(),children:e.jsx(Dt,{className:"w-3.5 h-3.5"})})}),e.jsx("span",{className:"w-3.5 flex items-center justify-center",children:f>0&&e.jsx(le,{to:yt(t),className:"text-status-error hover:opacity-70 transition-opacity",title:`${f} item${f===1?"":"s"} in jeopardy — pull oldest first`,onClick:v=>v.stopPropagation(),children:e.jsx(ot,{className:"w-3.5 h-3.5",strokeWidth:2})})})]})})]})}function et({n:t}){return t<=0?null:e.jsxs("span",{className:"inline-flex items-center gap-0.5 font-semibold tabular-nums",style:{color:be},title:`${t} in jeopardy`,children:[e.jsx(ot,{className:"w-3 h-3",strokeWidth:2.25}),t>9?"9+":t]})}function Ns({fragments:t,aggregates:s,activeOrigin:o,onSelect:i}){const[a,c]=h.useState(!1),n=h.useRef(null);h.useEffect(()=>{if(!a)return;const u=w=>{n.current&&!n.current.contains(w.target)&&c(!1)},m=w=>{w.key==="Escape"&&c(!1)};return document.addEventListener("mousedown",u),document.addEventListener("keydown",m),()=>{document.removeEventListener("mousedown",u),document.removeEventListener("keydown",m)}},[a]);const r=t.find(u=>u.origin.role===o)??t[0];if(!r)return null;const d=s.get(r.origin.role);return e.jsxs("div",{ref:n,className:"relative px-4 pt-2",children:[e.jsxs("button",{type:"button",onClick:()=>c(u=>!u),className:"group flex items-baseline gap-2.5","aria-expanded":a,"aria-haspopup":"listbox",children:[e.jsx("span",{className:"text-sm font-medium text-text-primary group-hover:text-accent transition-colors",children:we(r.origin)}),e.jsxs("span",{className:"text-2xs font-mono text-text-quaternary tabular-nums",children:[(d==null?void 0:d.stations)??r.stations.length," station",((d==null?void 0:d.stations)??r.stations.length)===1?"":"s"," · ",(d==null?void 0:d.pending)??0," pending"]}),e.jsx(et,{n:(d==null?void 0:d.jeopardy)??0}),e.jsx(Ge,{className:`w-3.5 h-3.5 self-center shrink-0 text-text-tertiary group-hover:text-accent transition-transform ${a?"rotate-180":""}`,strokeWidth:1.5})]}),a&&e.jsx("div",{role:"listbox",className:"absolute z-[100] top-full left-4 mt-1.5 min-w-[20rem] max-h-80 overflow-y-auto bg-surface-raised border border-surface-border rounded-md shadow-lg py-1",children:t.map(u=>{const m=s.get(u.origin.role),w=u.origin.role===r.origin.role;return e.jsxs("button",{type:"button",role:"option","aria-selected":w,onClick:()=>{i(u.origin.role),c(!1)},className:`w-full text-left px-3 py-1.5 flex items-baseline gap-2.5 transition-colors ${w?"text-accent bg-accent/5":"text-text-primary hover:bg-surface-hover"}`,children:[e.jsx("span",{className:"text-xs font-medium truncate",children:we(u.origin)}),e.jsxs("span",{className:"ml-auto text-2xs font-mono text-text-quaternary tabular-nums shrink-0",children:[(m==null?void 0:m.stations)??u.stations.length," st · ",(m==null?void 0:m.pending)??0," pending"]}),e.jsx("span",{className:"w-12 shrink-0 text-left text-2xs",children:e.jsx(et,{n:(m==null?void 0:m.jeopardy)??0})})]},u.origin.role)})})]})}const vs=[{label:"TARGET/H",band:Fe,hue:de,w:"w-[8%]"},{label:"SLA/M",band:jt,hue:gs,w:"w-[7%]"},{label:"WORKERS",band:bt,hue:de,w:"w-[8%]"},{label:"PENDING",band:wt,hue:je,w:"w-[8%]"},{label:"CLAIMED",band:Nt,hue:ce,w:"w-[8%]"},{label:"RESOLVED",band:vt,hue:ee,w:"w-[8%]"}];function ks(t,s,o,i){if(!t||!s)return null;const a=t*s/60,c=o>0?o*s/(60*i):0;return Math.ceil(a+c)}const oe="sticky top-0 z-10 bg-surface border-b border-surface-border py-1.5 text-2xs font-semibold uppercase tracking-wider whitespace-nowrap";function $s(){return e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{className:`${oe} pl-3 pr-2 text-left text-text-quaternary`,children:"NAME"}),e.jsx("th",{className:`${oe} hidden xl:table-cell w-[12%] pr-2 text-left text-text-quaternary`,children:"ROLE"}),vs.map(t=>e.jsx("th",{className:`${oe} ${t.w} px-2 text-right`,style:{color:t.hue,backgroundImage:`linear-gradient(${t.band}, ${t.band})`},children:t.label},t.label)),e.jsx("th",{className:`${oe} hidden xl:table-cell w-[8%] px-2 text-right text-text-quaternary`,children:"P99 WAIT"}),e.jsx("th",{className:`${oe} hidden xl:table-cell w-[8%] px-2 text-right text-text-quaternary`,children:"P99 WORK"}),e.jsx("th",{className:`${oe} hidden lg:table-cell w-[10%] px-2 text-left text-text-quaternary`,children:"MIX"}),e.jsx("th",{className:`${oe} hidden lg:table-cell w-[11%] px-2 text-left text-text-quaternary`,children:"TREND"}),e.jsx("th",{className:`${oe} w-20 px-1 text-center text-text-quaternary`,children:"ACTIONS"})]})})}function Ss(){var ve;const[t,s]=h.useState("1h"),[o,i]=h.useState(null),[a,c]=h.useState(!1),[n,r]=h.useState(!0);_t(),Rt();const{data:d,isLoading:u,refetch:m}=qt(),{data:w,isLoading:j,refetch:f}=st(t),q=(d==null?void 0:d.roles)??[],k=(w==null?void 0:w.stations)??[],P=h.useMemo(()=>{const x=new Map(k.map(y=>[y.role,y])),N=new Map;for(const y of Ue((d==null?void 0:d.roles)??[])){let pe=0,ke=0;for(const $e of y.stations){const K=x.get($e.role.role);pe+=(K==null?void 0:K.pending)??0,ke+=(K==null?void 0:K.priority_count)??0}N.set(y.origin.role,{stations:y.stations.length,pending:pe,jeopardy:ke})}return N},[k,d]),$=h.useMemo(()=>Ue(q),[q]),[C,b]=it(),F=C.get("fragment"),L=$.find(x=>x.origin.role===F)??$[0]??null,v=h.useCallback(x=>{i(null),b(N=>{const y=new URLSearchParams(N);return y.set("fragment",x),y})},[b]),E=(L==null?void 0:L.stations)??[],Y=h.useMemo(()=>new Set(E.map(({role:x})=>x.role)),[E]),g=ze(_e[t]),_=h.useMemo(()=>E.map(({role:x})=>x.role),[E]),{data:z}=B(_.length?{query:{roles:_},groupBy:{columns:["role","subtype"]},measure:{kind:"dwell",window:g}}:null),G=h.useMemo(()=>{const x=new Map;for(const N of(z==null?void 0:z.groups)??[]){if(!N.role)continue;const y=x.get(N.role)??[];y.push(N),x.set(N.role,y)}return x},[z]),fe=h.useMemo(()=>{const x=new Map;for(const[N,y]of G)x.set(N,at(y));return x},[G]),T=h.useMemo(()=>new Map,[]),Ne=h.useMemo(()=>k.filter(x=>Y.has(x.role)),[k,Y]),R=h.useMemo(()=>E.map(({role:x})=>({role:x.role,title:x.title,parent_role:x.parent_role,target_per_hour:x.target_per_hour??null,upstream_roles:x.upstream_roles??[],metric:k.find(N=>N.role===x.role)})),[E,k]),se=h.useCallback(x=>{const N=$.find(y=>y.stations.some(({role:pe})=>pe.role===x));N&&v(N.origin.role)},[$,v]),X=lt(),xe=((ve=E.find(({role:x})=>x.role===o))==null?void 0:ve.role)??null,ne=h.useMemo(()=>{const x=new Set;for(const N of q)N.ops_visible&&N.entity_facet&&x.add(N.entity_facet);return[...x].sort()},[q]),ue=C.get("lens"),V=ue&&ne.includes(ue)?ue:null,l=h.useCallback(x=>{i(null),b(N=>{const y=new URLSearchParams(N);return x?y.set("lens",x):y.delete("lens"),y.delete("entity"),y.delete("find"),y.delete("slice"),y.delete("sliceValue"),y})},[b]),S=C.get("entity"),O=C.get("find"),U=h.useCallback(x=>{b(N=>{const y=new URLSearchParams(N);return x?y.set("entity",x):y.delete("entity"),y})},[b]),A=h.useCallback(x=>{b(N=>{const y=new URLSearchParams(N);return x?y.set("find",x):y.delete("find"),y},{replace:!0})},[b]),J=C.get("slice"),W=C.get("sliceValue"),D=h.useCallback(x=>{b(N=>{const y=new URLSearchParams(N);return x?y.set("slice",x):y.delete("slice"),y.delete("sliceValue"),y})},[b]),ae=h.useCallback(x=>{b(N=>{const y=new URLSearchParams(N);return x?y.set("sliceValue",x):y.delete("sliceValue"),y})},[b]),me=u||j,ye=async()=>{c(!0),await Promise.all([m(),f()]),c(!1)},re=x=>i(N=>N===x?null:x),Q=e.jsx("div",{className:"flex items-center gap-0.5",children:js.map(x=>e.jsx("button",{onClick:()=>s(x),className:`px-2.5 py-1 text-2xs font-mono rounded transition-colors ${t===x?"bg-accent/10 text-accent font-semibold":"icon-link"}`,children:x},x))});return e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsx(Ut,{title:"Pace Board",docsHash:"#docs:dashboard.md:pace-board",center:Q,actions:e.jsx("button",{onClick:ye,disabled:a,className:"icon-link disabled:opacity-40",children:e.jsx(It,{className:`w-3.5 h-3.5 ${a?"animate-spin":""}`})})}),me?e.jsxs("div",{className:"animate-pulse space-y-6 mt-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-64 bg-surface-sunken rounded w-full"}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(x=>e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-full"},x))})]}):$.length===0?e.jsxs("div",{className:"mt-8",children:[e.jsx("p",{className:"text-sm text-text-secondary mb-2",children:"Stations appear here once roles are marked visible in Operations."}),e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Go to"," ",e.jsx(le,{to:"/admin/roles",className:"text-accent hover:underline",children:"Roles"})," ","and enable ",e.jsx("strong",{children:"Visible in Operations"})," on roles that represent pipeline stations."]})]}):e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsxs("div",{className:"flex items-end justify-between",children:[e.jsx("div",{className:"flex-1",children:!V&&$.length>1&&e.jsx(Ns,{fragments:$,aggregates:P,activeOrigin:(L==null?void 0:L.origin.role)??null,onSelect:v})}),ne.length>0&&e.jsx("div",{className:"px-4 pt-2 pb-0.5",children:e.jsx(Kt,{lenses:ne,activeLens:V,stationCount:E.length,onSelect:l})})]}),V?e.jsx(Jt,{entityKey:V,periodHours:_e[t],roles:q,find:O,onFindChange:A,entityValue:S,onEntityChange:U,sliceKey:J,onSliceKeyChange:D,sliceValue:W,onSliceValueChange:ae},V):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex-1 min-h-[40vh] flex items-stretch overflow-hidden",children:[e.jsxs("div",{className:"flex-1 min-w-0 min-h-0 flex flex-col overflow-hidden px-2 py-4",children:[e.jsx("div",{className:"flex items-center justify-center gap-0.5 pb-2 shrink-0",children:["lin","log"].map(x=>e.jsx("button",{onClick:()=>r(x==="log"),className:`px-2 py-0.5 text-2xs font-mono rounded transition-colors ${(n?"log":"lin")===x?"text-accent font-semibold":"icon-link"}`,title:x==="lin"?"Linear Y axis":"Logarithmic Y axis — reveals shape across wide value ranges",children:x},x))}),e.jsx("div",{className:"flex-1 min-h-0 flex flex-col justify-center overflow-hidden",children:e.jsx(cs,{stations:R,selectedRole:o,onSelect:re,onUpstreamSelect:se,onCmdClick:x=>X(`/escalations/available?role=${encodeURIComponent(x)}`),periodHours:_e[t],logScale:n})})]}),e.jsx("div",{className:"w-px bg-surface-border shrink-0 self-stretch"}),e.jsx(fs,{role:xe,allMetrics:Ne,orderedRoles:E.map(x=>x.role),globalPeriod:t,mixGroups:z==null?void 0:z.groups,onClose:()=>i(null)})]}),e.jsx("div",{className:"max-h-[30vh] flex-none overflow-y-auto border-t border-surface-border",children:e.jsxs("table",{className:"w-full table-fixed",children:[e.jsx($s,{}),e.jsx("tbody",{children:E.map(({role:x})=>e.jsx(ws,{role:x,metric:k.find(N=>N.role===x.role),mixGroups:G.get(x.role),mixColors:fe.get(x.role)??T,selected:o===x.role,periodHours:_e[t],onClick:()=>re(x.role)},x.role))})]})})]})]})]})}const Es=Object.freeze(Object.defineProperty({__proto__:null,OperationsPage:Ss,buildFragments:Ue},Symbol.toStringTag,{value:"Module"}));export{Es as O,cs as P,Ue as b,yt as j};
3
- //# sourceMappingURL=OperationsPage-CJXTw02Z.js.map