@hotmeshio/long-tail 0.30.0 → 0.30.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 (196) hide show
  1. package/dashboard/dist/assets/{AdminDashboard-Bjf_7-S6.js → AdminDashboard-CZIeiLe0.js} +2 -2
  2. package/dashboard/dist/assets/{AdminDashboard-Bjf_7-S6.js.map → AdminDashboard-CZIeiLe0.js.map} +1 -1
  3. package/dashboard/dist/assets/{AgentConfigPage-CEGk5Gbv.js → AgentConfigPage-DO3ATfCU.js} +2 -2
  4. package/dashboard/dist/assets/{AgentConfigPage-CEGk5Gbv.js.map → AgentConfigPage-DO3ATfCU.js.map} +1 -1
  5. package/dashboard/dist/assets/{AgentDetailPage-C52Oi1_f.js → AgentDetailPage-BWAlHQfB.js} +2 -2
  6. package/dashboard/dist/assets/{AgentDetailPage-C52Oi1_f.js.map → AgentDetailPage-BWAlHQfB.js.map} +1 -1
  7. package/dashboard/dist/assets/{AgentsPage-CohqxaWS.js → AgentsPage-Cs4IKeec.js} +2 -2
  8. package/dashboard/dist/assets/{AgentsPage-CohqxaWS.js.map → AgentsPage-Cs4IKeec.js.map} +1 -1
  9. package/dashboard/dist/assets/{AvailableEscalationsPage-DXpRnOVd.js → AvailableEscalationsPage-CiRxaing.js} +2 -2
  10. package/dashboard/dist/assets/{AvailableEscalationsPage-DXpRnOVd.js.map → AvailableEscalationsPage-CiRxaing.js.map} +1 -1
  11. package/dashboard/dist/assets/{BotPicker-DPglulL6.js → BotPicker-DGLkc9PQ.js} +2 -2
  12. package/dashboard/dist/assets/{BotPicker-DPglulL6.js.map → BotPicker-DGLkc9PQ.js.map} +1 -1
  13. package/dashboard/dist/assets/{BulkAssignModal-DWNR3FJJ.js → BulkAssignModal-C4LV8s0y.js} +2 -2
  14. package/dashboard/dist/assets/{BulkAssignModal-DWNR3FJJ.js.map → BulkAssignModal-C4LV8s0y.js.map} +1 -1
  15. package/dashboard/dist/assets/{CapabilitiesPage-ChBBD0IX.js → CapabilitiesPage-BLMMV3-W.js} +2 -2
  16. package/dashboard/dist/assets/{CapabilitiesPage-ChBBD0IX.js.map → CapabilitiesPage-BLMMV3-W.js.map} +1 -1
  17. package/dashboard/dist/assets/{CollapsibleSection-QAXKTYc6.js → CollapsibleSection-BAizcNCt.js} +2 -2
  18. package/dashboard/dist/assets/{CollapsibleSection-QAXKTYc6.js.map → CollapsibleSection-BAizcNCt.js.map} +1 -1
  19. package/dashboard/dist/assets/{ConfirmDeleteModal-J9xc_gVZ.js → ConfirmDeleteModal-DlNWHVxi.js} +2 -2
  20. package/dashboard/dist/assets/{ConfirmDeleteModal-J9xc_gVZ.js.map → ConfirmDeleteModal-DlNWHVxi.js.map} +1 -1
  21. package/dashboard/dist/assets/{ConnectedAppsPage-BKhsc_jJ.js → ConnectedAppsPage-D94kx0v3.js} +2 -2
  22. package/dashboard/dist/assets/{ConnectedAppsPage-BKhsc_jJ.js.map → ConnectedAppsPage-D94kx0v3.js.map} +1 -1
  23. package/dashboard/dist/assets/{CountdownTimer-C4hP64lF.js → CountdownTimer-CSdAwgwZ.js} +2 -2
  24. package/dashboard/dist/assets/{CountdownTimer-C4hP64lF.js.map → CountdownTimer-CSdAwgwZ.js.map} +1 -1
  25. package/dashboard/dist/assets/{CredentialsPage-DUfgsEbI.js → CredentialsPage-pOyC1GfC.js} +2 -2
  26. package/dashboard/dist/assets/{CredentialsPage-DUfgsEbI.js.map → CredentialsPage-pOyC1GfC.js.map} +1 -1
  27. package/dashboard/dist/assets/{CronLabel-CBc3Tvau.js → CronLabel-BVlOOcyo.js} +2 -2
  28. package/dashboard/dist/assets/{CronLabel-CBc3Tvau.js.map → CronLabel-BVlOOcyo.js.map} +1 -1
  29. package/dashboard/dist/assets/{ElapsedCell-V27Y2Ksb.js → ElapsedCell-Bnjp3onG.js} +2 -2
  30. package/dashboard/dist/assets/{ElapsedCell-V27Y2Ksb.js.map → ElapsedCell-Bnjp3onG.js.map} +1 -1
  31. package/dashboard/dist/assets/{EntityTimelinePanel-BA4MWXkB.js → EntityTimelinePanel-D6Z7YXuY.js} +2 -2
  32. package/dashboard/dist/assets/{EntityTimelinePanel-BA4MWXkB.js.map → EntityTimelinePanel-D6Z7YXuY.js.map} +1 -1
  33. package/dashboard/dist/assets/{EscalationListSchemaPage-B20HUAlO.js → EscalationListSchemaPage-D2aa_arC.js} +2 -2
  34. package/dashboard/dist/assets/{EscalationListSchemaPage-B20HUAlO.js.map → EscalationListSchemaPage-D2aa_arC.js.map} +1 -1
  35. package/dashboard/dist/assets/{EscalationSchemaPage-Cen9HGYG.js → EscalationSchemaPage-DuOje0Ke.js} +2 -2
  36. package/dashboard/dist/assets/{EscalationSchemaPage-Cen9HGYG.js.map → EscalationSchemaPage-DuOje0Ke.js.map} +1 -1
  37. package/dashboard/dist/assets/{EscalationTimeline-DGNgcMm0.js → EscalationTimeline-DFkhU2Z2.js} +2 -2
  38. package/dashboard/dist/assets/{EscalationTimeline-DGNgcMm0.js.map → EscalationTimeline-DFkhU2Z2.js.map} +1 -1
  39. package/dashboard/dist/assets/{EscalationTitleSelect-BhsflGiC.js → EscalationTitleSelect-CgYnMM_O.js} +2 -2
  40. package/dashboard/dist/assets/{EscalationTitleSelect-BhsflGiC.js.map → EscalationTitleSelect-CgYnMM_O.js.map} +1 -1
  41. package/dashboard/dist/assets/{EscalationsOverview-C2nc-Pgv.js → EscalationsOverview-BTkFoklS.js} +2 -2
  42. package/dashboard/dist/assets/{EscalationsOverview-C2nc-Pgv.js.map → EscalationsOverview-BTkFoklS.js.map} +1 -1
  43. package/dashboard/dist/assets/{EventTable-BvNxHKy1.js → EventTable-MJmAbu6N.js} +2 -2
  44. package/dashboard/dist/assets/{EventTable-BvNxHKy1.js.map → EventTable-MJmAbu6N.js.map} +1 -1
  45. package/dashboard/dist/assets/{FilterBar-22FDO0R_.js → FilterBar-Blt7qcUc.js} +2 -2
  46. package/dashboard/dist/assets/{FilterBar-22FDO0R_.js.map → FilterBar-Blt7qcUc.js.map} +1 -1
  47. package/dashboard/dist/assets/{GraphInvokePage-BAyfJ-PY.js → GraphInvokePage-B4K3mT_c.js} +2 -2
  48. package/dashboard/dist/assets/{GraphInvokePage-BAyfJ-PY.js.map → GraphInvokePage-B4K3mT_c.js.map} +1 -1
  49. package/dashboard/dist/assets/{HomePage-CtjG2kGn.js → HomePage-BN5wXq6V.js} +2 -2
  50. package/dashboard/dist/assets/{HomePage-CtjG2kGn.js.map → HomePage-BN5wXq6V.js.map} +1 -1
  51. package/dashboard/dist/assets/{LinePage-DPe-vP3-.js → LinePage-CuHHHwBy.js} +2 -2
  52. package/dashboard/dist/assets/{LinePage-DPe-vP3-.js.map → LinePage-CuHHHwBy.js.map} +1 -1
  53. package/dashboard/dist/assets/{LinesPage-BCSfYkuL.js → LinesPage-D9TRHWyt.js} +2 -2
  54. package/dashboard/dist/assets/{LinesPage-BCSfYkuL.js.map → LinesPage-D9TRHWyt.js.map} +1 -1
  55. package/dashboard/dist/assets/{ListToolbar-6siR0Hao.js → ListToolbar-GGj6X36p.js} +2 -2
  56. package/dashboard/dist/assets/{ListToolbar-6siR0Hao.js.map → ListToolbar-GGj6X36p.js.map} +1 -1
  57. package/dashboard/dist/assets/{McpOverview-Cbu2CXlQ.js → McpOverview-Do31A1jL.js} +2 -2
  58. package/dashboard/dist/assets/{McpOverview-Cbu2CXlQ.js.map → McpOverview-Do31A1jL.js.map} +1 -1
  59. package/dashboard/dist/assets/{McpQueryDetailPage--1FsnGuM.js → McpQueryDetailPage-D6FSB1bS.js} +2 -2
  60. package/dashboard/dist/assets/{McpQueryDetailPage--1FsnGuM.js.map → McpQueryDetailPage-D6FSB1bS.js.map} +1 -1
  61. package/dashboard/dist/assets/{McpQueryPage-CPUUMIiY.js → McpQueryPage-CyT2d0Y_.js} +2 -2
  62. package/dashboard/dist/assets/{McpQueryPage-CPUUMIiY.js.map → McpQueryPage-CyT2d0Y_.js.map} +1 -1
  63. package/dashboard/dist/assets/{McpRunDetailPage-BDCv-c1o.js → McpRunDetailPage-C3mmTl4Y.js} +2 -2
  64. package/dashboard/dist/assets/{McpRunDetailPage-BDCv-c1o.js.map → McpRunDetailPage-C3mmTl4Y.js.map} +1 -1
  65. package/dashboard/dist/assets/{McpRunsPage-Df4yOclO.js → McpRunsPage-CTeFFUE2.js} +2 -2
  66. package/dashboard/dist/assets/{McpRunsPage-Df4yOclO.js.map → McpRunsPage-CTeFFUE2.js.map} +1 -1
  67. package/dashboard/dist/assets/{OperationsPage-BYUGFgPp.js → OperationsPage-BUtQP5dm.js} +2 -2
  68. package/dashboard/dist/assets/{OperationsPage-BYUGFgPp.js.map → OperationsPage-BUtQP5dm.js.map} +1 -1
  69. package/dashboard/dist/assets/{OperatorDashboard-Dd1EhTZe.js → OperatorDashboard-BwYOXyUV.js} +2 -2
  70. package/dashboard/dist/assets/{OperatorDashboard-Dd1EhTZe.js.map → OperatorDashboard-BwYOXyUV.js.map} +1 -1
  71. package/dashboard/dist/assets/{PersonaDetailPage-BCx3Ey2_.js → PersonaDetailPage-CkrKJLNv.js} +2 -2
  72. package/dashboard/dist/assets/{PersonaDetailPage-BCx3Ey2_.js.map → PersonaDetailPage-CkrKJLNv.js.map} +1 -1
  73. package/dashboard/dist/assets/{PersonasPage--Ez0YeHh.js → PersonasPage-BS8aBeOv.js} +2 -2
  74. package/dashboard/dist/assets/{PersonasPage--Ez0YeHh.js.map → PersonasPage-BS8aBeOv.js.map} +1 -1
  75. package/dashboard/dist/assets/{PortalPage-BmBmheBp.js → PortalPage-PEBk6VVu.js} +2 -2
  76. package/dashboard/dist/assets/{PortalPage-BmBmheBp.js.map → PortalPage-PEBk6VVu.js.map} +1 -1
  77. package/dashboard/dist/assets/{ProcessDetailPage-DBj4VEnP.js → ProcessDetailPage-CJ71bxDs.js} +2 -2
  78. package/dashboard/dist/assets/{ProcessDetailPage-DBj4VEnP.js.map → ProcessDetailPage-CJ71bxDs.js.map} +1 -1
  79. package/dashboard/dist/assets/{ProcessesListPage-CD5NRIBK.js → ProcessesListPage-ov_HLxz5.js} +2 -2
  80. package/dashboard/dist/assets/{ProcessesListPage-CD5NRIBK.js.map → ProcessesListPage-ov_HLxz5.js.map} +1 -1
  81. package/dashboard/dist/assets/{ResolverForm-Baxwv_IG.js → ResolverForm-BKiUY-lN.js} +2 -2
  82. package/dashboard/dist/assets/{ResolverForm-Baxwv_IG.js.map → ResolverForm-BKiUY-lN.js.map} +1 -1
  83. package/dashboard/dist/assets/{RoleDetailPage-6ukNyycs.js → RoleDetailPage-CmfWwjtG.js} +2 -2
  84. package/dashboard/dist/assets/{RoleDetailPage-6ukNyycs.js.map → RoleDetailPage-CmfWwjtG.js.map} +1 -1
  85. package/dashboard/dist/assets/{RolesPage-DRs2XeSd.js → RolesPage-DvO5DJWY.js} +2 -2
  86. package/dashboard/dist/assets/{RolesPage-DRs2XeSd.js.map → RolesPage-DvO5DJWY.js.map} +1 -1
  87. package/dashboard/dist/assets/{RosterWidget-BPBPSa1k.js → RosterWidget-Cs6OTbST.js} +2 -2
  88. package/dashboard/dist/assets/{RosterWidget-BPBPSa1k.js.map → RosterWidget-Cs6OTbST.js.map} +1 -1
  89. package/dashboard/dist/assets/{RunAsSelector-Br9FiMwP.js → RunAsSelector-VNjUn9Zp.js} +2 -2
  90. package/dashboard/dist/assets/{RunAsSelector-Br9FiMwP.js.map → RunAsSelector-VNjUn9Zp.js.map} +1 -1
  91. package/dashboard/dist/assets/{ScanCodesPage-BXENWoZb.js → ScanCodesPage-Dbaud0fc.js} +2 -2
  92. package/dashboard/dist/assets/{ScanCodesPage-BXENWoZb.js.map → ScanCodesPage-Dbaud0fc.js.map} +1 -1
  93. package/dashboard/dist/assets/{ScanSchemeDetailPage-CaM4rUBV.js → ScanSchemeDetailPage-BfDw_Eke.js} +2 -2
  94. package/dashboard/dist/assets/{ScanSchemeDetailPage-CaM4rUBV.js.map → ScanSchemeDetailPage-BfDw_Eke.js.map} +1 -1
  95. package/dashboard/dist/assets/{ScanStationPage-CmJKgWy_.js → ScanStationPage-DE-zJTiD.js} +2 -2
  96. package/dashboard/dist/assets/{ScanStationPage-CmJKgWy_.js.map → ScanStationPage-DE-zJTiD.js.map} +1 -1
  97. package/dashboard/dist/assets/{StickyPagination-DX5CPgrX.js → StickyPagination-CJ3jjlDX.js} +2 -2
  98. package/dashboard/dist/assets/{StickyPagination-DX5CPgrX.js.map → StickyPagination-CJ3jjlDX.js.map} +1 -1
  99. package/dashboard/dist/assets/{StreamMessageDetail-3mWw3_M5.js → StreamMessageDetail-yOdyJGHR.js} +2 -2
  100. package/dashboard/dist/assets/{StreamMessageDetail-3mWw3_M5.js.map → StreamMessageDetail-yOdyJGHR.js.map} +1 -1
  101. package/dashboard/dist/assets/{SwimlaneTimeline-C_pIcWBJ.js → SwimlaneTimeline-DeFWNFrL.js} +2 -2
  102. package/dashboard/dist/assets/{SwimlaneTimeline-C_pIcWBJ.js.map → SwimlaneTimeline-DeFWNFrL.js.map} +1 -1
  103. package/dashboard/dist/assets/{TaskDetailPage-DthMVBZO.js → TaskDetailPage-BPL_Zx-L.js} +2 -2
  104. package/dashboard/dist/assets/{TaskDetailPage-DthMVBZO.js.map → TaskDetailPage-BPL_Zx-L.js.map} +1 -1
  105. package/dashboard/dist/assets/{TasksListPage-MtawUpuU.js → TasksListPage-Bc3S63_O.js} +2 -2
  106. package/dashboard/dist/assets/{TasksListPage-MtawUpuU.js.map → TasksListPage-Bc3S63_O.js.map} +1 -1
  107. package/dashboard/dist/assets/{TimeAgo-DIziYk-v.js → TimeAgo-DAtnJQwU.js} +2 -2
  108. package/dashboard/dist/assets/{TimeAgo-DIziYk-v.js.map → TimeAgo-DAtnJQwU.js.map} +1 -1
  109. package/dashboard/dist/assets/{TimestampCell-Dn5M-Eey.js → TimestampCell-CG0erHqq.js} +2 -2
  110. package/dashboard/dist/assets/{TimestampCell-Dn5M-Eey.js.map → TimestampCell-CG0erHqq.js.map} +1 -1
  111. package/dashboard/dist/assets/{ToolTestPanel-DaBrgPML.js → ToolTestPanel-c71yqZv7.js} +2 -2
  112. package/dashboard/dist/assets/{ToolTestPanel-DaBrgPML.js.map → ToolTestPanel-c71yqZv7.js.map} +1 -1
  113. package/dashboard/dist/assets/{TopicDetailPage-zNE3EigP.js → TopicDetailPage-BlUP0bb1.js} +2 -2
  114. package/dashboard/dist/assets/{TopicDetailPage-zNE3EigP.js.map → TopicDetailPage-BlUP0bb1.js.map} +1 -1
  115. package/dashboard/dist/assets/{TopicsPage-Cj0ugdie.js → TopicsPage-lQ9HNzOq.js} +2 -2
  116. package/dashboard/dist/assets/{TopicsPage-Cj0ugdie.js.map → TopicsPage-lQ9HNzOq.js.map} +1 -1
  117. package/dashboard/dist/assets/{UserName-t3PbLYfd.js → UserName-Vf97ofcW.js} +2 -2
  118. package/dashboard/dist/assets/{UserName-t3PbLYfd.js.map → UserName-Vf97ofcW.js.map} +1 -1
  119. package/dashboard/dist/assets/{WorkflowExecutionPage-CZ2c5QLL.js → WorkflowExecutionPage-B195cnHb.js} +2 -2
  120. package/dashboard/dist/assets/{WorkflowExecutionPage-CZ2c5QLL.js.map → WorkflowExecutionPage-B195cnHb.js.map} +1 -1
  121. package/dashboard/dist/assets/{WorkflowsDashboard-DLb71Sa2.js → WorkflowsDashboard-gH-PGsKq.js} +2 -2
  122. package/dashboard/dist/assets/{WorkflowsDashboard-DLb71Sa2.js.map → WorkflowsDashboard-gH-PGsKq.js.map} +1 -1
  123. package/dashboard/dist/assets/{WorkflowsOverview-Wz6RzxHJ.js → WorkflowsOverview-D_wYDqw3.js} +2 -2
  124. package/dashboard/dist/assets/{WorkflowsOverview-Wz6RzxHJ.js.map → WorkflowsOverview-D_wYDqw3.js.map} +1 -1
  125. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CcRAN_ey.js → YamlWorkflowDetailPage-Imob5F8H.js} +2 -2
  126. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CcRAN_ey.js.map → YamlWorkflowDetailPage-Imob5F8H.js.map} +1 -1
  127. package/dashboard/dist/assets/{YamlWorkflowsPage-B4C9fiYU.js → YamlWorkflowsPage-DVEVSKKJ.js} +2 -2
  128. package/dashboard/dist/assets/{YamlWorkflowsPage-B4C9fiYU.js.map → YamlWorkflowsPage-DVEVSKKJ.js.map} +1 -1
  129. package/dashboard/dist/assets/{agents-BvRjwrof.js → agents-B-8z_DV8.js} +2 -2
  130. package/dashboard/dist/assets/{agents-BvRjwrof.js.map → agents-B-8z_DV8.js.map} +1 -1
  131. package/dashboard/dist/assets/{bots-qx7qPwFo.js → bots-Clm-wZeG.js} +2 -2
  132. package/dashboard/dist/assets/{bots-qx7qPwFo.js.map → bots-Clm-wZeG.js.map} +1 -1
  133. package/dashboard/dist/assets/{capabilities-DJrUEeew.js → capabilities-CBwgv5tr.js} +2 -2
  134. package/dashboard/dist/assets/{capabilities-DJrUEeew.js.map → capabilities-CBwgv5tr.js.map} +1 -1
  135. package/dashboard/dist/assets/{controlplane-D82a5cfq.js → controlplane-B96o1-zT.js} +2 -2
  136. package/dashboard/dist/assets/{controlplane-D82a5cfq.js.map → controlplane-B96o1-zT.js.map} +1 -1
  137. package/dashboard/dist/assets/{escalation-columns-Dmm8LY_f.js → escalation-columns-CFoFILF1.js} +2 -2
  138. package/dashboard/dist/assets/{escalation-columns-Dmm8LY_f.js.map → escalation-columns-CFoFILF1.js.map} +1 -1
  139. package/dashboard/dist/assets/{escalation-items-C3ko1DCb.js → escalation-items-BCUiPsfS.js} +2 -2
  140. package/dashboard/dist/assets/{escalation-items-C3ko1DCb.js.map → escalation-items-BCUiPsfS.js.map} +1 -1
  141. package/dashboard/dist/assets/{index-BCSeHOZH.js → index-BOuGMe78.js} +2 -2
  142. package/dashboard/dist/assets/{index-BCSeHOZH.js.map → index-BOuGMe78.js.map} +1 -1
  143. package/dashboard/dist/assets/{index-f4-pKYcm.js → index-BXKDpLk5.js} +2 -2
  144. package/dashboard/dist/assets/{index-f4-pKYcm.js.map → index-BXKDpLk5.js.map} +1 -1
  145. package/dashboard/dist/assets/{index-BAxEeqfF.js → index-B_z-OFwk.js} +2 -2
  146. package/dashboard/dist/assets/{index-BAxEeqfF.js.map → index-B_z-OFwk.js.map} +1 -1
  147. package/dashboard/dist/assets/{index-CNDnGdvT.js → index-C1WJs6IZ.js} +2 -2
  148. package/dashboard/dist/assets/{index-CNDnGdvT.js.map → index-C1WJs6IZ.js.map} +1 -1
  149. package/dashboard/dist/assets/{index-CSr5q355.js → index-CXNh7LuG.js} +10 -10
  150. package/dashboard/dist/assets/index-CXNh7LuG.js.map +1 -0
  151. package/dashboard/dist/assets/{index-CXnmU0TS.js → index-CnhNCVPc.js} +2 -2
  152. package/dashboard/dist/assets/{index-CXnmU0TS.js.map → index-CnhNCVPc.js.map} +1 -1
  153. package/dashboard/dist/assets/{index-DOkHnsLK.js → index-Czb9O4Ns.js} +2 -2
  154. package/dashboard/dist/assets/{index-DOkHnsLK.js.map → index-Czb9O4Ns.js.map} +1 -1
  155. package/dashboard/dist/assets/{index-U5gC9Xgq.js → index-DvgjLvvn.js} +2 -2
  156. package/dashboard/dist/assets/{index-U5gC9Xgq.js.map → index-DvgjLvvn.js.map} +1 -1
  157. package/dashboard/dist/assets/{index-C_-FoMo9.js → index-EZkdUZwM.js} +2 -2
  158. package/dashboard/dist/assets/{index-C_-FoMo9.js.map → index-EZkdUZwM.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-BJrsQM-E.js → index-IedmSPp1.js} +2 -2
  160. package/dashboard/dist/assets/{index-BJrsQM-E.js.map → index-IedmSPp1.js.map} +1 -1
  161. package/dashboard/dist/assets/{index-BVxqddYr.js → index-MGquOb7J.js} +2 -2
  162. package/dashboard/dist/assets/{index-BVxqddYr.js.map → index-MGquOb7J.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-D-vNL8Hm.js → index-P22vmuEu.js} +2 -2
  164. package/dashboard/dist/assets/{index-D-vNL8Hm.js.map → index-P22vmuEu.js.map} +1 -1
  165. package/dashboard/dist/assets/{index-C59ZyWOo.js → index-XS-6UjQd.js} +2 -2
  166. package/dashboard/dist/assets/{index-C59ZyWOo.js.map → index-XS-6UjQd.js.map} +1 -1
  167. package/dashboard/dist/assets/{knowledge-i7_nXSbf.js → knowledge-d92ncKgf.js} +2 -2
  168. package/dashboard/dist/assets/{knowledge-i7_nXSbf.js.map → knowledge-d92ncKgf.js.map} +1 -1
  169. package/dashboard/dist/assets/{machines-DfSNshLg.js → machines-BG9laURp.js} +2 -2
  170. package/dashboard/dist/assets/{machines-DfSNshLg.js.map → machines-BG9laURp.js.map} +1 -1
  171. package/dashboard/dist/assets/{mcp-dCLNwcC8.js → mcp-CsZdpCEf.js} +2 -2
  172. package/dashboard/dist/assets/{mcp-dCLNwcC8.js.map → mcp-CsZdpCEf.js.map} +1 -1
  173. package/dashboard/dist/assets/{mcp-query-wmbaGRYi.js → mcp-query-o2xqrZJv.js} +2 -2
  174. package/dashboard/dist/assets/{mcp-query-wmbaGRYi.js.map → mcp-query-o2xqrZJv.js.map} +1 -1
  175. package/dashboard/dist/assets/{personas-B_cJA5UG.js → personas-EYROtAxm.js} +2 -2
  176. package/dashboard/dist/assets/{personas-B_cJA5UG.js.map → personas-EYROtAxm.js.map} +1 -1
  177. package/dashboard/dist/assets/{pipelines-ClUmuwmY.js → pipelines-C17xZZsa.js} +2 -2
  178. package/dashboard/dist/assets/{pipelines-ClUmuwmY.js.map → pipelines-C17xZZsa.js.map} +1 -1
  179. package/dashboard/dist/assets/{tasks-BE97GrLr.js → tasks-CUppIhu6.js} +2 -2
  180. package/dashboard/dist/assets/{tasks-BE97GrLr.js.map → tasks-CUppIhu6.js.map} +1 -1
  181. package/dashboard/dist/assets/{topics-Dk0Y3kZP.js → topics-B-lCJzVc.js} +2 -2
  182. package/dashboard/dist/assets/{topics-Dk0Y3kZP.js.map → topics-B-lCJzVc.js.map} +1 -1
  183. package/dashboard/dist/assets/{useDebouncedValue-BLGuHd_v.js → useDebouncedValue-C5mMbYoU.js} +2 -2
  184. package/dashboard/dist/assets/{useDebouncedValue-BLGuHd_v.js.map → useDebouncedValue-C5mMbYoU.js.map} +1 -1
  185. package/dashboard/dist/assets/{useNamespace-Cj7t8eQd.js → useNamespace-Bu42ipvu.js} +2 -2
  186. package/dashboard/dist/assets/{useNamespace-Cj7t8eQd.js.map → useNamespace-Bu42ipvu.js.map} +1 -1
  187. package/dashboard/dist/assets/{useYamlActivityEvents-C7eurSkD.js → useYamlActivityEvents-C29uM9Qp.js} +2 -2
  188. package/dashboard/dist/assets/{useYamlActivityEvents-C7eurSkD.js.map → useYamlActivityEvents-C29uM9Qp.js.map} +1 -1
  189. package/dashboard/dist/assets/{validate-BypZfZ8R.js → validate-Bt5QGwSc.js} +2 -2
  190. package/dashboard/dist/assets/{validate-BypZfZ8R.js.map → validate-Bt5QGwSc.js.map} +1 -1
  191. package/dashboard/dist/assets/{yaml-workflows-CnMKmznF.js → yaml-workflows-DgrmL_Kt.js} +2 -2
  192. package/dashboard/dist/assets/{yaml-workflows-CnMKmznF.js.map → yaml-workflows-DgrmL_Kt.js.map} +1 -1
  193. package/dashboard/dist/index.html +1 -1
  194. package/docs/scan-codes.md +8 -5
  195. package/package.json +1 -1
  196. package/dashboard/dist/assets/index-CSr5q355.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage-CtjG2kGn.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 { useAuth } from './useAuth';\nimport { useEscalations } from '../api/escalations';\nimport { useEventSubscriptions } from './useEventContext';\nimport { useMemberEscalationPatterns } from './useMemberEscalationPatterns';\nimport { useThrottledInvalidation } from './useEventHooks';\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 invalidate = useThrottledInvalidation('SUMMARY');\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). A count is\n // an aggregate surface: the SUMMARY tier bounds the refetch rate.\n useEventSubscriptions(useMemberEscalationPatterns(), () => {\n if (userId) {\n invalidate([['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 { useLinkVariables } from '../../hooks/useLinkVariables';\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 // The device's link-variable bindings scope the home board too — same as the\n // full Pace Board and the pins. (opts is the THIRD arg; facets is the second.)\n const { values: scopeValues } = useLinkVariables();\n const scopeFacets = useMemo(\n () => (Object.keys(scopeValues).length ? scopeValues : undefined),\n [scopeValues],\n );\n const stationQ = useStationMetrics('1h', scopeFacets, { 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=\"/pace\" icon={ExternalLink} title=\"Open the full Pace Board\" />\n </div>\n <div className=\"flex-1 min-h-0 cursor-pointer\" onClick={() => navigate('/pace')}>\n {paceStations.length === 0 ? (\n <EmptyPanel icon={LayoutDashboard} text=\"No roles yet — mark roles visible on the Pace Board\" />\n ) : (\n <PaceChart\n stations={paceStations}\n selectedRole={null}\n onSelect={() => navigate('/pace')}\n onUpstreamSelect={() => navigate('/pace')}\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","invalidate","useThrottledInvalidation","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","scopeValues","useLinkVariables","scopeFacets","stationQ","jobsQ","useJobs","durableAppIds","pipelineAppIds","mcpQ","useMcpRuns","allEscQ","useAvailableEscalations","myEscQ","timer","paceStations","fragments","buildFragments","homeRole","fragment","f","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
+ {"version":3,"file":"HomePage-BN5wXq6V.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 { useAuth } from './useAuth';\nimport { useEscalations } from '../api/escalations';\nimport { useEventSubscriptions } from './useEventContext';\nimport { useMemberEscalationPatterns } from './useMemberEscalationPatterns';\nimport { useThrottledInvalidation } from './useEventHooks';\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 invalidate = useThrottledInvalidation('SUMMARY');\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). A count is\n // an aggregate surface: the SUMMARY tier bounds the refetch rate.\n useEventSubscriptions(useMemberEscalationPatterns(), () => {\n if (userId) {\n invalidate([['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 { useLinkVariables } from '../../hooks/useLinkVariables';\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 // The device's link-variable bindings scope the home board too — same as the\n // full Pace Board and the pins. (opts is the THIRD arg; facets is the second.)\n const { values: scopeValues } = useLinkVariables();\n const scopeFacets = useMemo(\n () => (Object.keys(scopeValues).length ? scopeValues : undefined),\n [scopeValues],\n );\n const stationQ = useStationMetrics('1h', scopeFacets, { 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=\"/pace\" icon={ExternalLink} title=\"Open the full Pace Board\" />\n </div>\n <div className=\"flex-1 min-h-0 cursor-pointer\" onClick={() => navigate('/pace')}>\n {paceStations.length === 0 ? (\n <EmptyPanel icon={LayoutDashboard} text=\"No roles yet — mark roles visible on the Pace Board\" />\n ) : (\n <PaceChart\n stations={paceStations}\n selectedRole={null}\n onSelect={() => navigate('/pace')}\n onUpstreamSelect={() => navigate('/pace')}\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","invalidate","useThrottledInvalidation","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","scopeValues","useLinkVariables","scopeFacets","stationQ","jobsQ","useJobs","durableAppIds","pipelineAppIds","mcpQ","useMcpRuns","allEscQ","useAvailableEscalations","myEscQ","timer","paceStations","fragments","buildFragments","homeRole","fragment","f","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,5 +1,5 @@
1
- import{a as i,j as e}from"./vendor-query-DvWWuNIB.js";import{c as B,W as T,e as ae,f as fe,s as re,S as q,i as je,g as _,h as be,j as ye}from"./machines-DfSNshLg.js";import{P as Ne}from"./PageHeader-DiGWAQlR.js";import{k as ge,bR as ke,a_ as Ie,P as b,bi as C,F as Se,O as Ce,H as Ee,bS as Ae,j as Oe,bq as we,b1 as Re}from"./index-CSr5q355.js";import{E as _e}from"./EntityTimelinePanel-BA4MWXkB.js";import{L as A,e as $e}from"./vendor-react-_9U4mKFr.js";import{X as V,e as Pe,a1 as Fe,L as Te,bW as qe,bK as Le,k as Me,bX as We,x as De,u as Be,t as Ve,R as He}from"./vendor-icons-en0_uSRD.js";import{F as ve,b as $}from"./FilterBar-22FDO0R_.js";const X=2e3,Ke={machine:null,channel:null,direction:null,kind:null,violationsOnly:!1};function Je(){return{events:[],held:[],paused:!1,filters:Ke}}function L(t){return t.length>X?t.slice(0,X):t}function Ue(t,n){switch(n.type){case"ingest":return t.paused?{...t,held:L([n.event,...t.held])}:{...t,events:L([n.event,...t.events])};case"pause":return t.paused?t:{...t,paused:!0};case"resume":return{...t,paused:!1,held:[],events:L([...t.held,...t.events])};case"clear":return{...t,events:[],held:[]};case"filter":return{...t,filters:{...t.filters,...n.patch}}}}function Ye(t,n){return!(n.machine&&t.machineId!==n.machine||n.channel&&t.channel!==n.channel||n.direction&&t.direction!==n.direction||n.kind&&t.kind!==n.kind||n.violationsOnly&&t.violations.length===0)}function Ge(t,n){return t.filter(a=>Ye(a,n))}const Xe=new Set(ae);function ze(t){if(!t||typeof t!="object")return null;const n=t,a=n.type;if(typeof a!="string"||a!==T&&!a.startsWith(`${T}.`))return null;const s=n.data&&typeof n.data=="object"?n.data:n;if(typeof s.siteId!="string"||typeof s.lineId!="string"||s.direction!=="in"&&s.direction!=="out")return null;const l=typeof s.kind=="string"&&Xe.has(s.kind)?s.kind:"unknown",r=[s.at,n.timestamp].find(o=>typeof o=="string")??new Date().toISOString();return{type:T,siteId:s.siteId,lineId:s.lineId,machineId:typeof s.machineId=="string"?s.machineId:null,address:typeof s.address=="string"?s.address:null,direction:s.direction,channel:typeof s.channel=="string"?s.channel:"",topic:typeof s.topic=="string"?s.topic:"",id:typeof s.id=="string"?s.id:null,at:r,retained:s.retained===!0,kind:l,event:typeof s.event=="string"?s.event:null,summary:typeof s.summary=="string"?s.summary:"",violations:Array.isArray(s.violations)?s.violations.filter(o=>typeof o=="string"):[],actions:Array.isArray(s.actions)?s.actions:[],..."payload"in s?{payload:s.payload}:{}}}function z(t){return[...new Set(t.filter(n=>!!n))].sort()}function Qe(t,n){const[a,s]=i.useReducer(Ue,void 0,Je);i.useEffect(()=>{s({type:"clear"})},[t,n]),ge(B(t,n),p=>{const m=ze(p);m&&s({type:"ingest",event:m})});const l=i.useMemo(()=>Ge(a.events,a.filters),[a.events,a.filters]),r=i.useMemo(()=>z(a.events.map(p=>p.machineId)),[a.events]),o=i.useMemo(()=>z(a.events.map(p=>p.channel)),[a.events]),d=i.useCallback(p=>s({type:"filter",patch:p}),[]),c=i.useCallback(()=>s({type:a.paused?"resume":"pause"}),[a.paused]),f=i.useCallback(()=>s({type:"clear"}),[]);return{events:l,total:a.events.length,heldCount:a.held.length,paused:a.paused,filters:a.filters,machines:r,channels:o,setFilter:d,togglePause:c,clear:f}}const D=["tiles","rows"],Q={tiles:"Tiles",rows:"Rows"},Ze=12;function et(t,n){return`lt:lines:${t}/${n}:machines-view`}function tt(t){return t<=Ze?"tiles":"rows"}function Z(t,n){try{const a=localStorage.getItem(t);return a&&n.includes(a)?a:null}catch{return null}}function st(t,n){try{n===null?localStorage.removeItem(t):localStorage.setItem(t,n)}catch{}}function ee(t){return t?t.online===!1||t.rows.offlineRowId||t.rows.quietRowId||t.alarms.length>0?!0:t.rows.handoff+t.rows.command+t.rows.alarm>0:!1}const nt={claim:"claimed",accumulate:"accumulated",resolve:"resolved","create-row":"row created",refuse:"refused",hold:"held",unmatched:"unmatched",unreadable:"unreadable",ack:"acknowledged",none:""},H={claim:"text-text-secondary",accumulate:"text-text-secondary",resolve:"text-status-success","create-row":"text-text-secondary",refuse:"text-status-error",hold:"text-status-warning",unmatched:"text-status-warning",unreadable:"text-status-error",ack:"text-text-secondary",none:"text-text-quaternary"};function v(t){const n=nt[t.verb]??t.verb;return t.itemKey?`${n} ${t.itemKey}`:n}function P(t){return t.filter(n=>n.verb!=="none")}function O(t){return`/escalations/detail/${encodeURIComponent(t)}`}function at(t){const n=new Date(t);if(Number.isNaN(n.getTime()))return t;const a=ke();return new Intl.DateTimeFormat("en-GB",{...a?{timeZone:a}:{},hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(n)}const K={online:"bg-status-success-graphic",quiet:"bg-status-pending-graphic",offline:"bg-status-error",unknown:"bg-text-quaternary"},E={online:"online",quiet:"quiet",offline:"offline",unknown:"unknown"};function J(t){return!t||t.online===null?"unknown":t.online?t.rows.quietRowId?"quiet":"online":"offline"}function U(t){if(typeof t=="string")return t;try{return JSON.stringify(t,null,2)}catch{return String(t)}}function le({outcome:t}){return e.jsxs("div",{className:"min-w-0","data-testid":"command-outcome",children:[e.jsx("div",{className:"text-xs font-mono text-text-secondary truncate",title:t.request,children:t.request}),t.ok?e.jsxs("div",{className:"text-xs font-medium text-status-success",children:["Row created"," ",e.jsx(A,{to:O(t.rowId),className:"font-mono text-accent hover:underline",children:t.rowId})]}):e.jsx("div",{className:"text-xs font-medium text-status-error",children:t.message})]})}const rt=["jobId","recipe"];function lt(t,n){let a={};try{const s=t.trim()?JSON.parse(t):{};s&&typeof s=="object"&&!Array.isArray(s)&&(a=s)}catch{a={}}return n in a||(a[n]=""),JSON.stringify(a,null,2)}function ct(t){if(!t.trim())return{};const n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("Args must be a JSON object.");return n}function ot({siteId:t,lineId:n,machine:a}){const[s,l]=i.useState(""),[r,o]=i.useState(""),[d,c]=i.useState(!1),[f,p]=i.useState(null),m=fe(a),j=async x=>{if(x.preventDefault(),!s)return;const h=`${s} ${r.trim()||"{}"}`;c(!0);try{const u=ct(r),g=await re(t,n,a.machineId,{op:s,args:u});p({request:h,ok:!0,rowId:g.rowId})}catch(u){p({request:h,ok:!1,message:u.message})}finally{c(!1)}};return e.jsxs("form",{onSubmit:j,className:"space-y-3","aria-label":"Send command",children:[e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"command-op",className:"block text-2xs font-medium text-text-secondary",children:["Op ",e.jsx("span",{className:"text-status-error",children:"*"})]}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Pick the operation the machine runs."}),e.jsxs("select",{id:"command-op",className:"select text-xs font-mono",value:s,required:!0,onChange:x=>l(x.target.value),children:[e.jsx("option",{value:"",disabled:!0,children:"Choose…"}),m.map(x=>e.jsx("option",{value:x,children:x},x))]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"command-args",className:"block text-2xs font-medium text-text-secondary",children:"Args"}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Write a JSON object, or add a key from the helpers."}),e.jsx("textarea",{id:"command-args",className:"textarea text-2xs font-mono min-h-[4.5rem]",value:r,placeholder:"{}",onChange:x=>o(x.target.value)}),e.jsx("div",{className:"flex items-center gap-2 mt-1",children:rt.map(x=>e.jsxs("button",{type:"button",onClick:()=>o(h=>lt(h,x)),className:"text-2xs font-mono icon-link",children:["+ ",x]},x))})]}),e.jsx("button",{type:"submit",disabled:d||!s,className:"btn-primary text-xs py-1.5 px-4",children:"Send"}),f&&e.jsx(le,{outcome:f})]})}function it({siteId:t,lineId:n,machineId:a}){const[s,l]=i.useState(!1),[r,o]=i.useState(null),d=async()=>{l(!0);try{const c=await re(t,n,a,{op:q,args:{}});o({request:`${q} {}`,ok:!0,rowId:c.rowId})}catch(c){o({request:`${q} {}`,ok:!1,message:c.message})}finally{l(!1)}};return e.jsxs("div",{className:"space-y-2",children:[e.jsx("button",{type:"button",onClick:d,disabled:s,className:"btn-secondary text-xs py-1.5 px-4",children:"Ask for a snapshot"}),r&&e.jsx(le,{outcome:r})]})}const te=[{value:"live",label:"Live",retained:!1},{value:"retained",label:"Retained",retained:!0}];function dt(t){const n=t.trim();if(!n)return"";try{return JSON.parse(n)}catch{return t}}function xt({outcome:t}){return e.jsxs("div",{className:"min-w-0 space-y-2","data-testid":"inspect-outcome",children:[e.jsx("div",{className:"text-xs font-mono text-text-secondary truncate",title:t.request,children:t.request}),t.ok?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`text-xs font-medium ${t.result.violations.length?"text-status-warning":"text-status-success"}`,children:[t.result.kind??"message",t.result.event?` · ${t.result.event}`:"",t.result.violations.length?` · ${t.result.violations.length} violation${t.result.violations.length===1?"":"s"}`:" · matches the contract"]}),t.result.summary&&e.jsx("div",{className:"text-2xs text-text-secondary",children:t.result.summary}),t.result.violations.length>0&&e.jsx("ul",{className:"space-y-0.5","aria-label":"Violations",children:t.result.violations.map((n,a)=>e.jsx("li",{className:"text-2xs text-status-warning",children:n},a))}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Planned actions"}),P(t.result.actions).length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The gateway would take no action."}):e.jsx("ul",{className:"space-y-0.5","aria-label":"Planned actions",children:P(t.result.actions).map((n,a)=>e.jsxs("li",{className:"text-2xs",children:[e.jsx("span",{className:H[n.verb],children:v(n)}),n.rowId&&e.jsxs(e.Fragment,{children:[" ",e.jsx(A,{to:O(n.rowId),className:"font-mono text-accent hover:underline",children:n.rowId})]}),n.detail&&e.jsxs("span",{className:"text-text-tertiary",children:[" · ",n.detail]})]},`${n.verb}-${a}`))})]}),t.result.inspections!==void 0&&e.jsx("pre",{className:"text-2xs font-mono text-text-secondary whitespace-pre-wrap break-all bg-surface-sunken rounded px-2 py-1.5",children:U(t.result.inspections)})]}):e.jsx("div",{className:"text-xs font-medium text-status-error",children:t.message})]})}function mt({siteId:t,lineId:n}){const[a,s]=i.useState(""),[l,r]=i.useState(""),[o,d]=i.useState(""),[c,f]=i.useState(!1),[p,m]=i.useState(null),j=async x=>{x.preventDefault();const h=te.find(g=>g.value===o);if(!a.trim()||!h)return;const u=`${a.trim()} ${l.trim()||'""'}`;f(!0);try{const g=await je(t,n,{topic:a.trim(),payload:dt(l),retained:h.retained});m({request:u,ok:!0,result:{...g,violations:g.violations??[],actions:g.actions??[]}})}catch(g){m({request:u,ok:!1,message:g.message})}finally{f(!1)}};return e.jsxs("form",{onSubmit:j,className:"space-y-3","aria-label":"Inspect a message",children:[e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"inspect-topic",className:"block text-2xs font-medium text-text-secondary",children:["Topic ",e.jsx("span",{className:"text-status-error",children:"*"})]}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Enter the topic the message arrives on."}),e.jsx("input",{id:"inspect-topic",className:"input text-2xs font-mono",value:a,required:!0,onChange:x=>s(x.target.value)})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"inspect-payload",className:"block text-2xs font-medium text-text-secondary",children:"Payload"}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Paste the body; JSON is sent as JSON, anything else as text."}),e.jsx("textarea",{id:"inspect-payload",className:"textarea text-2xs font-mono min-h-[5rem]",value:l,onChange:x=>r(x.target.value)})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"inspect-retained",className:"block text-2xs font-medium text-text-secondary",children:["Delivery ",e.jsx("span",{className:"text-status-error",children:"*"})]}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Say whether the broker would hand this over as a retained message."}),e.jsxs("select",{id:"inspect-retained",className:"select text-xs",value:o,required:!0,onChange:x=>d(x.target.value),children:[e.jsx("option",{value:"",disabled:!0,children:"Choose…"}),te.map(x=>e.jsx("option",{value:x.value,children:x.label},x.value))]})]}),e.jsx("button",{type:"submit",disabled:c||!a.trim()||!o,className:"btn-primary text-xs py-1.5 px-4",children:"Inspect"}),p&&e.jsx(xt,{outcome:p})]})}const M="machine",ut=440,ht="entity-timeline";function I({title:t,children:n}){return e.jsxs("section",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:t}),n]})}function W({rowId:t,label:n}){return e.jsxs("li",{className:"text-2xs",children:[e.jsx("span",{className:"text-text-secondary",children:n})," ",e.jsx(A,{to:O(t),className:"font-mono text-accent hover:underline",children:t})]})}function pt({siteId:t,lineId:n,summary:a,view:s,canAct:l,onClose:r}){const o=J(s),d=Ie(),[c,f]=i.useState(!1),p=i.useCallback(h=>{d==null||d.setPanel(e.jsx(_e,{facetKey:h,value:a.machineId,role:a.role}),{key:ht,width:420})},[d,a.machineId,a.role]),m=(s==null?void 0:s.alarms)??[],j=(s==null?void 0:s.heldUnits)??[],x=(s==null?void 0:s.jobs)??[];return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsxs("div",{className:"flex items-start justify-between px-5 pt-5 pb-3 border-b border-surface-border/40",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${K[o]}`,title:E[o]}),e.jsx("span",{className:"text-sm font-mono text-text-primary truncate",children:a.machineId}),e.jsx("span",{className:"text-2xs text-text-quaternary",children:E[o]})]}),e.jsxs("p",{className:"text-2xs font-mono text-text-tertiary mt-0.5",children:[a.process," · ",a.role]})]}),e.jsx("button",{onClick:r,className:"icon-link shrink-0 ml-2",title:"Close",children:e.jsx(V,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-5 py-4 space-y-5",children:[e.jsx(I,{title:"Snapshot",children:e.jsxs("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-3",children:[e.jsxs(b,{label:"Address",children:[e.jsx("span",{className:"font-mono",children:(s==null?void 0:s.address)??a.address??"—"}),e.jsxs("span",{className:"text-text-quaternary",children:[" · ",a.addressing]})]}),e.jsx(b,{label:"Software",children:e.jsx("span",{className:"font-mono",children:(s==null?void 0:s.software)??"—"})}),e.jsx(b,{label:"Since",children:s!=null&&s.since?C(s.since):"—"}),e.jsx(b,{label:"Last seen",children:s!=null&&s.lastSeen?C(s.lastSeen):"—"}),e.jsx(b,{label:"Boot",children:e.jsx("span",{className:"font-mono break-all",children:(s==null?void 0:s.bootId)??"—"})}),e.jsx(b,{label:"Session",children:e.jsx("span",{className:"font-mono break-all",children:(s==null?void 0:s.sessionId)??"—"})})]})}),e.jsx(I,{title:`Jobs · ${x.length}`,children:x.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The last snapshot carried no jobs."}):e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",onClick:()=>f(h=>!h),className:"inline-flex items-center gap-1 text-2xs icon-link",children:[e.jsx(Pe,{className:`w-3 h-3 transition-transform ${c?"rotate-90":""}`}),c?"Hide":"Show"," the jobs as reported"]}),c&&e.jsx("pre",{className:"mt-1.5 text-2xs font-mono text-text-secondary whitespace-pre-wrap break-all bg-surface-sunken rounded px-2 py-1.5",children:U(x)})]})}),e.jsx(I,{title:`Alarms · ${m.length}`,children:m.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The machine reports no active alarm."}):e.jsx("ul",{className:"space-y-1",children:m.map(h=>e.jsxs("li",{className:"text-2xs flex items-baseline gap-2",children:[e.jsx("span",{className:"font-mono text-status-warning",children:h.alarmId}),e.jsx("span",{className:"text-text-tertiary",children:h.level}),e.jsx("span",{className:"text-text-quaternary ml-auto",children:C(h.raisedAt)}),h.rowId&&e.jsx(A,{to:O(h.rowId),className:"font-mono text-accent hover:underline",children:"row"})]},h.alarmId))})}),e.jsx(I,{title:`Held units · ${j.length}`,children:j.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The machine holds no unit."}):e.jsx("ul",{className:"space-y-1",children:j.map(h=>e.jsx(W,{rowId:h.rowId,label:h.carrierId?`${h.unitId} on ${h.carrierId}`:h.unitId},h.unitId))})}),e.jsxs(I,{title:"Open rows",children:[e.jsxs("p",{className:"text-2xs font-mono text-text-secondary tabular-nums",children:["handoff ",(s==null?void 0:s.rows.handoff)??0," · command ",(s==null?void 0:s.rows.command)??0," · alarm ",(s==null?void 0:s.rows.alarm)??0]}),((s==null?void 0:s.rows.offlineRowId)||(s==null?void 0:s.rows.quietRowId))&&e.jsxs("ul",{className:"space-y-1 mt-1",children:[s.rows.offlineRowId&&e.jsx(W,{rowId:s.rows.offlineRowId,label:"offline"}),s.rows.quietRowId&&e.jsx(W,{rowId:s.rows.quietRowId,label:"quiet"})]})]}),e.jsxs(I,{title:"Over a window",children:[e.jsx("p",{className:"text-2xs text-text-tertiary mb-1.5",children:"Open the rows that moved work to or from this machine."}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{type:"button",onClick:()=>p(_.TO),className:"text-2xs icon-link font-mono",children:_.TO}),e.jsx("button",{type:"button",onClick:()=>p(_.FROM),className:"text-2xs icon-link font-mono",children:_.FROM})]})]}),l&&e.jsxs(e.Fragment,{children:[e.jsx(I,{title:"Ask for a snapshot",children:e.jsx(it,{siteId:t,lineId:n,machineId:a.machineId})}),e.jsx(I,{title:"Send command",children:e.jsx(ot,{siteId:t,lineId:n,machine:a})}),e.jsx(I,{title:"Inspect a message",children:e.jsx(mt,{siteId:t,lineId:n})})]})]})]})}const ft="flex-1 min-h-0 overflow-y-auto border-t border-surface-border";function jt(t,n){if(!n)return!0;const{summary:a,view:s}=t;return[a.machineId,a.process,a.role,(s==null?void 0:s.address)??a.address??""].join(" ").toLowerCase().includes(n)}function bt({machines:t,selectedId:n,onSelect:a}){const[s,l]=i.useState(""),r=s.trim().toLowerCase(),o=i.useMemo(()=>t.filter(d=>jt(d,r)),[t,r]);return e.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[e.jsxs("div",{className:"flex items-center gap-3 pb-2 shrink-0",children:[e.jsx("label",{className:"sr-only",htmlFor:"machine-search",children:"Find a machine"}),e.jsx("input",{id:"machine-search",type:"search",className:"input text-2xs font-mono py-1 w-full max-w-[16rem]",placeholder:"id, process, role, address",value:s,onChange:d=>l(d.target.value)}),e.jsxs("span",{className:"text-2xs text-text-quaternary tabular-nums",children:[o.length," of ",t.length]})]}),e.jsx("ul",{className:ft,"aria-label":"Machines",children:o.map(({summary:d,view:c})=>{const f=J(c),p=d.machineId===n,m=(c==null?void 0:c.address)??d.address,j=(c==null?void 0:c.alarms.length)??0;return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>a(d.machineId),"aria-pressed":p,"data-presence":f,className:`w-full text-left grid grid-cols-[auto_minmax(6rem,1fr)_minmax(0,2fr)_auto_auto_auto] items-baseline gap-x-3 px-2 py-1 border-l-2 border-b border-surface-border/60 hover:bg-surface-hover transition-colors ${p?"border-l-accent":"border-l-transparent"}`,children:[e.jsx("span",{className:`w-2 h-2 rounded-full dot-ring self-center ${K[f]}`,title:E[f]}),e.jsx("span",{className:"text-2xs font-mono text-text-primary truncate",children:d.machineId}),e.jsxs("span",{className:"text-2xs font-mono text-text-tertiary truncate",title:m??void 0,children:[d.process,m?e.jsxs("span",{className:"text-text-quaternary",children:[" · ",m]}):null]}),e.jsx("span",{className:"text-2xs text-text-tertiary truncate max-w-[6rem]",title:"Software",children:(c==null?void 0:c.software)??"—"}),e.jsxs("span",{className:"text-2xs text-text-secondary tabular-nums whitespace-nowrap",title:"Units held",children:["held ",(c==null?void 0:c.heldUnits.length)??0]}),e.jsxs("span",{className:"text-2xs font-mono text-text-tertiary tabular-nums whitespace-nowrap",children:["h ",(c==null?void 0:c.rows.handoff)??0," c ",(c==null?void 0:c.rows.command)??0," a ",(c==null?void 0:c.rows.alarm)??0,j>0&&e.jsxs("span",{className:"text-status-warning ml-2",title:"Active alarms",children:[j," alarm",j===1?"":"s"]})]})]})},d.machineId)})}),o.length===0&&e.jsx("p",{className:"text-2xs text-text-tertiary py-2",children:"No machine matches."})]})}function yt({machines:t,selectedId:n,onSelect:a}){return t.length===0?e.jsx("p",{className:"text-2xs text-text-tertiary",children:"The line declares no machines."}):e.jsx("div",{className:"grid grid-cols-[repeat(auto-fill,minmax(11rem,1fr))] gap-y-3",role:"list","aria-label":"Machines",children:t.map(({summary:s,view:l})=>{const r=J(l),o=s.machineId===n,d=(l==null?void 0:l.address)??s.address,c=(l==null?void 0:l.alarms.length)??0;return e.jsxs("button",{type:"button",role:"listitem",onClick:()=>a(s.machineId),"aria-pressed":o,"data-presence":r,className:`text-left min-w-0 pl-3 pr-4 py-1.5 border-l-2 transition-colors hover:bg-surface-hover ${o?"border-accent":"border-surface-border"}`,children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${K[r]}`,title:E[r]}),e.jsx("span",{className:"text-xs font-mono text-text-primary truncate",children:s.machineId}),e.jsx("span",{className:"text-2xs text-text-quaternary ml-auto shrink-0",children:E[r]})]}),e.jsxs("div",{className:"text-2xs font-mono text-text-tertiary truncate mt-0.5",title:d??void 0,children:[s.process,d?e.jsxs("span",{className:"text-text-quaternary",children:[" · ",d]}):null]}),e.jsxs("div",{className:"flex items-center gap-3 text-2xs mt-1 tabular-nums",children:[e.jsx("span",{className:"text-text-tertiary truncate",title:"Software",children:(l==null?void 0:l.software)??"—"}),e.jsxs("span",{className:"text-text-secondary shrink-0",title:"Units held",children:["held ",(l==null?void 0:l.heldUnits.length)??0]})]}),e.jsxs("div",{className:"flex items-center gap-3 text-2xs font-mono mt-0.5 tabular-nums",children:[e.jsxs("span",{className:"text-text-tertiary",title:"Open handoff rows",children:["h ",(l==null?void 0:l.rows.handoff)??0]}),e.jsxs("span",{className:"text-text-tertiary",title:"Open command rows",children:["c ",(l==null?void 0:l.rows.command)??0]}),e.jsxs("span",{className:"text-text-tertiary",title:"Open alarm rows",children:["a ",(l==null?void 0:l.rows.alarm)??0]}),c>0&&e.jsxs("span",{className:"text-status-warning ml-auto",title:"Active alarms",children:[c," alarm",c===1?"":"s"]})]})]},s.machineId)})})}const Nt={tiles:Te,rows:Fe},gt="p-1 transition-colors",kt="text-text-primary bg-surface-sunken",It="text-text-tertiary hover:text-text-primary";function St(t){const{machines:n,selectedId:a,onSelect:s,view:l,onView:r,attentionOnly:o,onAttentionOnly:d}=t,c=i.useMemo(()=>o?n.filter(m=>ee(m.view)):n,[n,o]),f=i.useMemo(()=>n.filter(m=>ee(m.view)).length,[n]);if(n.length===0)return e.jsx("p",{className:"text-2xs text-text-tertiary",children:"The line declares no machines."});const p=l==="rows"?bt:yt;return e.jsxs("section",{"aria-label":"Machines region","data-view":l,className:"flex flex-col h-full min-h-0",children:[e.jsxs("div",{className:"flex items-center gap-3 pb-2 shrink-0",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary tabular-nums",children:[n.length," machine",n.length===1?"":"s",f>0&&e.jsxs("span",{className:"text-status-warning",children:[" · ",f," need",f===1?"s":""," attention"]})]}),e.jsxs("span",{className:"ml-auto flex items-center gap-3",children:[e.jsx("button",{type:"button","aria-pressed":o,onClick:()=>d(!o),className:`px-2 py-0.5 text-2xs rounded border transition-colors ${o?"border-status-warning text-status-warning":"border-surface-border text-text-secondary hover:text-text-primary"}`,children:"Needs attention"}),e.jsx("span",{className:"inline-flex rounded border border-surface-border overflow-hidden",role:"radiogroup","aria-label":"Machines view",children:D.map(m=>{const j=Nt[m];return e.jsx("button",{type:"button",role:"radio","aria-checked":l===m,"aria-label":Q[m],title:Q[m],onClick:()=>r(m),className:`${gt} ${l===m?kt:It}`,children:e.jsx(j,{className:"w-3.5 h-3.5"})},m)})})]})]}),c.length===0?e.jsx("p",{className:"text-2xs text-text-tertiary py-1",children:"Every machine is quiet."}):e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:e.jsx(p,{machines:c,selectedId:a,onSelect:s})})]})}function Ct({event:t,onOpen:n}){const a=P(t.actions),s=t.direction==="in"?qe:Le;return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>n(t),"data-direction":t.direction,"data-kind":t.kind,className:`w-full text-left grid items-baseline gap-x-3 gap-y-0.5 px-2 py-1.5 border-b border-surface-border/60 hover:bg-surface-hover transition-colors
1
+ import{a as i,j as e}from"./vendor-query-DvWWuNIB.js";import{c as B,W as T,e as ae,f as fe,s as re,S as q,i as je,g as _,h as be,j as ye}from"./machines-BG9laURp.js";import{P as Ne}from"./PageHeader-DiGWAQlR.js";import{k as ge,bR as ke,a_ as Ie,P as b,bi as C,F as Se,O as Ce,H as Ee,bS as Ae,j as Oe,bq as we,b1 as Re}from"./index-CXNh7LuG.js";import{E as _e}from"./EntityTimelinePanel-D6Z7YXuY.js";import{L as A,e as $e}from"./vendor-react-_9U4mKFr.js";import{X as V,e as Pe,a1 as Fe,L as Te,bW as qe,bK as Le,k as Me,bX as We,x as De,u as Be,t as Ve,R as He}from"./vendor-icons-en0_uSRD.js";import{F as ve,b as $}from"./FilterBar-Blt7qcUc.js";const X=2e3,Ke={machine:null,channel:null,direction:null,kind:null,violationsOnly:!1};function Je(){return{events:[],held:[],paused:!1,filters:Ke}}function L(t){return t.length>X?t.slice(0,X):t}function Ue(t,n){switch(n.type){case"ingest":return t.paused?{...t,held:L([n.event,...t.held])}:{...t,events:L([n.event,...t.events])};case"pause":return t.paused?t:{...t,paused:!0};case"resume":return{...t,paused:!1,held:[],events:L([...t.held,...t.events])};case"clear":return{...t,events:[],held:[]};case"filter":return{...t,filters:{...t.filters,...n.patch}}}}function Ye(t,n){return!(n.machine&&t.machineId!==n.machine||n.channel&&t.channel!==n.channel||n.direction&&t.direction!==n.direction||n.kind&&t.kind!==n.kind||n.violationsOnly&&t.violations.length===0)}function Ge(t,n){return t.filter(a=>Ye(a,n))}const Xe=new Set(ae);function ze(t){if(!t||typeof t!="object")return null;const n=t,a=n.type;if(typeof a!="string"||a!==T&&!a.startsWith(`${T}.`))return null;const s=n.data&&typeof n.data=="object"?n.data:n;if(typeof s.siteId!="string"||typeof s.lineId!="string"||s.direction!=="in"&&s.direction!=="out")return null;const l=typeof s.kind=="string"&&Xe.has(s.kind)?s.kind:"unknown",r=[s.at,n.timestamp].find(o=>typeof o=="string")??new Date().toISOString();return{type:T,siteId:s.siteId,lineId:s.lineId,machineId:typeof s.machineId=="string"?s.machineId:null,address:typeof s.address=="string"?s.address:null,direction:s.direction,channel:typeof s.channel=="string"?s.channel:"",topic:typeof s.topic=="string"?s.topic:"",id:typeof s.id=="string"?s.id:null,at:r,retained:s.retained===!0,kind:l,event:typeof s.event=="string"?s.event:null,summary:typeof s.summary=="string"?s.summary:"",violations:Array.isArray(s.violations)?s.violations.filter(o=>typeof o=="string"):[],actions:Array.isArray(s.actions)?s.actions:[],..."payload"in s?{payload:s.payload}:{}}}function z(t){return[...new Set(t.filter(n=>!!n))].sort()}function Qe(t,n){const[a,s]=i.useReducer(Ue,void 0,Je);i.useEffect(()=>{s({type:"clear"})},[t,n]),ge(B(t,n),p=>{const m=ze(p);m&&s({type:"ingest",event:m})});const l=i.useMemo(()=>Ge(a.events,a.filters),[a.events,a.filters]),r=i.useMemo(()=>z(a.events.map(p=>p.machineId)),[a.events]),o=i.useMemo(()=>z(a.events.map(p=>p.channel)),[a.events]),d=i.useCallback(p=>s({type:"filter",patch:p}),[]),c=i.useCallback(()=>s({type:a.paused?"resume":"pause"}),[a.paused]),f=i.useCallback(()=>s({type:"clear"}),[]);return{events:l,total:a.events.length,heldCount:a.held.length,paused:a.paused,filters:a.filters,machines:r,channels:o,setFilter:d,togglePause:c,clear:f}}const D=["tiles","rows"],Q={tiles:"Tiles",rows:"Rows"},Ze=12;function et(t,n){return`lt:lines:${t}/${n}:machines-view`}function tt(t){return t<=Ze?"tiles":"rows"}function Z(t,n){try{const a=localStorage.getItem(t);return a&&n.includes(a)?a:null}catch{return null}}function st(t,n){try{n===null?localStorage.removeItem(t):localStorage.setItem(t,n)}catch{}}function ee(t){return t?t.online===!1||t.rows.offlineRowId||t.rows.quietRowId||t.alarms.length>0?!0:t.rows.handoff+t.rows.command+t.rows.alarm>0:!1}const nt={claim:"claimed",accumulate:"accumulated",resolve:"resolved","create-row":"row created",refuse:"refused",hold:"held",unmatched:"unmatched",unreadable:"unreadable",ack:"acknowledged",none:""},H={claim:"text-text-secondary",accumulate:"text-text-secondary",resolve:"text-status-success","create-row":"text-text-secondary",refuse:"text-status-error",hold:"text-status-warning",unmatched:"text-status-warning",unreadable:"text-status-error",ack:"text-text-secondary",none:"text-text-quaternary"};function v(t){const n=nt[t.verb]??t.verb;return t.itemKey?`${n} ${t.itemKey}`:n}function P(t){return t.filter(n=>n.verb!=="none")}function O(t){return`/escalations/detail/${encodeURIComponent(t)}`}function at(t){const n=new Date(t);if(Number.isNaN(n.getTime()))return t;const a=ke();return new Intl.DateTimeFormat("en-GB",{...a?{timeZone:a}:{},hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(n)}const K={online:"bg-status-success-graphic",quiet:"bg-status-pending-graphic",offline:"bg-status-error",unknown:"bg-text-quaternary"},E={online:"online",quiet:"quiet",offline:"offline",unknown:"unknown"};function J(t){return!t||t.online===null?"unknown":t.online?t.rows.quietRowId?"quiet":"online":"offline"}function U(t){if(typeof t=="string")return t;try{return JSON.stringify(t,null,2)}catch{return String(t)}}function le({outcome:t}){return e.jsxs("div",{className:"min-w-0","data-testid":"command-outcome",children:[e.jsx("div",{className:"text-xs font-mono text-text-secondary truncate",title:t.request,children:t.request}),t.ok?e.jsxs("div",{className:"text-xs font-medium text-status-success",children:["Row created"," ",e.jsx(A,{to:O(t.rowId),className:"font-mono text-accent hover:underline",children:t.rowId})]}):e.jsx("div",{className:"text-xs font-medium text-status-error",children:t.message})]})}const rt=["jobId","recipe"];function lt(t,n){let a={};try{const s=t.trim()?JSON.parse(t):{};s&&typeof s=="object"&&!Array.isArray(s)&&(a=s)}catch{a={}}return n in a||(a[n]=""),JSON.stringify(a,null,2)}function ct(t){if(!t.trim())return{};const n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("Args must be a JSON object.");return n}function ot({siteId:t,lineId:n,machine:a}){const[s,l]=i.useState(""),[r,o]=i.useState(""),[d,c]=i.useState(!1),[f,p]=i.useState(null),m=fe(a),j=async x=>{if(x.preventDefault(),!s)return;const h=`${s} ${r.trim()||"{}"}`;c(!0);try{const u=ct(r),g=await re(t,n,a.machineId,{op:s,args:u});p({request:h,ok:!0,rowId:g.rowId})}catch(u){p({request:h,ok:!1,message:u.message})}finally{c(!1)}};return e.jsxs("form",{onSubmit:j,className:"space-y-3","aria-label":"Send command",children:[e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"command-op",className:"block text-2xs font-medium text-text-secondary",children:["Op ",e.jsx("span",{className:"text-status-error",children:"*"})]}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Pick the operation the machine runs."}),e.jsxs("select",{id:"command-op",className:"select text-xs font-mono",value:s,required:!0,onChange:x=>l(x.target.value),children:[e.jsx("option",{value:"",disabled:!0,children:"Choose…"}),m.map(x=>e.jsx("option",{value:x,children:x},x))]})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"command-args",className:"block text-2xs font-medium text-text-secondary",children:"Args"}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Write a JSON object, or add a key from the helpers."}),e.jsx("textarea",{id:"command-args",className:"textarea text-2xs font-mono min-h-[4.5rem]",value:r,placeholder:"{}",onChange:x=>o(x.target.value)}),e.jsx("div",{className:"flex items-center gap-2 mt-1",children:rt.map(x=>e.jsxs("button",{type:"button",onClick:()=>o(h=>lt(h,x)),className:"text-2xs font-mono icon-link",children:["+ ",x]},x))})]}),e.jsx("button",{type:"submit",disabled:d||!s,className:"btn-primary text-xs py-1.5 px-4",children:"Send"}),f&&e.jsx(le,{outcome:f})]})}function it({siteId:t,lineId:n,machineId:a}){const[s,l]=i.useState(!1),[r,o]=i.useState(null),d=async()=>{l(!0);try{const c=await re(t,n,a,{op:q,args:{}});o({request:`${q} {}`,ok:!0,rowId:c.rowId})}catch(c){o({request:`${q} {}`,ok:!1,message:c.message})}finally{l(!1)}};return e.jsxs("div",{className:"space-y-2",children:[e.jsx("button",{type:"button",onClick:d,disabled:s,className:"btn-secondary text-xs py-1.5 px-4",children:"Ask for a snapshot"}),r&&e.jsx(le,{outcome:r})]})}const te=[{value:"live",label:"Live",retained:!1},{value:"retained",label:"Retained",retained:!0}];function dt(t){const n=t.trim();if(!n)return"";try{return JSON.parse(n)}catch{return t}}function xt({outcome:t}){return e.jsxs("div",{className:"min-w-0 space-y-2","data-testid":"inspect-outcome",children:[e.jsx("div",{className:"text-xs font-mono text-text-secondary truncate",title:t.request,children:t.request}),t.ok?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`text-xs font-medium ${t.result.violations.length?"text-status-warning":"text-status-success"}`,children:[t.result.kind??"message",t.result.event?` · ${t.result.event}`:"",t.result.violations.length?` · ${t.result.violations.length} violation${t.result.violations.length===1?"":"s"}`:" · matches the contract"]}),t.result.summary&&e.jsx("div",{className:"text-2xs text-text-secondary",children:t.result.summary}),t.result.violations.length>0&&e.jsx("ul",{className:"space-y-0.5","aria-label":"Violations",children:t.result.violations.map((n,a)=>e.jsx("li",{className:"text-2xs text-status-warning",children:n},a))}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Planned actions"}),P(t.result.actions).length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The gateway would take no action."}):e.jsx("ul",{className:"space-y-0.5","aria-label":"Planned actions",children:P(t.result.actions).map((n,a)=>e.jsxs("li",{className:"text-2xs",children:[e.jsx("span",{className:H[n.verb],children:v(n)}),n.rowId&&e.jsxs(e.Fragment,{children:[" ",e.jsx(A,{to:O(n.rowId),className:"font-mono text-accent hover:underline",children:n.rowId})]}),n.detail&&e.jsxs("span",{className:"text-text-tertiary",children:[" · ",n.detail]})]},`${n.verb}-${a}`))})]}),t.result.inspections!==void 0&&e.jsx("pre",{className:"text-2xs font-mono text-text-secondary whitespace-pre-wrap break-all bg-surface-sunken rounded px-2 py-1.5",children:U(t.result.inspections)})]}):e.jsx("div",{className:"text-xs font-medium text-status-error",children:t.message})]})}function mt({siteId:t,lineId:n}){const[a,s]=i.useState(""),[l,r]=i.useState(""),[o,d]=i.useState(""),[c,f]=i.useState(!1),[p,m]=i.useState(null),j=async x=>{x.preventDefault();const h=te.find(g=>g.value===o);if(!a.trim()||!h)return;const u=`${a.trim()} ${l.trim()||'""'}`;f(!0);try{const g=await je(t,n,{topic:a.trim(),payload:dt(l),retained:h.retained});m({request:u,ok:!0,result:{...g,violations:g.violations??[],actions:g.actions??[]}})}catch(g){m({request:u,ok:!1,message:g.message})}finally{f(!1)}};return e.jsxs("form",{onSubmit:j,className:"space-y-3","aria-label":"Inspect a message",children:[e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"inspect-topic",className:"block text-2xs font-medium text-text-secondary",children:["Topic ",e.jsx("span",{className:"text-status-error",children:"*"})]}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Enter the topic the message arrives on."}),e.jsx("input",{id:"inspect-topic",className:"input text-2xs font-mono",value:a,required:!0,onChange:x=>s(x.target.value)})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"inspect-payload",className:"block text-2xs font-medium text-text-secondary",children:"Payload"}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Paste the body; JSON is sent as JSON, anything else as text."}),e.jsx("textarea",{id:"inspect-payload",className:"textarea text-2xs font-mono min-h-[5rem]",value:l,onChange:x=>r(x.target.value)})]}),e.jsxs("div",{children:[e.jsxs("label",{htmlFor:"inspect-retained",className:"block text-2xs font-medium text-text-secondary",children:["Delivery ",e.jsx("span",{className:"text-status-error",children:"*"})]}),e.jsx("p",{className:"text-2xs text-text-tertiary mb-1",children:"Say whether the broker would hand this over as a retained message."}),e.jsxs("select",{id:"inspect-retained",className:"select text-xs",value:o,required:!0,onChange:x=>d(x.target.value),children:[e.jsx("option",{value:"",disabled:!0,children:"Choose…"}),te.map(x=>e.jsx("option",{value:x.value,children:x.label},x.value))]})]}),e.jsx("button",{type:"submit",disabled:c||!a.trim()||!o,className:"btn-primary text-xs py-1.5 px-4",children:"Inspect"}),p&&e.jsx(xt,{outcome:p})]})}const M="machine",ut=440,ht="entity-timeline";function I({title:t,children:n}){return e.jsxs("section",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:t}),n]})}function W({rowId:t,label:n}){return e.jsxs("li",{className:"text-2xs",children:[e.jsx("span",{className:"text-text-secondary",children:n})," ",e.jsx(A,{to:O(t),className:"font-mono text-accent hover:underline",children:t})]})}function pt({siteId:t,lineId:n,summary:a,view:s,canAct:l,onClose:r}){const o=J(s),d=Ie(),[c,f]=i.useState(!1),p=i.useCallback(h=>{d==null||d.setPanel(e.jsx(_e,{facetKey:h,value:a.machineId,role:a.role}),{key:ht,width:420})},[d,a.machineId,a.role]),m=(s==null?void 0:s.alarms)??[],j=(s==null?void 0:s.heldUnits)??[],x=(s==null?void 0:s.jobs)??[];return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsxs("div",{className:"flex items-start justify-between px-5 pt-5 pb-3 border-b border-surface-border/40",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${K[o]}`,title:E[o]}),e.jsx("span",{className:"text-sm font-mono text-text-primary truncate",children:a.machineId}),e.jsx("span",{className:"text-2xs text-text-quaternary",children:E[o]})]}),e.jsxs("p",{className:"text-2xs font-mono text-text-tertiary mt-0.5",children:[a.process," · ",a.role]})]}),e.jsx("button",{onClick:r,className:"icon-link shrink-0 ml-2",title:"Close",children:e.jsx(V,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-5 py-4 space-y-5",children:[e.jsx(I,{title:"Snapshot",children:e.jsxs("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-3",children:[e.jsxs(b,{label:"Address",children:[e.jsx("span",{className:"font-mono",children:(s==null?void 0:s.address)??a.address??"—"}),e.jsxs("span",{className:"text-text-quaternary",children:[" · ",a.addressing]})]}),e.jsx(b,{label:"Software",children:e.jsx("span",{className:"font-mono",children:(s==null?void 0:s.software)??"—"})}),e.jsx(b,{label:"Since",children:s!=null&&s.since?C(s.since):"—"}),e.jsx(b,{label:"Last seen",children:s!=null&&s.lastSeen?C(s.lastSeen):"—"}),e.jsx(b,{label:"Boot",children:e.jsx("span",{className:"font-mono break-all",children:(s==null?void 0:s.bootId)??"—"})}),e.jsx(b,{label:"Session",children:e.jsx("span",{className:"font-mono break-all",children:(s==null?void 0:s.sessionId)??"—"})})]})}),e.jsx(I,{title:`Jobs · ${x.length}`,children:x.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The last snapshot carried no jobs."}):e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",onClick:()=>f(h=>!h),className:"inline-flex items-center gap-1 text-2xs icon-link",children:[e.jsx(Pe,{className:`w-3 h-3 transition-transform ${c?"rotate-90":""}`}),c?"Hide":"Show"," the jobs as reported"]}),c&&e.jsx("pre",{className:"mt-1.5 text-2xs font-mono text-text-secondary whitespace-pre-wrap break-all bg-surface-sunken rounded px-2 py-1.5",children:U(x)})]})}),e.jsx(I,{title:`Alarms · ${m.length}`,children:m.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The machine reports no active alarm."}):e.jsx("ul",{className:"space-y-1",children:m.map(h=>e.jsxs("li",{className:"text-2xs flex items-baseline gap-2",children:[e.jsx("span",{className:"font-mono text-status-warning",children:h.alarmId}),e.jsx("span",{className:"text-text-tertiary",children:h.level}),e.jsx("span",{className:"text-text-quaternary ml-auto",children:C(h.raisedAt)}),h.rowId&&e.jsx(A,{to:O(h.rowId),className:"font-mono text-accent hover:underline",children:"row"})]},h.alarmId))})}),e.jsx(I,{title:`Held units · ${j.length}`,children:j.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The machine holds no unit."}):e.jsx("ul",{className:"space-y-1",children:j.map(h=>e.jsx(W,{rowId:h.rowId,label:h.carrierId?`${h.unitId} on ${h.carrierId}`:h.unitId},h.unitId))})}),e.jsxs(I,{title:"Open rows",children:[e.jsxs("p",{className:"text-2xs font-mono text-text-secondary tabular-nums",children:["handoff ",(s==null?void 0:s.rows.handoff)??0," · command ",(s==null?void 0:s.rows.command)??0," · alarm ",(s==null?void 0:s.rows.alarm)??0]}),((s==null?void 0:s.rows.offlineRowId)||(s==null?void 0:s.rows.quietRowId))&&e.jsxs("ul",{className:"space-y-1 mt-1",children:[s.rows.offlineRowId&&e.jsx(W,{rowId:s.rows.offlineRowId,label:"offline"}),s.rows.quietRowId&&e.jsx(W,{rowId:s.rows.quietRowId,label:"quiet"})]})]}),e.jsxs(I,{title:"Over a window",children:[e.jsx("p",{className:"text-2xs text-text-tertiary mb-1.5",children:"Open the rows that moved work to or from this machine."}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{type:"button",onClick:()=>p(_.TO),className:"text-2xs icon-link font-mono",children:_.TO}),e.jsx("button",{type:"button",onClick:()=>p(_.FROM),className:"text-2xs icon-link font-mono",children:_.FROM})]})]}),l&&e.jsxs(e.Fragment,{children:[e.jsx(I,{title:"Ask for a snapshot",children:e.jsx(it,{siteId:t,lineId:n,machineId:a.machineId})}),e.jsx(I,{title:"Send command",children:e.jsx(ot,{siteId:t,lineId:n,machine:a})}),e.jsx(I,{title:"Inspect a message",children:e.jsx(mt,{siteId:t,lineId:n})})]})]})]})}const ft="flex-1 min-h-0 overflow-y-auto border-t border-surface-border";function jt(t,n){if(!n)return!0;const{summary:a,view:s}=t;return[a.machineId,a.process,a.role,(s==null?void 0:s.address)??a.address??""].join(" ").toLowerCase().includes(n)}function bt({machines:t,selectedId:n,onSelect:a}){const[s,l]=i.useState(""),r=s.trim().toLowerCase(),o=i.useMemo(()=>t.filter(d=>jt(d,r)),[t,r]);return e.jsxs("div",{className:"flex flex-col h-full min-h-0",children:[e.jsxs("div",{className:"flex items-center gap-3 pb-2 shrink-0",children:[e.jsx("label",{className:"sr-only",htmlFor:"machine-search",children:"Find a machine"}),e.jsx("input",{id:"machine-search",type:"search",className:"input text-2xs font-mono py-1 w-full max-w-[16rem]",placeholder:"id, process, role, address",value:s,onChange:d=>l(d.target.value)}),e.jsxs("span",{className:"text-2xs text-text-quaternary tabular-nums",children:[o.length," of ",t.length]})]}),e.jsx("ul",{className:ft,"aria-label":"Machines",children:o.map(({summary:d,view:c})=>{const f=J(c),p=d.machineId===n,m=(c==null?void 0:c.address)??d.address,j=(c==null?void 0:c.alarms.length)??0;return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>a(d.machineId),"aria-pressed":p,"data-presence":f,className:`w-full text-left grid grid-cols-[auto_minmax(6rem,1fr)_minmax(0,2fr)_auto_auto_auto] items-baseline gap-x-3 px-2 py-1 border-l-2 border-b border-surface-border/60 hover:bg-surface-hover transition-colors ${p?"border-l-accent":"border-l-transparent"}`,children:[e.jsx("span",{className:`w-2 h-2 rounded-full dot-ring self-center ${K[f]}`,title:E[f]}),e.jsx("span",{className:"text-2xs font-mono text-text-primary truncate",children:d.machineId}),e.jsxs("span",{className:"text-2xs font-mono text-text-tertiary truncate",title:m??void 0,children:[d.process,m?e.jsxs("span",{className:"text-text-quaternary",children:[" · ",m]}):null]}),e.jsx("span",{className:"text-2xs text-text-tertiary truncate max-w-[6rem]",title:"Software",children:(c==null?void 0:c.software)??"—"}),e.jsxs("span",{className:"text-2xs text-text-secondary tabular-nums whitespace-nowrap",title:"Units held",children:["held ",(c==null?void 0:c.heldUnits.length)??0]}),e.jsxs("span",{className:"text-2xs font-mono text-text-tertiary tabular-nums whitespace-nowrap",children:["h ",(c==null?void 0:c.rows.handoff)??0," c ",(c==null?void 0:c.rows.command)??0," a ",(c==null?void 0:c.rows.alarm)??0,j>0&&e.jsxs("span",{className:"text-status-warning ml-2",title:"Active alarms",children:[j," alarm",j===1?"":"s"]})]})]})},d.machineId)})}),o.length===0&&e.jsx("p",{className:"text-2xs text-text-tertiary py-2",children:"No machine matches."})]})}function yt({machines:t,selectedId:n,onSelect:a}){return t.length===0?e.jsx("p",{className:"text-2xs text-text-tertiary",children:"The line declares no machines."}):e.jsx("div",{className:"grid grid-cols-[repeat(auto-fill,minmax(11rem,1fr))] gap-y-3",role:"list","aria-label":"Machines",children:t.map(({summary:s,view:l})=>{const r=J(l),o=s.machineId===n,d=(l==null?void 0:l.address)??s.address,c=(l==null?void 0:l.alarms.length)??0;return e.jsxs("button",{type:"button",role:"listitem",onClick:()=>a(s.machineId),"aria-pressed":o,"data-presence":r,className:`text-left min-w-0 pl-3 pr-4 py-1.5 border-l-2 transition-colors hover:bg-surface-hover ${o?"border-accent":"border-surface-border"}`,children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${K[r]}`,title:E[r]}),e.jsx("span",{className:"text-xs font-mono text-text-primary truncate",children:s.machineId}),e.jsx("span",{className:"text-2xs text-text-quaternary ml-auto shrink-0",children:E[r]})]}),e.jsxs("div",{className:"text-2xs font-mono text-text-tertiary truncate mt-0.5",title:d??void 0,children:[s.process,d?e.jsxs("span",{className:"text-text-quaternary",children:[" · ",d]}):null]}),e.jsxs("div",{className:"flex items-center gap-3 text-2xs mt-1 tabular-nums",children:[e.jsx("span",{className:"text-text-tertiary truncate",title:"Software",children:(l==null?void 0:l.software)??"—"}),e.jsxs("span",{className:"text-text-secondary shrink-0",title:"Units held",children:["held ",(l==null?void 0:l.heldUnits.length)??0]})]}),e.jsxs("div",{className:"flex items-center gap-3 text-2xs font-mono mt-0.5 tabular-nums",children:[e.jsxs("span",{className:"text-text-tertiary",title:"Open handoff rows",children:["h ",(l==null?void 0:l.rows.handoff)??0]}),e.jsxs("span",{className:"text-text-tertiary",title:"Open command rows",children:["c ",(l==null?void 0:l.rows.command)??0]}),e.jsxs("span",{className:"text-text-tertiary",title:"Open alarm rows",children:["a ",(l==null?void 0:l.rows.alarm)??0]}),c>0&&e.jsxs("span",{className:"text-status-warning ml-auto",title:"Active alarms",children:[c," alarm",c===1?"":"s"]})]})]},s.machineId)})})}const Nt={tiles:Te,rows:Fe},gt="p-1 transition-colors",kt="text-text-primary bg-surface-sunken",It="text-text-tertiary hover:text-text-primary";function St(t){const{machines:n,selectedId:a,onSelect:s,view:l,onView:r,attentionOnly:o,onAttentionOnly:d}=t,c=i.useMemo(()=>o?n.filter(m=>ee(m.view)):n,[n,o]),f=i.useMemo(()=>n.filter(m=>ee(m.view)).length,[n]);if(n.length===0)return e.jsx("p",{className:"text-2xs text-text-tertiary",children:"The line declares no machines."});const p=l==="rows"?bt:yt;return e.jsxs("section",{"aria-label":"Machines region","data-view":l,className:"flex flex-col h-full min-h-0",children:[e.jsxs("div",{className:"flex items-center gap-3 pb-2 shrink-0",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary tabular-nums",children:[n.length," machine",n.length===1?"":"s",f>0&&e.jsxs("span",{className:"text-status-warning",children:[" · ",f," need",f===1?"s":""," attention"]})]}),e.jsxs("span",{className:"ml-auto flex items-center gap-3",children:[e.jsx("button",{type:"button","aria-pressed":o,onClick:()=>d(!o),className:`px-2 py-0.5 text-2xs rounded border transition-colors ${o?"border-status-warning text-status-warning":"border-surface-border text-text-secondary hover:text-text-primary"}`,children:"Needs attention"}),e.jsx("span",{className:"inline-flex rounded border border-surface-border overflow-hidden",role:"radiogroup","aria-label":"Machines view",children:D.map(m=>{const j=Nt[m];return e.jsx("button",{type:"button",role:"radio","aria-checked":l===m,"aria-label":Q[m],title:Q[m],onClick:()=>r(m),className:`${gt} ${l===m?kt:It}`,children:e.jsx(j,{className:"w-3.5 h-3.5"})},m)})})]})]}),c.length===0?e.jsx("p",{className:"text-2xs text-text-tertiary py-1",children:"Every machine is quiet."}):e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:e.jsx(p,{machines:c,selectedId:a,onSelect:s})})]})}function Ct({event:t,onOpen:n}){const a=P(t.actions),s=t.direction==="in"?qe:Le;return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>n(t),"data-direction":t.direction,"data-kind":t.kind,className:`w-full text-left grid items-baseline gap-x-3 gap-y-0.5 px-2 py-1.5 border-b border-surface-border/60 hover:bg-surface-hover transition-colors
2
2
  grid-cols-[auto_auto_minmax(0,1fr)_auto]
3
3
  @table/tape:grid-cols-[auto_auto_6rem_11rem_minmax(0,1fr)_auto]`,children:[e.jsx("span",{className:"text-2xs font-mono tabular-nums text-text-quaternary",children:at(t.at)}),e.jsx(s,{className:"w-3 h-3 self-center text-accent/65","aria-label":t.direction==="in"?"in":"out"}),e.jsx("span",{className:"text-2xs font-mono text-text-primary min-w-0 truncate col-span-2 @table/tape:col-span-1",title:t.machineId??t.address??void 0,children:t.machineId??t.address??"—"}),e.jsxs("span",{className:"text-2xs font-mono text-text-tertiary min-w-0 truncate col-start-3 col-span-2 @table/tape:col-start-4 @table/tape:col-span-1",title:`${t.channel} ${t.topic}`,children:[t.channel,e.jsx("span",{className:"text-text-quaternary",children:" · "}),t.topic]}),e.jsx("span",{className:"text-xs text-text-secondary min-w-0 truncate col-start-3 @table/tape:col-start-5",title:t.summary,children:t.summary||`${t.kind}${t.event?` · ${t.event}`:""}`}),e.jsxs("span",{className:"min-w-0 max-w-[12rem] @table/tape:max-w-[22rem] truncate text-2xs col-start-4 @table/tape:col-start-6",children:[t.violations.length>0&&e.jsxs("span",{className:"text-status-warning tabular-nums mr-2",title:t.violations.join(`
4
4
  `),children:[t.violations.length," violation",t.violations.length===1?"":"s"]}),a.map((l,r)=>e.jsx("span",{className:`${H[l.verb]??"text-text-secondary"} ${r<a.length-1?"mr-2":""}`,children:v(l)},`${l.verb}-${l.rowId??""}-${r}`))]})]})})}const Et="flex-1 min-h-0",At=[{value:"in",label:"in"},{value:"out",label:"out"}];function Ot(t){return[t.machine,t.channel,t.direction,t.kind].filter(Boolean).length+(t.violationsOnly?1:0)}function se(t){const{events:n,total:a,paused:s,heldCount:l,filters:r,machines:o,channels:d,setFilter:c,togglePause:f,clear:p,onOpen:m,controls:j,listClassName:x,listRef:h}=t;return e.jsxs("div",{className:"flex flex-col min-h-0 flex-1 @container/tape",children:[e.jsxs(ve,{embedded:!0,activeFilterCount:Ot(r),actions:e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"text-2xs text-text-quaternary tabular-nums whitespace-nowrap",children:[n.length," shown · ",a," on tape"]}),e.jsxs("button",{type:"button",onClick:f,"aria-pressed":s,className:"inline-flex items-center gap-1 text-2xs icon-link whitespace-nowrap",title:s?"Resume the tape":"Pause the tape",children:[s?e.jsx(Me,{className:"w-3 h-3"}):e.jsx(We,{className:"w-3 h-3"}),s?`Resume${l?` · ${l} held`:""}`:"Pause"]}),e.jsxs("button",{type:"button",onClick:p,className:"inline-flex items-center gap-1 text-2xs icon-link",title:"Clear the tape",children:[e.jsx(De,{className:"w-3 h-3"}),"Clear"]}),j]}),children:[e.jsx($,{label:"Machine",value:r.machine??"",onChange:u=>c({machine:u||null}),options:o.map(u=>({value:u,label:u})),placeholder:"every machine"}),e.jsx($,{label:"Channel",value:r.channel??"",onChange:u=>c({channel:u||null}),options:d.map(u=>({value:u,label:u})),placeholder:"every channel"}),e.jsx($,{label:"Direction",value:r.direction??"",onChange:u=>c({direction:u||null}),options:At,placeholder:"both"}),e.jsx($,{label:"Kind",value:r.kind??"",onChange:u=>c({kind:u||null}),options:ae.map(u=>({value:u,label:u})),placeholder:"every kind"}),e.jsx("button",{type:"button","aria-pressed":r.violationsOnly,onClick:()=>c({violationsOnly:!r.violationsOnly}),className:`self-start px-2 py-1 text-2xs rounded border transition-colors whitespace-nowrap ${r.violationsOnly?"border-status-warning text-status-warning":"border-surface-border text-text-secondary hover:text-text-primary"}`,children:"Violations only"})]}),r.machine&&e.jsxs("div",{className:"flex items-center gap-2 px-3 py-1.5 text-2xs shrink-0",children:[e.jsx("span",{className:"text-text-quaternary",children:"Following"}),e.jsxs("button",{type:"button",onClick:()=>c({machine:null}),className:"inline-flex items-center gap-1 rounded-full border border-surface-border px-2 py-0.5 font-mono text-text-primary hover:text-accent transition-colors",title:"Show every machine",children:[r.machine,e.jsx(V,{className:"w-3 h-3"}),e.jsx("span",{className:"font-sans text-text-tertiary",children:"release"})]})]}),n.length===0?e.jsx("p",{className:"text-2xs text-text-tertiary px-3 py-3",children:a===0?"Waiting for traffic on the wire.":"Every event on the tape is filtered out."}):e.jsx("ul",{ref:h,className:`${x??Et} overflow-y-auto`,"aria-label":"Wire tape",children:n.map(u=>e.jsx(Ct,{event:u,onOpen:m},`${u.at}-${u.id??""}-${u.topic}-${u.direction}`))})]})}const wt="flex flex-col h-full min-h-0 overflow-hidden rounded-[var(--lt-radius-section)] border border-surface-border bg-surface-sunken";function Rt(t){const{fullscreen:n,onFullscreen:a,watching:s,onWatch:l,...r}=t,o=i.useRef(null),d=e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",onClick:()=>a(!0),className:"inline-flex items-center gap-1 text-2xs icon-link",title:"Full screen",children:[e.jsx(Ve,{className:"w-3 h-3"}),"Full screen"]}),e.jsxs("button",{type:"button",onClick:l,disabled:s,className:"inline-flex items-center gap-1 text-2xs icon-link disabled:opacity-60",title:s?"The event stream carries this line":"Add this line to the event stream",children:[e.jsx(He,{className:"w-3 h-3"}),s?"Watching":"Watch on the event stream"]})]});return e.jsxs("section",{"aria-label":"Wire tape",className:wt,children:[e.jsx(se,{...r,controls:d,listRef:o}),e.jsxs(Se,{open:n,onClose:()=>a(!1),sourceRef:o,children:[e.jsx("div",{className:"sticky top-0 float-right z-10",children:e.jsx("button",{type:"button",onClick:()=>a(!1),className:"p-2 rounded text-text-tertiary hover:text-text-primary hover:bg-surface-raised transition-colors duration-150 bg-surface-sunken/80 backdrop-blur-sm",title:"Close (Esc)",children:e.jsx(Be,{className:"w-5 h-5"})})}),n&&e.jsx(se,{...r,listClassName:"min-h-[60vh]"})]})]})}const ne="wire";function _t({event:t,onClose:n}){const a=P(t.actions);return e.jsxs("div",{className:"h-full flex flex-col",children:[e.jsxs("div",{className:"flex items-start justify-between px-5 pt-5 pb-3 border-b border-surface-border/40",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:[t.kind,t.event?e.jsxs("span",{className:"normal-case font-mono",children:[" · ",t.event]}):null]}),e.jsx("p",{className:"text-sm text-text-primary mt-0.5",children:t.summary||t.topic})]}),e.jsx("button",{onClick:n,className:"icon-link shrink-0 ml-2",title:"Close",children:e.jsx(V,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-5 py-4 space-y-5",children:[e.jsxs("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-3",children:[e.jsx(b,{label:"At",children:C(t.at)}),e.jsx(b,{label:"Direction",children:t.direction}),e.jsx(b,{label:"Machine",children:e.jsx("span",{className:"font-mono",children:t.machineId??"—"})}),e.jsx(b,{label:"Address",children:e.jsx("span",{className:"font-mono",children:t.address??"—"})}),e.jsx(b,{label:"Channel",children:e.jsx("span",{className:"font-mono",children:t.channel})}),e.jsx(b,{label:"Retained",children:t.retained?"yes":"no"}),e.jsx("div",{className:"col-span-2",children:e.jsx(b,{label:"Topic",children:e.jsx("span",{className:"font-mono break-all",children:t.topic})})}),t.id&&e.jsx("div",{className:"col-span-2",children:e.jsx(b,{label:"Message id",children:e.jsx("span",{className:"font-mono break-all",children:t.id})})})]}),e.jsxs("section",{children:[e.jsxs("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:["Violations",t.violations.length?` · ${t.violations.length}`:""]}),t.violations.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The message matched the contract."}):e.jsx("ul",{className:"space-y-1",children:t.violations.map((s,l)=>e.jsx("li",{className:"text-xs text-status-warning",children:s},l))})]}),e.jsxs("section",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Actions"}),a.length===0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"The gateway took no action."}):e.jsx("ul",{className:"space-y-1.5",children:a.map((s,l)=>e.jsxs("li",{className:"text-xs",children:[e.jsx("span",{className:H[s.verb],children:v(s)}),s.rowId&&e.jsxs(e.Fragment,{children:[" ",e.jsx(A,{to:O(s.rowId),className:"font-mono text-accent hover:underline",children:s.rowId})]}),s.detail&&e.jsx("span",{className:"block text-2xs text-text-tertiary",children:s.detail})]},`${s.verb}-${l}`))})]}),e.jsxs("section",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Payload"}),t.payload===void 0?e.jsx("p",{className:"text-2xs text-text-quaternary",children:"Builders see the payload here."}):e.jsx("pre",{className:"text-2xs font-mono text-text-secondary whitespace-pre-wrap break-all bg-surface-sunken rounded px-2 py-1.5",children:U(t.payload)})]})]})]})}const $t=420,Pt="flex-[3] min-h-0 flex flex-col mb-4",Ft="flex-[1] min-h-[14rem] flex flex-col";function Tt(t,n,a){const s=et(t,n),[l,r]=i.useState(()=>Z(s,D));i.useEffect(()=>{r(Z(s,D))},[s]);const o=i.useCallback(d=>{r(d),st(s,d)},[s]);return[l??tt(a),o]}function qt(t,n,a){const s=Oe("LIST"),l=i.useMemo(()=>[B(t,n),...a.map(r=>we({role:r}))],[t,n,a]);Re(l,()=>{s([ye(t,n)])})}function Jt(){const{siteId:t="",lineId:n=""}=$e(),{isOps:a,isBuilder:s}=Ce(),l=a||s,{data:r,isLoading:o,error:d}=be(t,n),{setPanel:c,closePanel:f,ownerKey:p}=Ee(),[m,j]=i.useState(null),[x,h]=i.useState(!1),[u,g]=i.useState(!1),{userPatterns:ce,addPattern:oe}=Ae(),w=(r==null?void 0:r.summary)??null,S=i.useMemo(()=>{const y=new Map(((r==null?void 0:r.machines)??[]).map(k=>[k.machineId,k]));return((w==null?void 0:w.machines)??((r==null?void 0:r.machines)??[]).map(k=>({machineId:k.machineId,process:k.process,role:k.role,address:k.address,addressing:"declared"}))).map(k=>({summary:k,view:y.get(k.machineId)}))},[w,r]),ie=i.useMemo(()=>[...new Set(S.map(y=>y.summary.role))].sort(),[S]);qt(t,n,ie);const N=Qe(t,n),[de,xe]=Tt(t,n,S.length),Y=B(t,n),me=ce.includes(Y),R=S.find(y=>y.summary.machineId===m)??null,ue=i.useCallback(y=>{j(y),N.setFilter({machine:y})},[N.setFilter]),G=i.useCallback(()=>{j(null),f(M)},[f]);i.useEffect(()=>{R&&c(e.jsx(pt,{siteId:t,lineId:n,summary:R.summary,view:R.view,canAct:l,onClose:G}),{key:M,width:ut})},[R,t,n,l,G,c]);const F=i.useRef(!1);i.useEffect(()=>{if(p===M){F.current=!0;return}F.current&&(F.current=!1,j(null))},[p]);const he=i.useCallback(y=>{c(e.jsx(_t,{event:y,onClose:()=>f(ne)}),{key:ne,width:$t})},[c,f]),pe=!!r&&!r.leading;return e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsx(Ne,{title:e.jsxs("span",{className:"font-mono",children:[t," · ",n]}),actions:r!=null&&r.leading&&r.takenAt?e.jsxs("span",{className:"text-2xs text-text-quaternary",children:["leading since ",C(r.takenAt)]}):null}),o&&e.jsx("p",{className:"text-2xs text-text-tertiary italic mb-4",children:"Loading the line…"}),d&&e.jsx("p",{className:"text-2xs text-status-error mb-4",children:d.message}),pe&&e.jsx("p",{className:"text-xs text-text-secondary mb-4","data-testid":"standing-by",children:"Standing by. Another replica leads this line; the tape stays live from the leader."}),r&&r.contested.length>0&&e.jsxs("p",{className:"text-2xs text-status-warning mb-4",children:["Contested: ",r.contested.map(y=>`${y.address} at ${y.station}`).join(", ")]}),e.jsx("div",{className:Pt,children:e.jsx(St,{machines:S,selectedId:m,onSelect:ue,view:de,onView:xe,attentionOnly:u,onAttentionOnly:g})}),e.jsx("div",{className:Ft,children:e.jsx(Rt,{events:N.events,total:N.total,paused:N.paused,heldCount:N.heldCount,filters:N.filters,machines:N.machines,channels:N.channels,setFilter:N.setFilter,togglePause:N.togglePause,clear:N.clear,onOpen:he,fullscreen:x,onFullscreen:h,watching:me,onWatch:()=>oe(Y)})})]})}export{Jt as LinePage};
5
- //# sourceMappingURL=LinePage-DPe-vP3-.js.map
5
+ //# sourceMappingURL=LinePage-CuHHHwBy.js.map