@hotmeshio/long-tail 0.10.13 → 0.10.14

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 (246) hide show
  1. package/README.md +2 -4
  2. package/build/api/escalations/metadata.js +1 -1
  3. package/build/api/escalations/resolve.js +4 -4
  4. package/build/services/escalation/resolver-validation.d.ts +1 -1
  5. package/build/services/escalation/resolver-validation.js +12 -5
  6. package/build/services/escalation/submit-guard.d.ts +29 -0
  7. package/build/services/escalation/submit-guard.js +57 -0
  8. package/build/shared/form-validation/index.d.ts +4 -0
  9. package/build/shared/form-validation/index.js +4 -0
  10. package/build/shared/form-validation/x-lt-labels.d.ts +28 -0
  11. package/build/shared/form-validation/x-lt-labels.js +42 -0
  12. package/build/shared/form-validation/x-lt-query.d.ts +56 -0
  13. package/build/shared/form-validation/x-lt-query.js +49 -0
  14. package/build/shared/form-validation/x-lt-submit-guard.d.ts +46 -0
  15. package/build/shared/form-validation/x-lt-submit-guard.js +25 -0
  16. package/build/shared/form-validation/x-lt-submit-on-claim.d.ts +22 -0
  17. package/build/shared/form-validation/x-lt-submit-on-claim.js +28 -0
  18. package/build/tsconfig.tsbuildinfo +1 -1
  19. package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js → AdminDashboard-Chg69wlx.js} +2 -2
  20. package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js.map → AdminDashboard-Chg69wlx.js.map} +1 -1
  21. package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js → AgentConfigPage-DRTFwbfC.js} +2 -2
  22. package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js.map → AgentConfigPage-DRTFwbfC.js.map} +1 -1
  23. package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js → AgentDetailPage-JKByfFIi.js} +3 -3
  24. package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js.map → AgentDetailPage-JKByfFIi.js.map} +1 -1
  25. package/dashboard/dist/assets/AgentsPage-BlgEmKhA.js +2 -0
  26. package/dashboard/dist/assets/{AgentsPage-CToVu1qj.js.map → AgentsPage-BlgEmKhA.js.map} +1 -1
  27. package/dashboard/dist/assets/AvailableEscalationsPage-C_7y692Q.js +2 -0
  28. package/dashboard/dist/assets/{AvailableEscalationsPage-DldboL4W.js.map → AvailableEscalationsPage-C_7y692Q.js.map} +1 -1
  29. package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js → BotPicker-CCVcz4Cq.js} +2 -2
  30. package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js.map → BotPicker-CCVcz4Cq.js.map} +1 -1
  31. package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js → CapabilitiesPage-Czi9jUwD.js} +2 -2
  32. package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js.map → CapabilitiesPage-Czi9jUwD.js.map} +1 -1
  33. package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js → CollapsibleSection-8YE965QX.js} +2 -2
  34. package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js.map → CollapsibleSection-8YE965QX.js.map} +1 -1
  35. package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js +2 -0
  36. package/dashboard/dist/assets/CountdownTimer-Bxvq3D7j.js.map +1 -0
  37. package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js → CredentialsPage-Bn7_SX6-.js} +2 -2
  38. package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js.map → CredentialsPage-Bn7_SX6-.js.map} +1 -1
  39. package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js → CronLabel-Bn4mX_Yn.js} +2 -2
  40. package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js.map → CronLabel-Bn4mX_Yn.js.map} +1 -1
  41. package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js → CustomDurationPicker-pMcrFyW6.js} +2 -2
  42. package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js.map → CustomDurationPicker-pMcrFyW6.js.map} +1 -1
  43. package/dashboard/dist/assets/{DropZone-CL9gA7pu.js → DropZone-zCEGjjk-.js} +2 -2
  44. package/dashboard/dist/assets/{DropZone-CL9gA7pu.js.map → DropZone-zCEGjjk-.js.map} +1 -1
  45. package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js → ElapsedCell-BGO7IXEg.js} +2 -2
  46. package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js.map → ElapsedCell-BGO7IXEg.js.map} +1 -1
  47. package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js → EscalationListSchemaPage-CFDxbd50.js} +3 -3
  48. package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js.map → EscalationListSchemaPage-CFDxbd50.js.map} +1 -1
  49. package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js → EscalationSchemaPage-DnXPnDkz.js} +3 -3
  50. package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js.map → EscalationSchemaPage-DnXPnDkz.js.map} +1 -1
  51. package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js → EscalationsOverview-BZMVXrkK.js} +2 -2
  52. package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js.map → EscalationsOverview-BZMVXrkK.js.map} +1 -1
  53. package/dashboard/dist/assets/EventTable-Bfi-f8as.js +2 -0
  54. package/dashboard/dist/assets/EventTable-Bfi-f8as.js.map +1 -0
  55. package/dashboard/dist/assets/FilterBar-Do7yR4xM.js +2 -0
  56. package/dashboard/dist/assets/FilterBar-Do7yR4xM.js.map +1 -0
  57. package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js → GraphInvokePage-d1ie4T7f.js} +2 -2
  58. package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js.map → GraphInvokePage-d1ie4T7f.js.map} +1 -1
  59. package/dashboard/dist/assets/{HomePage-Bcq10Bxx.js → HomePage-BEeodImU.js} +2 -2
  60. package/dashboard/dist/assets/{HomePage-Bcq10Bxx.js.map → HomePage-BEeodImU.js.map} +1 -1
  61. package/dashboard/dist/assets/{ListToolbar-IPXsTb3Q.js → ListToolbar-CLtw-1QN.js} +2 -2
  62. package/dashboard/dist/assets/{ListToolbar-IPXsTb3Q.js.map → ListToolbar-CLtw-1QN.js.map} +1 -1
  63. package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js → McpOverview-DIsy9TB3.js} +2 -2
  64. package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js.map → McpOverview-DIsy9TB3.js.map} +1 -1
  65. package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js → McpQueryDetailPage-6PomdsyD.js} +2 -2
  66. package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js.map → McpQueryDetailPage-6PomdsyD.js.map} +1 -1
  67. package/dashboard/dist/assets/McpQueryPage-YMdQCXm9.js +2 -0
  68. package/dashboard/dist/assets/{McpQueryPage-CNsuiw_q.js.map → McpQueryPage-YMdQCXm9.js.map} +1 -1
  69. package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js +2 -0
  70. package/dashboard/dist/assets/McpRunDetailPage-DsD1Gm2o.js.map +1 -0
  71. package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js → McpRunsPage--a5Jgb33.js} +2 -2
  72. package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js.map → McpRunsPage--a5Jgb33.js.map} +1 -1
  73. package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js → NamespacePill-wV6L4VW1.js} +2 -2
  74. package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js.map → NamespacePill-wV6L4VW1.js.map} +1 -1
  75. package/dashboard/dist/assets/OperationsPage-B2v9k3DT.js +2 -0
  76. package/dashboard/dist/assets/{OperationsPage-DvWrLuH6.js.map → OperationsPage-B2v9k3DT.js.map} +1 -1
  77. package/dashboard/dist/assets/OperatorDashboard-CkLfbxEh.js +2 -0
  78. package/dashboard/dist/assets/{OperatorDashboard-C-jE0IRA.js.map → OperatorDashboard-CkLfbxEh.js.map} +1 -1
  79. package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js → PageHeader-BtIr6r-8.js} +2 -2
  80. package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js.map → PageHeader-BtIr6r-8.js.map} +1 -1
  81. package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js → PageHeaderWithStats-C2sGqFQG.js} +2 -2
  82. package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js.map → PageHeaderWithStats-C2sGqFQG.js.map} +1 -1
  83. package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js → PersonaDetailPage-CCmOgKQb.js} +2 -2
  84. package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js.map → PersonaDetailPage-CCmOgKQb.js.map} +1 -1
  85. package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js → PersonasPage-BJkSuDTN.js} +2 -2
  86. package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js.map → PersonasPage-BJkSuDTN.js.map} +1 -1
  87. package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js → ProcessDetailPage-DT9BlJXK.js} +2 -2
  88. package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js.map → ProcessDetailPage-DT9BlJXK.js.map} +1 -1
  89. package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js → ProcessesListPage-DgSGzTDT.js} +2 -2
  90. package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js.map → ProcessesListPage-DgSGzTDT.js.map} +1 -1
  91. package/dashboard/dist/assets/{RoleDetailPage-BKkUvTO-.js → RoleDetailPage-DMphTvro.js} +2 -2
  92. package/dashboard/dist/assets/{RoleDetailPage-BKkUvTO-.js.map → RoleDetailPage-DMphTvro.js.map} +1 -1
  93. package/dashboard/dist/assets/{RolePill-CnuBPhPw.js → RolePill-BBYjhAPj.js} +2 -2
  94. package/dashboard/dist/assets/{RolePill-CnuBPhPw.js.map → RolePill-BBYjhAPj.js.map} +1 -1
  95. package/dashboard/dist/assets/{RolesPage-BHzWK9n6.js → RolesPage-gi_kaot1.js} +2 -2
  96. package/dashboard/dist/assets/{RolesPage-BHzWK9n6.js.map → RolesPage-gi_kaot1.js.map} +1 -1
  97. package/dashboard/dist/assets/RunAsSelector-CateuvcC.js +2 -0
  98. package/dashboard/dist/assets/{RunAsSelector-CS3KQ-BF.js.map → RunAsSelector-CateuvcC.js.map} +1 -1
  99. package/dashboard/dist/assets/{ScanCodesPage-BW4P4zWf.js → ScanCodesPage-CQ8RxMug.js} +2 -2
  100. package/dashboard/dist/assets/{ScanCodesPage-BW4P4zWf.js.map → ScanCodesPage-CQ8RxMug.js.map} +1 -1
  101. package/dashboard/dist/assets/{ScanSchemeDetailPage-BLykA4j-.js → ScanSchemeDetailPage-puSbuxcV.js} +2 -2
  102. package/dashboard/dist/assets/{ScanSchemeDetailPage-BLykA4j-.js.map → ScanSchemeDetailPage-puSbuxcV.js.map} +1 -1
  103. package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js → ScopeBadge-xs2Nhjy4.js} +2 -2
  104. package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js.map → ScopeBadge-xs2Nhjy4.js.map} +1 -1
  105. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js +2 -0
  106. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js.map +1 -0
  107. package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js +2 -0
  108. package/dashboard/dist/assets/StickyPagination-Cg-QdYWL.js.map +1 -0
  109. package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js → StreamMessageDetail-DEeuh4_-.js} +2 -2
  110. package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js.map → StreamMessageDetail-DEeuh4_-.js.map} +1 -1
  111. package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js → SwimlaneTimeline-DMY0jL2F.js} +2 -2
  112. package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js.map → SwimlaneTimeline-DMY0jL2F.js.map} +1 -1
  113. package/dashboard/dist/assets/{TagInput-BbZ25nNe.js → TagInput-BMmiV-MD.js} +2 -2
  114. package/dashboard/dist/assets/{TagInput-BbZ25nNe.js.map → TagInput-BMmiV-MD.js.map} +1 -1
  115. package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js → TaskDetailPage-CPbkIvfF.js} +2 -2
  116. package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js.map → TaskDetailPage-CPbkIvfF.js.map} +1 -1
  117. package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js → TaskQueuePill-DLgYaw1x.js} +2 -2
  118. package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js.map → TaskQueuePill-DLgYaw1x.js.map} +1 -1
  119. package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js → TasksListPage-CtHudKhQ.js} +2 -2
  120. package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js.map → TasksListPage-CtHudKhQ.js.map} +1 -1
  121. package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js → TimeAgo-BdHOizWg.js} +2 -2
  122. package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js.map → TimeAgo-BdHOizWg.js.map} +1 -1
  123. package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js → TimestampCell-FVukzKRe.js} +2 -2
  124. package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js.map → TimestampCell-FVukzKRe.js.map} +1 -1
  125. package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js → ToolPill-BvS53hxP.js} +2 -2
  126. package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js.map → ToolPill-BvS53hxP.js.map} +1 -1
  127. package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js → ToolTestPanel-HN0OCYTL.js} +2 -2
  128. package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js.map → ToolTestPanel-HN0OCYTL.js.map} +1 -1
  129. package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js → TopicDetailPage-DHdSpN61.js} +4 -4
  130. package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js.map → TopicDetailPage-DHdSpN61.js.map} +1 -1
  131. package/dashboard/dist/assets/{TopicsPage-1VAc29Qw.js → TopicsPage-Clr6Tl5P.js} +2 -2
  132. package/dashboard/dist/assets/{TopicsPage-1VAc29Qw.js.map → TopicsPage-Clr6Tl5P.js.map} +1 -1
  133. package/dashboard/dist/assets/{UserName-DikzjQHJ.js → UserName-BUVYyIAS.js} +2 -2
  134. package/dashboard/dist/assets/{UserName-DikzjQHJ.js.map → UserName-BUVYyIAS.js.map} +1 -1
  135. package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js +2 -0
  136. package/dashboard/dist/assets/WorkflowExecutionPage-kncWFfe5.js.map +1 -0
  137. package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js → WorkflowPill-BPC_Dc_I.js} +2 -2
  138. package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js.map → WorkflowPill-BPC_Dc_I.js.map} +1 -1
  139. package/dashboard/dist/assets/WorkflowsDashboard-4ypPDGKx.js +2 -0
  140. package/dashboard/dist/assets/{WorkflowsDashboard-BMQd_0tW.js.map → WorkflowsDashboard-4ypPDGKx.js.map} +1 -1
  141. package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js → WorkflowsOverview-CeQlZkkd.js} +2 -2
  142. package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js.map → WorkflowsOverview-CeQlZkkd.js.map} +1 -1
  143. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js → YamlWorkflowDetailPage-DLAlEzwT.js} +10 -10
  144. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js.map → YamlWorkflowDetailPage-DLAlEzwT.js.map} +1 -1
  145. package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js → YamlWorkflowsPage-DQhenKFT.js} +2 -2
  146. package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js.map → YamlWorkflowsPage-DQhenKFT.js.map} +1 -1
  147. package/dashboard/dist/assets/{agents-BZJLIJ4h.js → agents-s3feet3W.js} +2 -2
  148. package/dashboard/dist/assets/{agents-BZJLIJ4h.js.map → agents-s3feet3W.js.map} +1 -1
  149. package/dashboard/dist/assets/{bots-ClLcDGJb.js → bots-CkSd2rn9.js} +2 -2
  150. package/dashboard/dist/assets/{bots-ClLcDGJb.js.map → bots-CkSd2rn9.js.map} +1 -1
  151. package/dashboard/dist/assets/capabilities-DA_r09tM.js +2 -0
  152. package/dashboard/dist/assets/{capabilities-IaCcS7ge.js.map → capabilities-DA_r09tM.js.map} +1 -1
  153. package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js → controlplane-C9c25q21.js} +2 -2
  154. package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js.map → controlplane-C9c25q21.js.map} +1 -1
  155. package/dashboard/dist/assets/{escalation-columns-BY2mg9DY.js → escalation-columns-Cp3UrT48.js} +2 -2
  156. package/dashboard/dist/assets/{escalation-columns-BY2mg9DY.js.map → escalation-columns-Cp3UrT48.js.map} +1 -1
  157. package/dashboard/dist/assets/{index-CJu2PBNx.js → index--7Vdkzwd.js} +2 -2
  158. package/dashboard/dist/assets/{index-CJu2PBNx.js.map → index--7Vdkzwd.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-CfAi1OsI.js → index--DG-qQBT.js} +26 -26
  160. package/dashboard/dist/assets/index--DG-qQBT.js.map +1 -0
  161. package/dashboard/dist/assets/{index-CmnNqpWg.js → index-BIcYbDVf.js} +2 -2
  162. package/dashboard/dist/assets/{index-CmnNqpWg.js.map → index-BIcYbDVf.js.map} +1 -1
  163. package/dashboard/dist/assets/index-BU5FFAJo.js +2 -0
  164. package/dashboard/dist/assets/{index-CLmZaNTK.js.map → index-BU5FFAJo.js.map} +1 -1
  165. package/dashboard/dist/assets/{index-yGNt29V9.js → index-Bo5TtX9l.js} +2 -2
  166. package/dashboard/dist/assets/{index-yGNt29V9.js.map → index-Bo5TtX9l.js.map} +1 -1
  167. package/dashboard/dist/assets/{index-BqGnhkh0.js → index-C-MmR-jf.js} +2 -2
  168. package/dashboard/dist/assets/{index-BqGnhkh0.js.map → index-C-MmR-jf.js.map} +1 -1
  169. package/dashboard/dist/assets/{index-BzkE48xJ.js → index-C7ABSOU2.js} +2 -2
  170. package/dashboard/dist/assets/{index-BzkE48xJ.js.map → index-C7ABSOU2.js.map} +1 -1
  171. package/dashboard/dist/assets/index-Cmxzk4ay.js +5 -0
  172. package/dashboard/dist/assets/{index-CvNBdkB1.js.map → index-Cmxzk4ay.js.map} +1 -1
  173. package/dashboard/dist/assets/{index-C3o4OisO.js → index-Cw9poaez.js} +2 -2
  174. package/dashboard/dist/assets/{index-C3o4OisO.js.map → index-Cw9poaez.js.map} +1 -1
  175. package/dashboard/dist/assets/index-DEbY57_c.js +3 -0
  176. package/dashboard/dist/assets/index-DEbY57_c.js.map +1 -0
  177. package/dashboard/dist/assets/index-DnV6LSeY.css +1 -0
  178. package/dashboard/dist/assets/{index-D0zFReGL.js → index-DvoMXQqO.js} +2 -2
  179. package/dashboard/dist/assets/{index-D0zFReGL.js.map → index-DvoMXQqO.js.map} +1 -1
  180. package/dashboard/dist/assets/{index-kiKZresb.js → index-S13oPvuS.js} +2 -2
  181. package/dashboard/dist/assets/{index-kiKZresb.js.map → index-S13oPvuS.js.map} +1 -1
  182. package/dashboard/dist/assets/index-WxE3ONia.js +2 -0
  183. package/dashboard/dist/assets/{index-Dldi3Q3M.js.map → index-WxE3ONia.js.map} +1 -1
  184. package/dashboard/dist/assets/{knowledge-DWLxGTib.js → knowledge-Bpln0zy_.js} +2 -2
  185. package/dashboard/dist/assets/{knowledge-DWLxGTib.js.map → knowledge-Bpln0zy_.js.map} +1 -1
  186. package/dashboard/dist/assets/{mcp-B6AARZ2I.js → mcp-BqDq3RZH.js} +2 -2
  187. package/dashboard/dist/assets/{mcp-B6AARZ2I.js.map → mcp-BqDq3RZH.js.map} +1 -1
  188. package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js → mcp-query-DGue75R6.js} +2 -2
  189. package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js.map → mcp-query-DGue75R6.js.map} +1 -1
  190. package/dashboard/dist/assets/{personas-Cmz2SAEU.js → personas-B8z_sTiJ.js} +2 -2
  191. package/dashboard/dist/assets/{personas-Cmz2SAEU.js.map → personas-B8z_sTiJ.js.map} +1 -1
  192. package/dashboard/dist/assets/{pipelines-CSgfVCMy.js → pipelines-DYgNd9nB.js} +2 -2
  193. package/dashboard/dist/assets/{pipelines-CSgfVCMy.js.map → pipelines-DYgNd9nB.js.map} +1 -1
  194. package/dashboard/dist/assets/{tasks-UOtUkDk-.js → tasks-CJdjjhgO.js} +2 -2
  195. package/dashboard/dist/assets/{tasks-UOtUkDk-.js.map → tasks-CJdjjhgO.js.map} +1 -1
  196. package/dashboard/dist/assets/{topics-Df5hGh6o.js → topics-DPrL8Dtq.js} +2 -2
  197. package/dashboard/dist/assets/{topics-Df5hGh6o.js.map → topics-DPrL8Dtq.js.map} +1 -1
  198. package/dashboard/dist/assets/{useEventHooks-PDbuSJ12.js → useEventHooks-DXCgDgiu.js} +2 -2
  199. package/dashboard/dist/assets/{useEventHooks-PDbuSJ12.js.map → useEventHooks-DXCgDgiu.js.map} +1 -1
  200. package/dashboard/dist/assets/{useNamespace-tZSOlge3.js → useNamespace-DnFZfy7N.js} +2 -2
  201. package/dashboard/dist/assets/{useNamespace-tZSOlge3.js.map → useNamespace-DnFZfy7N.js.map} +1 -1
  202. package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js → useYamlActivityEvents-kx5CLENv.js} +2 -2
  203. package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js.map → useYamlActivityEvents-kx5CLENv.js.map} +1 -1
  204. package/dashboard/dist/assets/{users-G8qwyZKS.js → users-DKng7vAG.js} +2 -2
  205. package/dashboard/dist/assets/{users-G8qwyZKS.js.map → users-DKng7vAG.js.map} +1 -1
  206. package/dashboard/dist/assets/{vendor-icons-BpZiWH2f.js → vendor-icons-CN-bAo9U.js} +138 -133
  207. package/dashboard/dist/assets/vendor-icons-CN-bAo9U.js.map +1 -0
  208. package/dashboard/dist/assets/{workflows-DbPqi1TW.js → workflows-C4V0rMkM.js} +2 -2
  209. package/dashboard/dist/assets/{workflows-DbPqi1TW.js.map → workflows-C4V0rMkM.js.map} +1 -1
  210. package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js → yaml-workflows-D3PAiJ9d.js} +2 -2
  211. package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js.map → yaml-workflows-D3PAiJ9d.js.map} +1 -1
  212. package/dashboard/dist/index.html +3 -3
  213. package/docs/design-principles.md +9 -7
  214. package/docs/hitl/x-lt-embed.md +8 -4
  215. package/docs/hitl/x-lt-footer.md +68 -0
  216. package/docs/hitl/x-lt-list-schema.md +10 -3
  217. package/docs/hitl-guide.md +9 -0
  218. package/package.json +1 -1
  219. package/dashboard/dist/assets/AgentsPage-CToVu1qj.js +0 -2
  220. package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js +0 -2
  221. package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js +0 -2
  222. package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js.map +0 -1
  223. package/dashboard/dist/assets/EventTable-CwPWl163.js +0 -2
  224. package/dashboard/dist/assets/EventTable-CwPWl163.js.map +0 -1
  225. package/dashboard/dist/assets/FilterBar-D7GghUsU.js +0 -2
  226. package/dashboard/dist/assets/FilterBar-D7GghUsU.js.map +0 -1
  227. package/dashboard/dist/assets/McpQueryPage-CNsuiw_q.js +0 -2
  228. package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js +0 -2
  229. package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js.map +0 -1
  230. package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js +0 -2
  231. package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js +0 -2
  232. package/dashboard/dist/assets/RunAsSelector-CS3KQ-BF.js +0 -2
  233. package/dashboard/dist/assets/StickyPagination-hMrnLXde.js +0 -2
  234. package/dashboard/dist/assets/StickyPagination-hMrnLXde.js.map +0 -1
  235. package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js +0 -2
  236. package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js.map +0 -1
  237. package/dashboard/dist/assets/WorkflowsDashboard-BMQd_0tW.js +0 -2
  238. package/dashboard/dist/assets/capabilities-IaCcS7ge.js +0 -2
  239. package/dashboard/dist/assets/index-CLmZaNTK.js +0 -2
  240. package/dashboard/dist/assets/index-CfAi1OsI.js.map +0 -1
  241. package/dashboard/dist/assets/index-CvNBdkB1.js +0 -5
  242. package/dashboard/dist/assets/index-Dldi3Q3M.js +0 -2
  243. package/dashboard/dist/assets/index-mKcQGi2B.js +0 -3
  244. package/dashboard/dist/assets/index-mKcQGi2B.js.map +0 -1
  245. package/dashboard/dist/assets/index-zQiUPfxA.css +0 -1
  246. package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventTable-CwPWl163.js","sources":["../../src/hooks/useCollapsedSections.ts","../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\n\nconst STORAGE_KEY = 'lt-collapsed-sections';\n\nfunction load(pageKey: string): Set<string> {\n try {\n const raw = localStorage.getItem(`${STORAGE_KEY}:${pageKey}`);\n if (!raw) return new Set();\n return new Set(JSON.parse(raw));\n } catch {\n return new Set();\n }\n}\n\nfunction save(pageKey: string, set: Set<string>) {\n localStorage.setItem(`${STORAGE_KEY}:${pageKey}`, JSON.stringify([...set]));\n}\n\nexport function useCollapsedSections(pageKey: string) {\n const [collapsed, setCollapsed] = useState<Set<string>>(() => load(pageKey));\n\n const isCollapsed = useCallback(\n (section: string) => collapsed.has(section),\n [collapsed],\n );\n\n const toggle = useCallback(\n (section: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(section)) {\n next.delete(section);\n } else {\n next.add(section);\n }\n save(pageKey, next);\n return next;\n });\n },\n [pageKey],\n );\n\n const collapse = useCallback(\n (section: string) => {\n setCollapsed((prev) => {\n if (prev.has(section)) return prev;\n const next = new Set(prev);\n next.add(section);\n save(pageKey, next);\n return next;\n });\n },\n [pageKey],\n );\n\n const expand = useCallback(\n (section: string) => {\n setCollapsed((prev) => {\n if (!prev.has(section)) return prev;\n const next = new Set(prev);\n next.delete(section);\n save(pageKey, next);\n return next;\n });\n },\n [pageKey],\n );\n\n return { isCollapsed, toggle, collapse, expand };\n}\n","import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n /** Job id (workflowId) — enables the per-activity raw-stream drill-down. */\n jid?: string;\n /** HotMesh namespace / DB schema for the raw-stream lookup (default: durable). */\n appId?: string;\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks, jid, appId }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-status-active';\n case 'signal':\n return 'bg-status-success';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-accent';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-2xs text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-2xs text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n &#9654;\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-2.5 h-2.5 rounded-full dot-ring bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-2xs font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n jid={jid}\n appId={appId}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STORAGE_KEY","load","pageKey","raw","save","set","useCollapsedSections","collapsed","setCollapsed","useState","isCollapsed","useCallback","section","toggle","prev","next","collapse","expand","STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","jid","appId","categoryFilter","setCategoryFilter","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","allExpanded","toggleAll","jsxs","jsx","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as r,j as e}from"./vendor-query-RUZdMvN6.js";import{aj as j}from"./index-CfAi1OsI.js";import{g as y,X as v}from"./vendor-icons-BpZiWH2f.js";const m=r.createContext("inline"),d="filter-bar";function b({store:s}){const n=r.useSyncExternalStore(c=>(s.current.listeners.add(c),()=>s.current.listeners.delete(c)),()=>s.current.children);return e.jsx(e.Fragment,{children:n})}function E({children:s,actions:n,activeFilterCount:c}){const t=j(),i=t==null?void 0:t.setPanel,l=t==null?void 0:t.closePanel,o=((t==null?void 0:t.open)??!1)&&(t==null?void 0:t.ownerKey)===d,[a,u]=r.useState(!1),x=r.useRef({children:s,listeners:new Set});r.useEffect(()=>{x.current.children=s,x.current.listeners.forEach(h=>h())},[s]);const p=()=>{u(!1),l==null||l(d)},f=r.useRef(!1);return r.useEffect(()=>{if(o){f.current=!0;return}f.current&&(f.current=!1,u(!1))},[o]),r.useEffect(()=>()=>l==null?void 0:l(d),[l]),e.jsx("div",{className:"sticky top-0 z-20 bg-surface pt-3 pb-3",children:e.jsx("div",{className:"bg-surface-sunken rounded-lg px-4 py-2.5 @container/filters",children:e.jsxs("div",{className:"flex items-center gap-x-4 gap-y-2 flex-wrap",children:[e.jsx("div",{className:"hidden @filters/filters:contents",children:s}),e.jsxs("button",{onClick:()=>{a?p():(u(!0),i==null||i(e.jsx(w,{onClose:p,children:e.jsx(b,{store:x})}),{width:320,key:d}))},className:"@filters/filters:hidden inline-flex items-center gap-1.5 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors","aria-expanded":a,"aria-label":"Filters",children:[e.jsx(y,{className:"w-3.5 h-3.5"}),"Filters",c!=null&&c>0&&e.jsx("span",{className:"rounded-full bg-accent/10 text-accent px-1.5 text-2xs tabular-nums font-semibold",children:c})]}),n&&e.jsx("div",{className:"ml-auto flex items-center gap-2",children:n})]})})})}function w({children:s,onClose:n}){return e.jsxs("div",{className:"h-full overflow-y-auto",children:[e.jsxs("div",{className:"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface-raised border-b border-surface-border/50",children:[e.jsx("span",{className:"text-xs font-semibold text-text-primary",children:"Filters"}),e.jsx("button",{onClick:n,className:"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors",title:"Close",children:e.jsx(v,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"px-4 py-3 space-y-4",children:e.jsx(m.Provider,{value:"stacked",children:s})})]})}function F(){return null}function S({label:s,value:n,onChange:c,options:t,required:i,placeholder:l}){const o=r.useContext(m);return e.jsxs("div",{className:o==="stacked"?"flex flex-col gap-1":"flex items-center gap-2",children:[e.jsx("label",{className:"text-2xs font-medium text-text-tertiary whitespace-nowrap",children:s}),e.jsxs("select",{value:n,onChange:a=>c(a.target.value),className:`select text-2xs py-1 ${o==="stacked"?"w-full":"w-auto min-w-[6rem]"}`,children:[!i&&e.jsx("option",{value:"",children:l||"All"}),t.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))]})]})}function C({label:s,value:n,onChange:c,placeholder:t}){const i=r.useContext(m),[l,o]=r.useState(n),a=r.useRef(void 0);r.useEffect(()=>{o(n)},[n]);const u=x=>{o(x),clearTimeout(a.current),a.current=setTimeout(()=>c(x),300)};return r.useEffect(()=>()=>clearTimeout(a.current),[]),e.jsxs("div",{className:i==="stacked"?"flex flex-col gap-1":"flex items-center gap-2",children:[e.jsx("label",{className:"text-2xs font-medium text-text-tertiary whitespace-nowrap",children:s}),e.jsx("input",{type:"text",value:l,onChange:x=>u(x.target.value),placeholder:t,className:`input text-2xs py-1 font-mono ${i==="stacked"?"w-full":"w-36 min-w-0 max-w-full"}`})]})}export{E as F,C as a,S as b,F as c};
2
- //# sourceMappingURL=FilterBar-D7GghUsU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FilterBar-D7GghUsU.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react';\nimport { SlidersHorizontal, X } from 'lucide-react';\nimport { useShellPanelOptional } from '../../../hooks/useShellPanel';\n\n/**\n * Filter layout context — the same controlled FilterSelect/FilterInput\n * children render inline in the bar (label beside control) or stacked in the\n * shell panel (label above control, full width). State stays URL-driven, so\n * the two surfaces are always in sync.\n */\nconst FilterLayoutContext = createContext<'inline' | 'stacked'>('inline');\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n /** Count for the folded Filters button's badge (active, non-default filters). */\n activeFilterCount?: number;\n}\n\n/**\n * The filter band. Geometry follows the container: at `@filters` width the\n * controls render inline and wrap as whole units; below it they fold behind\n * one Filters button that opens the same controls, stacked, in the shell's\n * right panel. The outer div stays sticky — sticky elements are never\n * containers, so the container sits on the inner band.\n */\n/** Shell-panel ownership key — the slot is shared with page panels. */\nconst FILTERS_PANEL_KEY = 'filter-bar';\n\n/**\n * Live-children bridge. The stacked panel renders in the shell's subtree, so\n * a snapshot node would go stale the moment a URL-driven filter changes..\n * Re-invoking setPanel every render to freshen it is worse: it loops (each\n * setPanel re-renders the provider, which re-creates children) and the loop\n * races the close click — a stale pass re-opens the panel just closed. So the\n * slot is claimed ONCE with a subscriber that pulls the latest children.\n */\ninterface LiveChildrenStore {\n children: ReactNode;\n listeners: Set<() => void>;\n}\n\nfunction LiveChildren({ store }: { store: { current: LiveChildrenStore } }) {\n const children = useSyncExternalStore(\n (onChange) => {\n store.current.listeners.add(onChange);\n return () => store.current.listeners.delete(onChange);\n },\n () => store.current.children,\n );\n return <>{children}</>;\n}\n\nexport function FilterBar({ children, actions, activeFilterCount }: FilterBarProps) {\n // Outside the shell (tests, standalone surfaces) there is no panel to fold\n // into — the fold button becomes inert and inline mode carries the day.\n const shellPanel = useShellPanelOptional();\n const setPanel = shellPanel?.setPanel;\n const closePanel = shellPanel?.closePanel;\n const ownsPanel = (shellPanel?.open ?? false) && shellPanel?.ownerKey === FILTERS_PANEL_KEY;\n const [foldOpen, setFoldOpen] = useState(false);\n\n // Publish the freshest children to the mounted panel after every commit.\n const liveStore = useRef<LiveChildrenStore>({ children, listeners: new Set() });\n useEffect(() => {\n liveStore.current.children = children;\n liveStore.current.listeners.forEach((notify) => notify());\n }, [children]);\n\n const closeFold = () => {\n setFoldOpen(false);\n closePanel?.(FILTERS_PANEL_KEY);\n };\n\n // The slot is shared: when it closes from anywhere (route change, its own\n // X) or another claimant takes it, stand down so the button never lies.\n const ownedRef = useRef(false);\n useEffect(() => {\n if (ownsPanel) {\n ownedRef.current = true;\n return;\n }\n if (ownedRef.current) {\n ownedRef.current = false;\n setFoldOpen(false);\n }\n }, [ownsPanel]);\n\n // Unmount: release the slot if it is still ours (keyed — never yanks a\n // panel another claimant owns).\n useEffect(() => () => closePanel?.(FILTERS_PANEL_KEY), [closePanel]);\n\n return (\n <div className=\"sticky top-0 z-20 bg-surface pt-3 pb-3\">\n <div className=\"bg-surface-sunken rounded-lg px-4 py-2.5 @container/filters\">\n {/* One row, one actions slot. The children swap geometry: inline\n controls at @filters width, one Filters button below it. */}\n <div className=\"flex items-center gap-x-4 gap-y-2 flex-wrap\">\n <div className=\"hidden @filters/filters:contents\">{children}</div>\n <button\n onClick={() => {\n // Claim the slot on click — a click is intent, and it wins even\n // when a page panel (e.g. the faceted query) currently holds it.\n if (foldOpen) {\n closeFold();\n } else {\n setFoldOpen(true);\n setPanel?.(\n <StackedFilterPanel onClose={closeFold}>\n <LiveChildren store={liveStore} />\n </StackedFilterPanel>,\n { width: 320, key: FILTERS_PANEL_KEY },\n );\n }\n }}\n className=\"@filters/filters:hidden inline-flex items-center gap-1.5 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n aria-expanded={foldOpen}\n aria-label=\"Filters\"\n >\n <SlidersHorizontal className=\"w-3.5 h-3.5\" />\n Filters\n {activeFilterCount != null && activeFilterCount > 0 && (\n <span className=\"rounded-full bg-accent/10 text-accent px-1.5 text-2xs tabular-nums font-semibold\">\n {activeFilterCount}\n </span>\n )}\n </button>\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n </div>\n );\n}\n\nfunction StackedFilterPanel({ children, onClose }: { children: ReactNode; onClose: () => void }) {\n return (\n <div className=\"h-full overflow-y-auto\">\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface-raised border-b border-surface-border/50\">\n <span className=\"text-xs font-semibold text-text-primary\">Filters</span>\n <button\n onClick={onClose}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-3 space-y-4\">\n <FilterLayoutContext.Provider value=\"stacked\">\n {children}\n </FilterLayoutContext.Provider>\n </div>\n </div>\n );\n}\n\n/**\n * @deprecated The pipe separator is retired — the field fill + gap already\n * separate filters. Kept as a no-op so existing call sites don't break.\n */\nexport function FilterDivider() {\n return null;\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n const layout = useContext(FilterLayoutContext);\n return (\n <div className={layout === 'stacked' ? 'flex flex-col gap-1' : 'flex items-center gap-2'}>\n <label className=\"text-2xs font-medium text-text-tertiary whitespace-nowrap\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={`select text-2xs py-1 ${layout === 'stacked' ? 'w-full' : 'w-auto min-w-[6rem]'}`}\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const layout = useContext(FilterLayoutContext);\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className={layout === 'stacked' ? 'flex flex-col gap-1' : 'flex items-center gap-2'}>\n <label className=\"text-2xs font-medium text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className={`input text-2xs py-1 font-mono ${layout === 'stacked' ? 'w-full' : 'w-36 min-w-0 max-w-full'}`}\n />\n </div>\n );\n}\n"],"names":["FilterLayoutContext","createContext","FILTERS_PANEL_KEY","LiveChildren","store","children","useSyncExternalStore","onChange","FilterBar","actions","activeFilterCount","shellPanel","useShellPanelOptional","setPanel","closePanel","ownsPanel","foldOpen","setFoldOpen","useState","liveStore","useRef","useEffect","notify","closeFold","ownedRef","jsx","jsxs","StackedFilterPanel","SlidersHorizontal","onClose","X","FilterDivider","FilterSelect","label","value","options","required","placeholder","layout","useContext","e","opt","FilterInput","local","setLocal","timerRef","handleChange","v"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as e}from"./vendor-query-RUZdMvN6.js";import{P as j}from"./PageHeader-Ce4GcIYo.js";import{D as _}from"./DataTable-Bir0Xs1p.js";import{F as v,b as f}from"./FilterBar-D7GghUsU.js";import{S as P}from"./StickyPagination-hMrnLXde.js";import{L as N}from"./ListToolbar-IPXsTb3Q.js";import{b as C}from"./api-path-u2Jf9QXS.js";import{T as h}from"./TimestampCell-C7rkC9nh.js";import{E as $}from"./ElapsedCell-BZVkVxE0.js";import{W}from"./WorkflowPill-Da406nEj.js";import{E as S}from"./EmptyState-lpUFYfun.js";import{R as c}from"./RowActions-eYrzgQSj.js";import{u as q}from"./useFilterParams-crmlBw_l.js";import{b as T}from"./useEventHooks-PDbuSJ12.js";import{u as D}from"./mcp-query-DrkvBU3a.js";import{k as y,J as B,K as g,O as k,Q as F,V as L}from"./vendor-icons-BpZiWH2f.js";import{u as M}from"./vendor-react-CdqEC2zv.js";import"./index-CfAi1OsI.js";const E={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"};function p(s){return s.status==="completed"||Number(s.status)===0?"completed":s.is_live?"in_progress":"failed"}function R(s){return[{key:"workflow_id",label:"Workflow ID / Type",render:t=>{const o=p(t),a=E[o]??"bg-status-pending",l=o==="in_progress"?" animate-pulse":"";return e.jsxs("div",{className:"flex items-start gap-2 min-w-0",children:[e.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring mt-1 ${a}${l}`,title:o}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"font-mono text-xs text-text-primary truncate block",children:t.workflow_id}),e.jsx("div",{className:"mt-0.5",children:e.jsx(W,{type:t.entity||"unknown"})})]})]})}},{key:"created_at",label:"Created",render:t=>e.jsx(h,{date:t.created_at}),className:"w-40",sortable:!0},{key:"updated_at",label:"Updated",render:t=>e.jsx(h,{date:t.updated_at}),className:"w-40",sortable:!0},{key:"duration",label:"Duration",render:t=>{const o=p(t);return e.jsx($,{startDate:t.created_at,endDate:o==="in_progress"?null:t.updated_at,isLive:o==="in_progress"})},className:"w-28"},{key:"actions",label:"",className:"w-28",render:t=>{const a=p(t)==="completed",l=t.entity==="mcpWorkflowBuilder";if(t.entity==="mcpWorkflowPlanner"){const r=t.set_id?`/mcp/queries/${t.workflow_id}?mode=plan&set_id=${t.set_id}`:`/mcp/queries/${t.workflow_id}?mode=plan`;return e.jsxs(c,{children:[e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Plan",children:e.jsx(B,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:n=>{n.stopPropagation(),s(`${r}&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Build":"Planning...",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}return l?e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?mode=builder&step=2`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Profile":"Building...",disabled:!a,children:e.jsx(F,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}):e.jsxs(c,{children:[e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=1`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-accent transition-all",title:"Describe",children:e.jsx(k,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=2`)},className:"opacity-0 group-hover/row:opacity-100 text-text-tertiary hover:text-status-warning transition-all",title:"Discover",children:e.jsx(L,{className:"w-3.5 h-3.5",strokeWidth:1.5})}),e.jsx("button",{onClick:r=>{r.stopPropagation(),s(`/mcp/queries/${t.workflow_id}?step=3`)},className:`opacity-0 group-hover/row:opacity-100 transition-all ${a?"text-text-tertiary hover:text-status-success":"text-text-tertiary/30 cursor-not-allowed"}`,title:a?"Compile":"Complete discovery first",disabled:!a,children:e.jsx(g,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]})}}]}function ae(){const s=M(),t=R(s),{filters:o,setFilter:a,pagination:l,sort:d,setSort:r}=q({filters:{search:"",status:"",type:""},pageSize:20}),{data:n,isLoading:m,refetch:b}=D({limit:l.pageSize,offset:l.offset,search:o.search,status:o.status,entity:o.type||void 0});T();const u=(n==null?void 0:n.jobs)??[],x=(n==null?void 0:n.total)??0;return e.jsxs(e.Fragment,{children:[e.jsx(j,{title:"MCP Tool Designer",docsHash:"#docs:dashboard.md:mcp-tool-designer",actions:e.jsxs("button",{onClick:()=>s("/mcp/queries/new"),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(y,{className:"w-3.5 h-3.5",strokeWidth:1.5}),"Create New MCP Tool"]})}),e.jsxs(v,{actions:e.jsx(N,{onRefresh:()=>b(),apiPath:C("/workflow-states/jobs",{entity:o.type||"mcpQuery,mcpTriage,mcpWorkflowPlanner",limit:l.pageSize,offset:l.offset,sort_by:"created_at",order:"desc",status:o.status||void 0,search:o.search||void 0})}),children:[e.jsx(f,{label:"Type",value:o.type,onChange:i=>a("type",i),options:[{value:"mcpQuery",label:"Discovery"},{value:"mcpWorkflowPlanner",label:"Build"},{value:"mcpTriage",label:"Triage"}]}),e.jsx(f,{label:"Status",value:o.status,onChange:i=>a("status",i),options:[{value:"completed",label:"Completed"},{value:"running",label:"Running"},{value:"failed",label:"Failed"}]})]}),e.jsx(_,{columns:t,data:u,keyFn:i=>i.workflow_id,onRowClick:i=>{if(i.entity==="mcpWorkflowPlanner"){const w=i.set_id?`/mcp/queries/${i.workflow_id}?mode=plan&set_id=${i.set_id}`:`/mcp/queries/${i.workflow_id}?mode=plan`;s(w)}else i.entity==="mcpWorkflowBuilder"?s(`/mcp/queries/${i.workflow_id}?mode=builder`):s(`/mcp/queries/${i.workflow_id}`)},isLoading:m,emptyMessage:"",sort:d,onSort:r}),!m&&u.length===0&&e.jsx("div",{className:"cursor-pointer",onClick:()=>s("/mcp/queries/new"),children:e.jsx(S,{icon:y,title:"No tool designs yet",description:"Click to create your first MCP tool"})}),e.jsx(P,{page:l.page,pageSize:l.pageSize,total:x,totalPages:l.totalPages(x),onPageChange:l.setPage})]})}export{ae as McpQueryPage};
2
- //# sourceMappingURL=McpQueryPage-CNsuiw_q.js.map
@@ -1,2 +0,0 @@
1
- import{b as R,a as m,j as e}from"./vendor-query-RUZdMvN6.js";import{b as D,c as L}from"./pipelines-CSgfVCMy.js";import{u as J,c as K,D as M,b as S,J as _,N as U}from"./index-CfAi1OsI.js";import{S as $}from"./StatusBadge-DkgllZHv.js";import{P as E}from"./PageHeader-Ce4GcIYo.js";import{C as A}from"./CopyableId-4Lqlc5cU.js";import{C as b}from"./CollapsibleSection-CDADefUY.js";import{u as V,E as q}from"./EventTable-CwPWl163.js";import{L as B}from"./ListToolbar-IPXsTb3Q.js";import{S as F}from"./SwimlaneTimeline-BlzV74V5.js";import{e as H,f as Q}from"./vendor-react-CdqEC2zv.js";import"./vendor-icons-BpZiWH2f.js";import"./FilterBar-D7GghUsU.js";import"./StreamMessageDetail-DyJyZwBl.js";const z={running:"in_progress",completed:"completed",failed:"failed"};function O({isRunning:a,onTerminate:l}){const[s,n]=m.useState(!1),t=m.useRef(null);return m.useEffect(()=>{if(!s)return;const o=i=>{t.current&&!t.current.contains(i.target)&&n(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[s]),a?e.jsxs("div",{className:"relative",ref:t,children:[e.jsx("button",{onClick:()=>n(!s),className:"btn-primary text-xs",children:"Actions"}),s&&e.jsx("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]",children:e.jsx("button",{onClick:()=>{l(),n(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"})})]}):null}function oe(){var N,w;const{jobId:a}=H(),[l]=Q(),s=l.get("namespace")||"",n=R(),{data:t,isLoading:o,error:i,refetch:v,isFetching:T}=D(a,s),C=L(),{data:u}=J(),{isCollapsed:p,toggle:f}=V("mcp-run-detail"),g=((N=u==null?void 0:u.telemetry)==null?void 0:N.traceUrl)??null,I=m.useCallback(x=>{!a||x.workflowId!==a||n.invalidateQueries({queryKey:["mcpRunExecution",a]})},[a,n]);if(K(`${U}.system.>`,I),o)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(i||!t)return e.jsxs("div",{children:[e.jsx(E,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(w=i==null?void 0:i.message)!=null&&w.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:j,summary:r}=t,h=j.find(x=>{var k;return x.category==="activity"&&((k=x.attributes.kind)==null?void 0:k.includes("completed"))}),P=(h==null?void 0:h.attributes.result)??null,d=t.result,y=(d==null?void 0:d.data)??d??null;return e.jsxs("div",{children:[e.jsx(E,{title:"Pipeline Execution",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(B,{onRefresh:()=>v(),isFetching:T,apiPath:`/pipelines/${a}/execution?app_id=${s}`}),e.jsx(O,{isRunning:t.status==="running",onTerminate:()=>{confirm("Interrupt this pipeline execution? This cannot be undone.")&&C.mutate({jobId:t.workflow_id,topic:t.workflow_type,appId:s},{onSuccess:()=>v()})}})]})}),e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md p-5 mb-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsx("h2",{className:"text-sm font-mono text-text-primary truncate flex-1",children:t.workflow_id}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsx(c,{label:"Tools",value:r.activities.user}),e.jsx(c,{label:"System",value:r.activities.system,muted:!0}),r.child_workflows.total>0&&e.jsx(c,{label:"Children",value:r.child_workflows.total}),r.timers>0&&e.jsx(c,{label:"Timers",value:r.timers}),r.signals>0&&e.jsx(c,{label:"Signals",value:r.signals}),e.jsx($,{status:z[t.status]??t.status})]})]}),e.jsxs("div",{className:"grid grid-cols-6 gap-x-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Server"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:s})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Tool"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:t.workflow_type||"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Duration"}),e.jsx(M,{ms:t.duration_ms,className:"font-mono text-text-primary"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Started"}),t.start_time?e.jsx(S,{date:t.start_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Completed"}),t.close_time?e.jsx(S,{date:t.close_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Trace"}),t.trace_id?e.jsx(A,{label:"",value:t.trace_id,href:g?g.replace("{traceId}",t.trace_id):void 0,external:!0}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})]})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(b,{title:"Details",sectionKey:"details",isCollapsed:p("details"),onToggle:f,children:e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4 mb-6",children:[e.jsx("div",{children:e.jsx(_,{data:P??{},label:"Input"})}),y!==null&&e.jsx("div",{children:e.jsx(_,{data:y,label:"Result"})})]})}),e.jsx(b,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:p("timeline"),onToggle:f,children:e.jsx(F,{events:j,outline:!0,jid:a,appId:s||"durable"})}),e.jsx(b,{title:"Events",sectionKey:"events",isCollapsed:p("events"),onToggle:f,children:e.jsx(q,{events:j,jid:a,appId:s||"durable"})})]})]})}function c({label:a,value:l,muted:s}){return e.jsxs("div",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"text-text-tertiary",children:a}),e.jsx("span",{className:`font-medium tabular-nums ${s?"text-text-tertiary":"text-text-primary"}`,children:l})]})}export{oe as McpRunDetailPage};
2
- //# sourceMappingURL=McpRunDetailPage-BJguEMS0.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"McpRunDetailPage-BJguEMS0.js","sources":["../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution, useInterruptJob } from '../../api/pipelines';\nimport { useSettings } from '../../api/settings';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n// ── Actions dropdown ────────────────────────────────────────────────────────\n\nfunction ActionsDropdown({ isRunning, onTerminate }: {\n isRunning: boolean;\n onTerminate: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (!isRunning) return null;\n\n return (\n <div className=\"relative\" ref={ref}>\n <button onClick={() => setOpen(!open)} className=\"btn-primary text-xs\">\n Actions\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]\">\n <button\n onClick={() => { onTerminate(); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || '';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const interruptMutation = useInterruptJob();\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events, summary } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n <div>\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/pipelines/${jobId}/execution?app_id=${namespace}`}\n />\n <ActionsDropdown\n isRunning={execution.status === 'running'}\n onTerminate={() => {\n if (confirm('Interrupt this pipeline execution? This cannot be undone.')) {\n interruptMutation.mutate(\n { jobId: execution.workflow_id, topic: execution.workflow_type, appId: namespace },\n { onSuccess: () => refetch() },\n );\n }\n }}\n />\n </div>\n }\n />\n\n {/* ── Header card ─────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md p-5 mb-8\">\n {/* Row 1: Job ID + stats + status */}\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-sm font-mono text-text-primary truncate flex-1\">{execution.workflow_id}</h2>\n <div className=\"flex items-center gap-4 shrink-0\">\n <Stat label=\"Tools\" value={summary.activities.user} />\n <Stat label=\"System\" value={summary.activities.system} muted />\n {summary.child_workflows.total > 0 && (\n <Stat label=\"Children\" value={summary.child_workflows.total} />\n )}\n {summary.timers > 0 && <Stat label=\"Timers\" value={summary.timers} />}\n {summary.signals > 0 && <Stat label=\"Signals\" value={summary.signals} />}\n <StatusBadge status={statusMap[execution.status] ?? execution.status} />\n </div>\n </div>\n\n {/* Row 2: Namespace, Topic, Duration, Started, Trace */}\n <div className=\"grid grid-cols-6 gap-x-6\">\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Server</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{namespace}</p>\n </div>\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{execution.workflow_type || '—'}</p>\n </div>\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <DurationValue ms={execution.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Completed</p>\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Trace</p>\n {execution.trace_id ? (\n <CopyableId\n label=\"\"\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Sections ────────────────────────────────────── */}\n <div className=\"space-y-6\">\n {/* Details: Input + Result */}\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle}>\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4 mb-6\">\n <div>\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n </div>\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Execution Timeline (swimlane) */}\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle}>\n <SwimlaneTimeline events={events} outline jid={jobId} appId={namespace || 'durable'} />\n </CollapsibleSection>\n\n {/* Events (table) */}\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle}>\n <EventTable events={events} jid={jobId} appId={namespace || 'durable'} />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n\n// ── Stat pill ────────────────────────────────────────────────────────────────\n\nfunction Stat({ label, value, muted }: { label: string; value: number; muted?: boolean }) {\n return (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-tertiary\">{label}</span>\n <span className={`font-medium tabular-nums ${muted ? 'text-text-tertiary' : 'text-text-primary'}`}>{value}</span>\n </div>\n );\n}\n"],"names":["statusMap","ActionsDropdown","isRunning","onTerminate","open","setOpen","useState","ref","useRef","useEffect","handler","e","jsxs","jsx","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","namespace","queryClient","useQueryClient","execution","isLoading","error","refetch","isFetching","useMcpRunExecution","interruptMutation","useInterruptJob","settings","useSettings","isCollapsed","toggle","useCollapsedSections","traceUrl","_a","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","PageHeader","_b","events","summary","triggerCompleted","triggerInput","rawResult","result","ListToolbar","Stat","StatusBadge","DurationValue","DateValue","CopyableId","CollapsibleSection","JsonViewer","SwimlaneTimeline","EventTable","label","value","muted"],"mappings":"grBAsBA,MAAMA,EAAoC,CACxC,QAAS,cACT,UAAW,YACX,OAAQ,QACV,EAIA,SAASC,EAAgB,CAAE,UAAAC,EAAW,YAAAC,GAGnC,CACD,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAS,EAAK,EAChCC,EAAMC,EAAAA,OAAuB,IAAI,EAWvC,OATAC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACL,EAAM,OACX,MAAMM,EAAWC,GAAkB,CAC7BJ,EAAI,SAAW,CAACA,EAAI,QAAQ,SAASI,EAAE,MAAc,GAAGN,EAAQ,EAAK,CAC3E,EACA,gBAAS,iBAAiB,YAAaK,CAAO,EACvC,IAAM,SAAS,oBAAoB,YAAaA,CAAO,CAChE,EAAG,CAACN,CAAI,CAAC,EAEJF,EAGHU,EAAAA,KAAC,MAAA,CAAI,UAAU,WAAW,IAAAL,EACxB,SAAA,CAAAM,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAMR,EAAQ,CAACD,CAAI,EAAG,UAAU,sBAAsB,SAAA,SAAA,CAEvE,EACCA,GACCS,EAAAA,IAAC,MAAA,CAAI,UAAU,yGACb,SAAAA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAEV,EAAA,EAAeE,EAAQ,EAAK,CAAG,EAChD,UAAU,oFACX,SAAA,WAAA,CAAA,CAED,CACF,CAAA,EAEJ,EAjBqB,IAmBzB,CAIO,SAASS,IAAmB,SACjC,KAAM,CAAE,MAAAC,CAAA,EAAUC,EAAA,EACZ,CAACC,CAAY,EAAIC,EAAA,EACjBC,EAAYF,EAAa,IAAI,WAAW,GAAK,GAC7CG,EAAcC,EAAA,EACd,CAAE,KAAMC,EAAW,UAAAC,EAAW,MAAAC,EAAO,QAAAC,EAAS,WAAAC,GAAeC,EAAmBZ,EAAQI,CAAS,EACjGS,EAAoBC,EAAA,EACpB,CAAE,KAAMC,CAAA,EAAaC,EAAA,EACrB,CAAE,YAAAC,EAAa,OAAAC,GAAWC,EAAqB,gBAAgB,EAG/DC,IAAWC,EAAAN,GAAA,YAAAA,EAAU,YAAV,YAAAM,EAAqB,WAAY,KAG5CC,EAAkBC,cAAaC,GAAe,CAC9C,CAACxB,GAASwB,EAAM,aAAexB,GACnCK,EAAY,kBAAkB,CAAE,SAAU,CAAC,kBAAmBL,CAAK,EAAG,CACxE,EAAG,CAACA,EAAOK,CAAW,CAAC,EAGvB,GAFAoB,EAAqB,GAAGC,CAAmB,YAAaJ,CAAe,EAEnEd,EACF,OACEX,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EACpDA,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAA,CAAiC,CAAA,EAClD,EAIJ,GAAIW,GAAS,CAACF,EACZ,cACG,MAAA,CACC,SAAA,CAAAT,EAAAA,IAAC6B,EAAA,CAAW,MAAM,oBAAA,CAAqB,EACvC9B,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,iCACT,UAAA8B,EAAAnB,GAAA,YAAAA,EAAiB,UAAjB,MAAAmB,EAA0B,SAAS,WACjC,wCACA,0BAAA,CACN,QACC,IAAA,CAAE,UAAU,6BACT,UAAAnB,GAAA,YAAAA,EAAiB,UAAW,gCAAA,CAChC,CAAA,CAAA,CACF,CAAA,EACF,EAIJ,KAAM,CAAE,OAAAoB,EAAQ,QAAAC,CAAA,EAAYvB,EAItBwB,EAAmBF,EAAO,KAC7BjC,UAAM,OAAAA,EAAE,WAAa,cAAcyB,EAAAzB,EAAE,WAAW,OAAb,YAAAyB,EAAmB,SAAS,cAAW,EAEvEW,GAAeD,GAAA,YAAAA,EAAkB,WAAW,SAAU,KAGtDE,EAAY1B,EAAU,OACtB2B,GAASD,GAAA,YAAAA,EAAW,OAAQA,GAAa,KAE/C,cACG,MAAA,CACC,SAAA,CAAAnC,EAAAA,IAAC6B,EAAA,CACC,MAAM,qBACN,QACE9B,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAACqC,EAAA,CACC,UAAW,IAAMzB,EAAA,EACjB,WAAAC,EACA,QAAS,cAAcX,CAAK,qBAAqBI,CAAS,EAAA,CAAA,EAE5DN,EAAAA,IAACZ,EAAA,CACC,UAAWqB,EAAU,SAAW,UAChC,YAAa,IAAM,CACb,QAAQ,2DAA2D,GACrEM,EAAkB,OAChB,CAAE,MAAON,EAAU,YAAa,MAAOA,EAAU,cAAe,MAAOH,CAAA,EACvE,CAAE,UAAW,IAAMM,EAAA,CAAQ,CAAE,CAGnC,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAAA,EAKJb,EAAAA,KAAC,MAAA,CAAI,UAAU,2CAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,sDAAuD,SAAAS,EAAU,YAAY,EAC3FV,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAC,MAACsC,GAAK,MAAM,QAAQ,MAAON,EAAQ,WAAW,KAAM,EACpDhC,EAAAA,IAACsC,GAAK,MAAM,SAAS,MAAON,EAAQ,WAAW,OAAQ,MAAK,EAAA,CAAC,EAC5DA,EAAQ,gBAAgB,MAAQ,GAC/BhC,EAAAA,IAACsC,EAAA,CAAK,MAAM,WAAW,MAAON,EAAQ,gBAAgB,KAAA,CAAO,EAE9DA,EAAQ,OAAS,GAAKhC,EAAAA,IAACsC,GAAK,MAAM,SAAS,MAAON,EAAQ,MAAA,CAAQ,EAClEA,EAAQ,QAAU,GAAKhC,EAAAA,IAACsC,GAAK,MAAM,UAAU,MAAON,EAAQ,OAAA,CAAS,EACtEhC,MAACuC,GAAY,OAAQpD,EAAUsB,EAAU,MAAM,GAAKA,EAAU,MAAA,CAAQ,CAAA,CAAA,CACxE,CAAA,EACF,EAGAV,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,6EAA6E,SAAA,SAAM,EAChGA,EAAAA,IAAC,IAAA,CAAE,UAAU,+CAAgD,SAAAM,CAAA,CAAU,CAAA,EACzE,SACC,MAAA,CACC,SAAA,CAAAN,EAAAA,IAAC,IAAA,CAAE,UAAU,6EAA6E,SAAA,OAAI,QAC7F,IAAA,CAAE,UAAU,+CAAgD,SAAAS,EAAU,eAAiB,GAAA,CAAI,CAAA,EAC9F,SACC,MAAA,CACC,SAAA,CAAAT,EAAAA,IAAC,IAAA,CAAE,UAAU,6EAA6E,SAAA,WAAQ,QACjGwC,EAAA,CAAc,GAAI/B,EAAU,YAAa,UAAU,6BAAA,CAA8B,CAAA,EACpF,SACC,MAAA,CACC,SAAA,CAAAT,EAAAA,IAAC,IAAA,CAAE,UAAU,6EAA6E,SAAA,UAAO,EAChGS,EAAU,WACPT,EAAAA,IAACyC,EAAA,CAAU,KAAMhC,EAAU,WAAY,OAAO,WAAW,UAAU,8BAA8B,EACjGT,MAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,IAAA,CAAE,CAAA,EACrD,SACC,MAAA,CACC,SAAA,CAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,6EAA6E,SAAA,YAAS,EAClGS,EAAU,WACPT,EAAAA,IAACyC,EAAA,CAAU,KAAMhC,EAAU,WAAY,OAAO,WAAW,UAAU,8BAA8B,EACjGT,MAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,IAAA,CAAE,CAAA,EACrD,SACC,MAAA,CACC,SAAA,CAAAA,EAAAA,IAAC,IAAA,CAAE,UAAU,6EAA6E,SAAA,QAAK,EAC9FS,EAAU,SACTT,EAAAA,IAAC0C,EAAA,CACC,MAAM,GACN,MAAOjC,EAAU,SACjB,KAAMa,EAAWA,EAAS,QAAQ,YAAab,EAAU,QAAQ,EAAI,OACrE,SAAQ,EAAA,CAAA,EAGVT,EAAAA,IAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,GAAA,CAAC,CAAA,CAAA,CAElD,CAAA,CAAA,CACF,CAAA,EACF,EAGAD,EAAAA,KAAC,MAAA,CAAI,UAAU,YAEb,SAAA,CAAAC,MAAC2C,EAAA,CAAmB,MAAM,UAAU,WAAW,UAAU,YAAaxB,EAAY,SAAS,EAAG,SAAUC,EACtG,SAAArB,EAAAA,KAAC,MAAA,CAAI,UAAU,qDACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,eAAC4C,EAAA,CAAW,KAAMV,GAAgB,CAAA,EAAI,MAAM,OAAA,CAAQ,CAAA,CACtD,EACCE,IAAW,MACVpC,EAAAA,IAAC,MAAA,CACC,SAAAA,EAAAA,IAAC4C,GAAW,KAAMR,EAAQ,MAAM,QAAA,CAAS,CAAA,CAC3C,CAAA,CAAA,CAEJ,CAAA,CACF,EAGApC,EAAAA,IAAC2C,GAAmB,MAAM,qBAAqB,WAAW,WAAW,YAAaxB,EAAY,UAAU,EAAG,SAAUC,EACnH,SAAApB,EAAAA,IAAC6C,EAAA,CAAiB,OAAAd,EAAgB,QAAO,GAAC,IAAK7B,EAAO,MAAOI,GAAa,SAAA,CAAW,CAAA,CACvF,EAGAN,EAAAA,IAAC2C,GAAmB,MAAM,SAAS,WAAW,SAAS,YAAaxB,EAAY,QAAQ,EAAG,SAAUC,EACnG,SAAApB,EAAAA,IAAC8C,GAAW,OAAAf,EAAgB,IAAK7B,EAAO,MAAOI,GAAa,UAAW,CAAA,CACzE,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAIA,SAASgC,EAAK,CAAE,MAAAS,EAAO,MAAAC,EAAO,MAAAC,GAA4D,CACxF,OACElD,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,qBAAsB,SAAA+C,EAAM,EAC5C/C,EAAAA,IAAC,QAAK,UAAW,4BAA4BiD,EAAQ,qBAAuB,mBAAmB,GAAK,SAAAD,CAAA,CAAM,CAAA,EAC5G,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{a as b,j as e}from"./vendor-query-RUZdMvN6.js";import{I as re,at as Re,G as Ie,a9 as De,t as Be}from"./index-CfAi1OsI.js";import{i as ze}from"./useEventHooks-PDbuSJ12.js";import{P as He}from"./PageHeader-Ce4GcIYo.js";import{X as Ue,as as Ye,aO as Ge,s as Ke,aQ as Ve,E as Qe,Q as Xe,aj as Le}from"./vendor-icons-BpZiWH2f.js";import{L as A,f as Ze,u as Je}from"./vendor-react-CdqEC2zv.js";const Me=800,Pe=270,F=28,et=60,he=24,tt=72,pe=Me-F-et,fe=Pe-he-tt,L=he+fe,me=F+pe,k="0.5s cubic-bezier(0.4, 0, 0.2, 1)",ve=9;function st(t){return`M ${(t.x-ve).toFixed(1)} ${t.y.toFixed(1)} L ${(t.x+ve).toFixed(1)} ${t.y.toFixed(1)}`}function H(t){if(t.length===0)return"";if(t.length===1)return st(t[0]);const n=[];for(let r=0;r<t.length-1;r++){const x=t[Math.max(0,r-1)],c=t[r],p=t[r+1],a=t[Math.min(t.length-1,r+2)],d=(c.x+(p.x-x.x)/6).toFixed(1),u=(c.y+(p.y-x.y)/6).toFixed(1),o=(p.x-(a.x-c.x)/6).toFixed(1),l=(p.y-(a.y-c.y)/6).toFixed(1);r===0&&n.push(`M ${c.x.toFixed(1)} ${c.y.toFixed(1)}`),n.push(`C ${d} ${u}, ${o} ${l}, ${p.x.toFixed(1)} ${p.y.toFixed(1)}`)}return n.join(" ")}function nt(t,n){if(t.length<2||n.length<2)return"";const r=H(t),x=[...n].reverse(),c=H(x),p=c.slice(c.indexOf("C"));return`${r} L ${x[0].x.toFixed(1)} ${x[0].y.toFixed(1)} ${p} Z`}function ke(t){return t>=1e4?`${Math.round(t/1e3)}k`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t)}function de(t){return t.length>0?t[t.length-1]:void 0}function at(t){return[1,2,5,10,20,50,100,200,500,1e3,2e3,5e3,1e4,2e4,5e4].filter(r=>r>0&&r<t*.98)}function rt(t){return[.25,.5,.75].map(r=>Math.round(r*t)).filter(r=>r>0)}const W="rgb(var(--lt-status-claimed-graphic))",U="rgb(var(--lt-status-queued-graphic))",E="rgb(var(--lt-status-success-graphic))",T="rgb(var(--lt-text-quaternary))",Y="rgb(var(--lt-status-error))";function G(t,n){return t.replace(/\)$/,` / ${n})`)}const ot=13;function lt(t,n){const r=[...t].sort((a,d)=>a.y-d.y);let x=-1/0;const c=r.map(a=>{const d=Math.max(a.y+3,x+ot);return x=d,{...a,labelY:d}}),p=c.length>0?c[c.length-1].labelY-n:0;if(p>0)for(const a of c)a.labelY-=p;return c}function it({stations:t,selectedRole:n,onSelect:r,onUpstreamSelect:x,onCmdClick:c,periodHours:p,logScale:a=!1,fill:d=!1}){const[u,o]=b.useState(null),l=t.length;if(l===0)return null;const f=s=>l===1?F+pe/2:F+s/(l-1)*pe,q=new Map(t.map((s,h)=>[s.role,f(h)])),g=t.map((s,h)=>{var C,te,se,ne;const y=s.target_per_hour??null,O=y!=null?y*p:null;return{idx:h,x:f(h),expected:O,actual:((C=s.metric)==null?void 0:C.resolved)??0,active:((te=s.metric)==null?void 0:te.claimed)??0,pending:((se=s.metric)==null?void 0:se.pending)??0,priorityCount:((ne=s.metric)==null?void 0:ne.priority_count)??0}}),M=g.some(s=>s.expected!=null),N=Math.max(1,...g.map(s=>s.expected??0),...g.map(s=>s.actual),...g.map(s=>s.expected!=null?s.pending:0))*1.15,j=a?s=>{const h=Math.log(1+N);return he+fe*(1-Math.log(1+Math.max(0,s))/h)}:s=>he+fe*(1-Math.max(0,Math.min(s,N))/N),K=a?at(N):rt(N),$=g.filter(s=>s.expected!=null),m=$.map(s=>({...s,y:j(s.expected)})),R=$.map(s=>({...s,y:j(s.actual)})),P=$.map(s=>({...s,y:j(s.active)})),S=$.map(s=>({...s,y:j(s.pending)})),V=H(m),Q=H(R),X=H(P),oe=H(S),D=de(R),le=de(m),B=de(P),ie=de(S),Z=R.length>=2&&D?`${Q} L ${D.x.toFixed(1)} ${L} L ${R[0].x.toFixed(1)} ${L} Z`:"",J=$.some(s=>s.pending>0||s.active>0),ee=J&&P.length>=2&&B?`${X} L ${B.x.toFixed(1)} ${L} L ${P[0].x.toFixed(1)} ${L} Z`:"",i=J?nt(S,P):"",v=$.some(s=>s.active>0),_=$.some(s=>s.pending>s.active),z=lt([le?{key:"target",text:"Target",color:T,y:le.y}:null,D?{key:"actual",text:"Resolved",color:E,y:D.y}:null,v&&B?{key:"active",text:"Claimed",color:W,y:B.y}:null,_&&ie?{key:"queued",text:"Pending",color:U,y:ie.y}:null].filter(Boolean),L+4);return e.jsxs("svg",{viewBox:`0 0 ${Me} ${Pe}`,className:d?"w-full h-full":"w-full",preserveAspectRatio:"xMidYMid meet",style:{display:"block",...d?{}:{height:"auto"}},children:[K.map(s=>{const h=j(s);return e.jsxs("g",{children:[e.jsx("line",{x1:F,y1:h,x2:me,y2:h,className:"stroke-surface-border",strokeWidth:.5,opacity:a?.45:.3,strokeDasharray:a?"2 5":void 0,style:{transition:`y1 ${k}, y2 ${k}`}}),e.jsx("text",{x:F-4,y:h+2.5,textAnchor:"end",fontSize:6,fontFamily:"ui-monospace, monospace",opacity:.35,className:"fill-text-quaternary",children:ke(s)})]},`grid-${s}`)}),t.map(s=>{if(!s.parent_role)return null;const h=q.get(s.parent_role);if(h==null)return null;const y=f(t.findIndex(O=>O.role===s.role));return e.jsx("line",{x1:h,y1:L,x2:y,y2:L,className:"stroke-surface-border",strokeWidth:.75},`dep-${s.role}`)}),Z&&e.jsx("path",{d:Z,opacity:.05,style:{fill:E,transition:`d ${k}`}}),ee&&e.jsx("path",{d:ee,opacity:.12,style:{fill:W,transition:`d ${k}`}}),i&&e.jsx("path",{d:i,opacity:.12,style:{fill:U,transition:`d ${k}`}}),V&&e.jsx("path",{d:V,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.7,style:{stroke:T,transition:`d ${k}`}}),m.map(s=>e.jsxs("g",{transform:`translate(${s.x} ${s.y})`,style:{transition:`transform ${k}`},children:[e.jsx("circle",{r:2,opacity:.8,style:{fill:T}}),e.jsx("text",{y:-5,textAnchor:"middle",fontSize:6.5,fontFamily:"ui-monospace, monospace",fontWeight:"500",opacity:.7,style:{fill:T},children:Math.round(s.expected)})]},`tval-${s.idx}`)),J&&oe&&e.jsx("path",{d:oe,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.55,style:{stroke:U,transition:`d ${k}`}}),X&&e.jsx("path",{d:X,fill:"none",strokeWidth:.75,strokeDasharray:"2 3",strokeLinecap:"round",opacity:.5,style:{stroke:W,transition:`d ${k}`}}),Q&&e.jsx("path",{d:Q,fill:"none",strokeWidth:.6,strokeLinejoin:"round",strokeLinecap:"round",opacity:.65,style:{stroke:E,transition:`d ${k}`}}),P.map((s,h)=>{if(s.pending<=0&&s.active<=0)return null;const y=Math.max(2.5,Math.min(5,2.5+s.active/10)),O=s.pending>s.active,C=Math.min(S[h].y-4,s.y-y-4);return e.jsxs("g",{children:[s.pending>0&&e.jsx("text",{x:s.x,y:C,textAnchor:"middle",fontSize:7.5,fontFamily:"ui-monospace, monospace",fontWeight:"600",style:{fill:O?U:"rgb(var(--lt-text-tertiary))",transition:`y ${k}`},children:s.pending}),e.jsxs("g",{transform:`translate(${s.x} ${s.y})`,style:{transition:`transform ${k}`},children:[e.jsx("circle",{r:y,opacity:.85,style:{fill:W}}),s.active>0&&e.jsx("text",{y:y+9,textAnchor:"middle",fontSize:7.5,fontFamily:"ui-monospace, monospace",fontWeight:"600",style:{fill:W},children:s.active})]})]},`active-${s.idx}`)}),g.map(s=>{var Ne;const h=t[s.idx],y=s.x,O=s.expected!=null?j(s.actual):L,C=Math.max(2.25,Math.min(4,2.25+s.actual/160)),te=h.role===n,se=u===s.idx,ne=s.expected==null?"idle · set a target rate to plot pace":`${s.actual} resolved · target ${Math.round(s.expected)}`+(s.pending>s.active?` · ${s.pending-s.active} pending`:"")+(s.active>0?` · ${s.active} claimed`:"")+(s.priorityCount>0?` · ${s.priorityCount} in jeopardy`:""),ce=ne.length*5.5+20,je=Math.max(F+ce/2+4,Math.min(me-ce/2-4,y)),be=O-C-10;return e.jsxs("g",{onClick:ae=>{ae.metaKey||ae.ctrlKey?(ae.stopPropagation(),c==null||c(h.role)):r(h.role)},onMouseEnter:()=>o(s.idx),onMouseLeave:()=>o(null),style:{cursor:"pointer"},children:[e.jsxs("g",{transform:`translate(${y} ${O})`,style:{transition:`transform ${k}`},children:[e.jsx("circle",{r:22,fill:"transparent"}),e.jsx("circle",{r:C,opacity:.9,style:{fill:E,transition:`r ${k}`}}),s.expected!=null&&e.jsx("text",{y:-C-5,textAnchor:"middle",fontSize:9.5,fontFamily:"ui-monospace, monospace",fontWeight:"500",style:{fill:E},children:ke(s.actual)}),se&&!te&&e.jsx("circle",{r:C+3,fill:"none",strokeWidth:1,opacity:.4,style:{stroke:E}}),te&&e.jsx("circle",{r:C+4,fill:"none",className:"stroke-accent",strokeWidth:2})]}),(((Ne=h.upstream_roles)==null?void 0:Ne.length)??0)>0&&e.jsxs("g",{transform:`translate(${y-20} ${L})`,onClick:ae=>{ae.stopPropagation(),x==null||x(h.upstream_roles[0])},style:{cursor:"pointer"},children:[e.jsx("title",{children:`Fed by ${h.upstream_roles.join(", ")} — click to view that sequence`}),e.jsx("circle",{r:9,cy:-6,fill:"transparent"}),e.jsx("path",{d:"M -7 -14 C -3 -14 -1 -9 0 -2",fill:"none",className:"stroke-text-quaternary",strokeWidth:1,strokeDasharray:"2 2",strokeLinecap:"round"}),e.jsx("path",{d:"M 0 -2 L 8 -2",className:"stroke-text-quaternary",strokeWidth:1,strokeLinecap:"round"}),e.jsx("path",{d:"M 8 -2 l -3.5 -2 v 4 z",className:"fill-text-quaternary"})]}),e.jsx("text",{x:y,y:L+(s.idx%2===0?14:27),textAnchor:"middle",fontSize:9.5,className:"fill-text-tertiary",fontFamily:"ui-sans-serif, sans-serif",fontWeight:"500",children:re(h)}),se&&e.jsxs("g",{children:[e.jsx("rect",{x:je-ce/2,y:be-16,width:ce,height:19,rx:3,className:"fill-text-primary",opacity:.88}),e.jsx("text",{x:je,y:be-3,textAnchor:"middle",fontSize:8.5,className:"fill-surface",fontFamily:"ui-monospace, monospace",children:ne})]})]},h.role)}),!M&&e.jsx("text",{x:F+pe/2,y:L+48,textAnchor:"middle",fontSize:8.5,className:"fill-text-quaternary",fontFamily:"ui-sans-serif, sans-serif",children:"Set target_per_hour on each role in Admin → Roles to enable the pace chart"}),z.map(s=>e.jsx("text",{x:me+6,y:s.labelY,fontSize:8,fontFamily:"ui-sans-serif, sans-serif",fontWeight:s.key==="actual"?700:500,opacity:s.key==="active"?.85:1,style:{fill:s.color,transition:`y ${k}`},children:s.text},s.key))]})}function Ce(t){const n=t.priority_facet?`metadata.${t.priority_facet}`:"created_at",r=JSON.stringify([{field:n,direction:"asc"}]);return`/escalations/available?role=${encodeURIComponent(t.role)}&jeopardy=1&view=table&orderBy=${encodeURIComponent(r)}`}const qe=["15m","1h","24h","7d","30d"],ct=t=>qe.includes(t);function xe(t){if(t==null)return"—";if(t<1){const n=Math.round(t*60);return n<=0?"< 1s":`${n}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function ue({label:t,value:n}){return e.jsxs("div",{className:"flex items-center justify-between py-1.5",children:[e.jsx("span",{className:"text-2xs text-text-tertiary uppercase tracking-wider",children:t}),e.jsx("span",{className:"text-xs font-mono font-medium text-text-primary tabular-nums",children:n})]})}function dt({period:t,onChange:n}){return e.jsx("div",{className:"flex items-center gap-1 mb-4",children:qe.map(r=>e.jsx("button",{onClick:()=>n(r),className:`px-2 py-0.5 text-2xs font-mono rounded transition-colors ${t===r?"bg-accent/10 text-accent font-semibold":"icon-link"}`,children:r},r))})}function xt({role:t,globalPeriod:n,onClose:r}){const[x,c]=b.useState(ct(n)?n:"24h"),{data:p}=Re(x),a=p==null?void 0:p.stations.find(l=>l.role===t.role),d=t.sla_minutes??void 0,u=t.target_per_hour??void 0,o=t.worker_count??void 0;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-baseline gap-1.5 flex-wrap",children:[e.jsx("span",{className:"text-sm font-bold text-text-primary",children:re(t)}),e.jsx("span",{className:"text-2xs font-mono text-text-secondary",children:t.role})]}),t.description&&e.jsx("p",{className:"text-2xs text-text-tertiary mt-1 line-clamp-2 leading-relaxed",children:t.description})]}),e.jsx("button",{onClick:r,className:"icon-link mt-0.5 shrink-0 ml-2",children:e.jsx(Ue,{className:"w-4 h-4"})})]}),a&&a.priority_count>0&&e.jsxs(A,{to:Ce(t),className:"flex items-center justify-between group mb-4",children:[e.jsxs("span",{className:"text-2xs",style:{color:Y},children:[a.priority_count," in jeopardy — pull oldest first"]}),e.jsx(Ye,{className:"w-3 h-3 transition-colors",style:{color:Y}})]}),e.jsx(dt,{period:x,onChange:c}),(u||d||o)&&e.jsxs("div",{className:"flex items-center gap-6 mb-6 text-2xs border-b border-surface-border/30 pb-5",children:[u&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[u,"/h"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"target"})]}),d&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[d,"m"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"SLA"})]}),o&&e.jsxs("div",{children:[e.jsx("div",{className:"font-mono font-semibold text-text-primary text-sm",children:o}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"workers"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 mb-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-2",children:"Wait (queue)"}),e.jsx(ue,{label:"P99",value:xe((a==null?void 0:a.wait.p99)??null)}),e.jsx(ue,{label:"avg",value:xe((a==null?void 0:a.wait.avg)??null)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-2",children:"Work (proc.)"}),e.jsx(ue,{label:"P99",value:xe((a==null?void 0:a.work.p99)??null)}),e.jsx(ue,{label:"avg",value:xe((a==null?void 0:a.work.avg)??null)})]})]}),d&&e.jsx("div",{className:"border-t border-surface-border/40 pt-4 mt-5",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-tertiary",children:"SLA target"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[d,"m"]})]})})]})}function ut({allMetrics:t,orderedRoles:n,period:r}){const x=t.reduce((o,l)=>o+l.pending,0),c=t.reduce((o,l)=>o+l.resolved,0),p=t.reduce((o,l)=>o+l.priority_count,0),a=new Map(t.map(o=>[o.role,o])),d=t.filter(o=>o.priority_count>0).length,u=t.filter(o=>o.pending>0).length;return e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-2xs text-text-quaternary uppercase tracking-wider mb-3",children:["Pipeline · ",r]}),e.jsx("div",{className:"mb-4",children:d>0?e.jsxs("p",{className:"text-2xs",style:{color:Y},children:[d," station",d>1?"s":""," with items in jeopardy"]}):u>0?e.jsxs("p",{className:"text-2xs text-status-warning",children:[u," station",u>1?"s":""," with backlog"]}):c>0?e.jsx("p",{className:"text-2xs text-status-success",children:"Flowing — queue clear"}):e.jsx("p",{className:"text-2xs text-text-quaternary",children:"Quiet — awaiting work"})}),e.jsxs("div",{className:"space-y-1.5 mb-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:"Pending"}),e.jsx("span",{className:`text-xs font-mono tabular-nums ${x>0?"text-text-primary font-semibold":"text-text-quaternary"}`,children:x})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:["Resolved · ",r]}),e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:c})]}),p>0&&e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider",children:"Priority"}),e.jsx("span",{className:"text-xs font-mono tabular-nums font-semibold",style:{color:Y},children:p})]})]}),e.jsx("div",{className:"border-t border-surface-border/40 pt-2 mb-1",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider flex-1",children:"Station"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"pend"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"clmd"}),e.jsx("span",{className:"text-2xs text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"res"})]})}),e.jsx("div",{className:"space-y-0.5",children:n.map(o=>{const l=a.get(o.role),f=(l==null?void 0:l.pending)??0,q=(l==null?void 0:l.claimed)??0,g=(l==null?void 0:l.resolved)??0,M=(l==null?void 0:l.priority_count)??0,w=o.title||o.role,N=M>0,j=f>0;return e.jsxs("div",{className:"flex items-center gap-2 py-0.5",children:[e.jsx("span",{className:`text-2xs font-mono flex-1 truncate ${j?"text-text-primary":"text-text-quaternary"}`,title:w,children:w}),e.jsx("span",{className:"text-[0.625rem] leading-none font-semibold tabular-nums w-4 text-right shrink-0",style:{color:Y},title:N?`${M} priority — pull oldest first`:void 0,children:N?M:""}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${j?"text-text-primary font-semibold":"text-text-quaternary"}`,children:f>0?f:"—"}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${q>0?"text-accent font-semibold":"text-text-quaternary"}`,children:q>0?q:"—"}),e.jsx("span",{className:`text-2xs font-mono tabular-nums w-8 text-right shrink-0 ${g>0?"text-text-secondary":"text-text-quaternary"}`,children:g>0?g:"—"})]},o.role)})}),e.jsx("p",{className:"text-2xs text-text-quaternary mt-5",children:"Select a station for queue detail."})]})}function pt({role:t,allMetrics:n,orderedRoles:r,globalPeriod:x,onClose:c}){return e.jsx("div",{className:"w-[280px] shrink-0 px-7 py-10 flex flex-col overflow-y-auto min-h-0",children:t?e.jsx(xt,{role:t,globalPeriod:x,onClose:c}):e.jsx(ut,{allMetrics:n,orderedRoles:r,period:x})})}const ht=T,ge="rgb(var(--lt-accent))",Ee=G(T,.09),Oe=G(T,.09),Ae=G(ge,.07),Fe=G(U,.08),We=G(W,.08),Te=G(E,.08),mt=["15m","1h","24h","7d","30d"],we={"15m":.25,"1h":1,"24h":24,"7d":168,"30d":720};function ye(t){const n=t.filter(a=>a.ops_visible),r=new Map(n.map(a=>[a.role,a])),x=new Set,p=n.filter(a=>!a.parent_role||!r.has(a.parent_role)).map(a=>{const d=[],u=[{role:a,depth:0}];for(;u.length>0;){const o=u.shift();x.has(o.role.role)||(x.add(o.role.role),d.push(o),n.filter(l=>l.parent_role===o.role.role&&!x.has(l.role)).forEach(l=>u.push({role:l,depth:o.depth+1})))}return{origin:a,stations:d}});return n.filter(a=>!x.has(a.role)).forEach(a=>p.push({origin:a,stations:[{role:a,depth:0}]})),p.sort((a,d)=>d.stations.length-a.stations.length||a.origin.role.localeCompare(d.origin.role))}function $e(t){if(t==null)return"—";if(t<1){const n=Math.round(t*60);return n<=0?"< 1s":`${n}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function ft(t,n){if(!n||t===0)return{pct:null,color:"bg-surface-border"};const r=t/n,x=Math.round(r*100),c=r>1?"bg-status-warning":r<.2?"bg-status-draft":"bg-status-success";return{pct:x,color:c}}function _e({value:t,onSave:n}){const[r,x]=b.useState(t!=null?String(t):""),c=b.useRef(void 0),p=a=>{const d=parseInt(a,10);n(!a.trim()||isNaN(d)||d<0?null:d)};return e.jsx("input",{type:"number",min:0,step:1,value:r,onChange:a=>{const d=a.target.value;x(d),clearTimeout(c.current),c.current=setTimeout(()=>p(d),400)},onBlur:a=>{clearTimeout(c.current),p(a.target.value)},onClick:a=>a.stopPropagation(),onKeyDown:a=>a.stopPropagation(),className:"w-full bg-transparent text-xs font-mono tabular-nums text-right focus:outline-none"})}function yt({role:t,metric:n,selected:r,periodHours:x,onClick:c}){var $;const p=De(),{isBuilder:a,isOps:d}=Be(),u=(n==null?void 0:n.pending)??0,o=(n==null?void 0:n.claimed)??0,l=(n==null?void 0:n.resolved)??0,f=(n==null?void 0:n.priority_count)??0,q=t.target_per_hour??null,{pct:g,color:M}=ft(u,q),w=g!=null?Math.min(100,g):0,N=bt(t.target_per_hour??null,t.sla_minutes??null,u,x),j=m=>p.mutate({role:t.role,target_per_hour:m}),K=m=>p.mutate({role:t.role,sla_minutes:m});return e.jsxs("tr",{tabIndex:0,onClick:c,onKeyDown:m=>{m.key==="Enter"&&c()},className:`cursor-pointer border-b border-surface-border/30 last:border-b-0 transition-colors ${r?"border-l-2 !border-l-accent":""}`,children:[e.jsx("td",{className:"pl-3 pr-2 py-1.5 overflow-hidden",children:e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("span",{className:"font-bold text-text-primary truncate text-xs",children:re(t)}),((($=t.upstream_roles)==null?void 0:$.length)??0)>0&&e.jsx("span",{title:`Fed by ${t.upstream_roles.join(", ")}`,className:"shrink-0 leading-none",children:e.jsx(Ve,{className:"w-3 h-3 text-text-quaternary"})})]})}),e.jsx("td",{className:"hidden xl:table-cell pr-2 py-1.5 overflow-hidden",children:e.jsx("span",{className:"block font-mono text-2xs text-text-tertiary truncate",children:t.role})}),e.jsx("td",{className:"px-2 py-1.5",style:{backgroundColor:Ee},children:e.jsx(_e,{value:t.target_per_hour??null,onSave:j})}),e.jsx("td",{className:"px-2 py-1.5",style:{backgroundColor:Oe},children:e.jsx(_e,{value:t.sla_minutes??null,onSave:K})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:Ae},title:N!=null?`~${N} concurrent worker${N===1?"":"s"} to sustain ${t.target_per_hour}/h within ${t.sla_minutes}m SLA`:void 0,children:e.jsx("span",{className:`text-xs font-mono tabular-nums ${N!=null?"":"text-text-quaternary"}`,style:N!=null?{color:ge}:void 0,children:N??"—"})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:Fe},children:e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=available`,className:`text-xs font-mono tabular-nums hover:underline ${u>0?"text-text-primary font-semibold":"text-text-quaternary"}`,onClick:m=>m.stopPropagation(),children:u})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:We},children:e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=claimed`,className:`text-xs font-mono tabular-nums hover:underline ${o>0?"font-semibold":"text-text-quaternary"}`,style:o>0?{color:W}:void 0,onClick:m=>m.stopPropagation(),children:o})}),e.jsx("td",{className:"px-2 py-1.5 text-right",style:{backgroundColor:Te},children:e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=resolved`,className:`text-xs font-mono tabular-nums hover:underline ${l>0?"text-text-secondary":"text-text-quaternary"}`,style:l>0?{color:E}:void 0,onClick:m=>m.stopPropagation(),children:l})}),e.jsx("td",{className:"hidden xl:table-cell px-2 py-1.5 text-right",children:e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:$e((n==null?void 0:n.wait.p99)??null)})}),e.jsx("td",{className:"hidden xl:table-cell px-2 py-1.5 text-right",children:e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:$e((n==null?void 0:n.work.p99)??null)})}),e.jsx("td",{className:"hidden lg:table-cell px-2 py-1.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0",children:e.jsx("div",{className:`h-full rounded-full ${M}`,style:{width:`${w}%`}})}),e.jsx("span",{className:`text-2xs font-mono tabular-nums ${g!=null&&g>100?"text-status-warning font-semibold":"text-text-quaternary"}`,children:g!=null?`${g}%`:"—"})]})}),e.jsx("td",{className:"py-1.5",children:e.jsxs("div",{className:"flex items-center justify-center gap-1.5",children:[e.jsx(A,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=all`,className:"icon-link",title:"View all items in queue",onClick:m=>m.stopPropagation(),children:e.jsx(Qe,{className:"w-3.5 h-3.5"})}),e.jsx("span",{className:"w-3.5 flex items-center justify-center",children:(a||d)&&e.jsx(A,{to:`/admin/roles/${encodeURIComponent(t.role)}`,className:"icon-link",title:"Configure this role",onClick:m=>m.stopPropagation(),children:e.jsx(Xe,{className:"w-3.5 h-3.5"})})}),e.jsx("span",{className:"w-3.5 flex items-center justify-center",children:f>0&&e.jsx(A,{to:Ce(t),className:"text-status-error hover:opacity-70 transition-opacity",title:`${f} item${f===1?"":"s"} in jeopardy — pull oldest first`,onClick:m=>m.stopPropagation(),children:e.jsx(Le,{className:"w-3.5 h-3.5",strokeWidth:2})})})]})})]})}function Se({n:t}){return t<=0?null:e.jsxs("span",{className:"inline-flex items-center gap-0.5 font-semibold tabular-nums",style:{color:Y},title:`${t} in jeopardy`,children:[e.jsx(Le,{className:"w-3 h-3",strokeWidth:2.25}),t>9?"9+":t]})}function gt({fragments:t,aggregates:n,activeOrigin:r,onSelect:x}){const[c,p]=b.useState(!1),a=b.useRef(null);b.useEffect(()=>{if(!c)return;const o=f=>{a.current&&!a.current.contains(f.target)&&p(!1)},l=f=>{f.key==="Escape"&&p(!1)};return document.addEventListener("mousedown",o),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",o),document.removeEventListener("keydown",l)}},[c]);const d=t.find(o=>o.origin.role===r)??t[0];if(!d)return null;const u=n.get(d.origin.role);return e.jsxs("div",{ref:a,className:"relative px-4 pt-2",children:[e.jsxs("button",{type:"button",onClick:()=>p(o=>!o),className:"group flex items-baseline gap-2.5","aria-expanded":c,"aria-haspopup":"listbox",children:[e.jsx("span",{className:"text-sm font-medium text-text-primary group-hover:text-accent transition-colors",children:re(d.origin)}),e.jsxs("span",{className:"text-2xs font-mono text-text-quaternary tabular-nums",children:[(u==null?void 0:u.stations)??d.stations.length," station",((u==null?void 0:u.stations)??d.stations.length)===1?"":"s"," · ",(u==null?void 0:u.pending)??0," pending"]}),e.jsx(Se,{n:(u==null?void 0:u.jeopardy)??0}),e.jsx(Ke,{className:`w-3.5 h-3.5 self-center shrink-0 text-text-tertiary group-hover:text-accent transition-transform ${c?"rotate-180":""}`,strokeWidth:1.5})]}),c&&e.jsx("div",{role:"listbox",className:"absolute z-[100] top-full left-4 mt-1.5 min-w-[20rem] max-h-80 overflow-y-auto bg-surface-raised border border-surface-border rounded-md shadow-lg py-1",children:t.map(o=>{const l=n.get(o.origin.role),f=o.origin.role===d.origin.role;return e.jsxs("button",{type:"button",role:"option","aria-selected":f,onClick:()=>{x(o.origin.role),p(!1)},className:`w-full text-left px-3 py-1.5 flex items-baseline gap-2.5 transition-colors ${f?"text-accent bg-accent/5":"text-text-primary hover:bg-surface-hover"}`,children:[e.jsx("span",{className:"text-xs font-medium truncate",children:re(o.origin)}),e.jsxs("span",{className:"ml-auto text-2xs font-mono text-text-quaternary tabular-nums shrink-0",children:[(l==null?void 0:l.stations)??o.stations.length," st · ",(l==null?void 0:l.pending)??0," pending"]}),e.jsx("span",{className:"w-12 shrink-0 text-left text-2xs",children:e.jsx(Se,{n:(l==null?void 0:l.jeopardy)??0})})]},o.origin.role)})})]})}const jt=[{label:"TARGET/H",band:Ee,hue:T,w:"w-[8%]"},{label:"SLA/M",band:Oe,hue:ht,w:"w-[7%]"},{label:"WORKERS",band:Ae,hue:ge,w:"w-[8%]"},{label:"PENDING",band:Fe,hue:U,w:"w-[8%]"},{label:"CLAIMED",band:We,hue:W,w:"w-[8%]"},{label:"RESOLVED",band:Te,hue:E,w:"w-[8%]"}];function bt(t,n,r,x){if(!t||!n)return null;const c=t*n/60,p=r>0?r*n/(60*x):0;return Math.ceil(c+p)}const I="sticky top-0 z-10 bg-surface border-b border-surface-border py-1.5 text-2xs font-semibold uppercase tracking-wider whitespace-nowrap";function Nt(){return e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{className:`${I} pl-3 pr-2 text-left text-text-quaternary`,children:"NAME"}),e.jsx("th",{className:`${I} hidden xl:table-cell w-[12%] pr-2 text-left text-text-quaternary`,children:"ROLE"}),jt.map(t=>e.jsx("th",{className:`${I} ${t.w} px-2 text-right`,style:{color:t.hue,backgroundImage:`linear-gradient(${t.band}, ${t.band})`},children:t.label},t.label)),e.jsx("th",{className:`${I} hidden xl:table-cell w-[8%] px-2 text-right text-text-quaternary`,children:"P99 WAIT"}),e.jsx("th",{className:`${I} hidden xl:table-cell w-[8%] px-2 text-right text-text-quaternary`,children:"P99 WORK"}),e.jsx("th",{className:`${I} hidden lg:table-cell w-[11%] px-2 text-left text-text-quaternary`,children:"TREND"}),e.jsx("th",{className:`${I} w-20 px-1 text-center text-text-quaternary`,children:"ACTIONS"})]})})}function vt(){var ee;const[t,n]=b.useState("1h"),[r,x]=b.useState(null),[c,p]=b.useState(!1),[a,d]=b.useState(!0);ze();const{data:u,isLoading:o,refetch:l}=Ie(),{data:f,isLoading:q,refetch:g}=Re(t),M=(u==null?void 0:u.roles)??[],w=(f==null?void 0:f.stations)??[],N=b.useMemo(()=>{const i=new Map(w.map(_=>[_.role,_])),v=new Map;for(const _ of ye((u==null?void 0:u.roles)??[])){let z=0,s=0;for(const h of _.stations){const y=i.get(h.role.role);z+=(y==null?void 0:y.pending)??0,s+=(y==null?void 0:y.priority_count)??0}v.set(_.origin.role,{stations:_.stations.length,pending:z,jeopardy:s})}return v},[w,u]),j=b.useMemo(()=>ye(M),[M]),[K,$]=Ze(),m=K.get("fragment"),R=j.find(i=>i.origin.role===m)??j[0]??null,P=b.useCallback(i=>{x(null),$(v=>{const _=new URLSearchParams(v);return _.set("fragment",i),_})},[$]),S=(R==null?void 0:R.stations)??[],V=b.useMemo(()=>new Set(S.map(({role:i})=>i.role)),[S]),Q=b.useMemo(()=>w.filter(i=>V.has(i.role)),[w,V]),X=b.useMemo(()=>S.map(({role:i})=>({role:i.role,title:i.title,parent_role:i.parent_role,target_per_hour:i.target_per_hour??null,upstream_roles:i.upstream_roles??[],metric:w.find(v=>v.role===i.role)})),[S,w]),oe=b.useCallback(i=>{const v=j.find(_=>_.stations.some(({role:z})=>z.role===i));v&&P(v.origin.role)},[j,P]),D=Je(),le=((ee=S.find(({role:i})=>i.role===r))==null?void 0:ee.role)??null,B=o||q,ie=async()=>{p(!0),await Promise.all([l(),g()]),p(!1)},Z=i=>x(v=>v===i?null:i),J=e.jsx("div",{className:"flex items-center gap-0.5",children:mt.map(i=>e.jsx("button",{onClick:()=>n(i),className:`px-2.5 py-1 text-2xs font-mono rounded transition-colors ${t===i?"bg-accent/10 text-accent font-semibold":"icon-link"}`,children:i},i))});return e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsx(He,{title:"Pace Board",docsHash:"#docs:dashboard.md:pace-board",center:J,actions:e.jsx("button",{onClick:ie,disabled:c,className:"icon-link disabled:opacity-40",children:e.jsx(Ge,{className:`w-3.5 h-3.5 ${c?"animate-spin":""}`})})}),B?e.jsxs("div",{className:"animate-pulse space-y-6 mt-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-64 bg-surface-sunken rounded w-full"}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(i=>e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-full"},i))})]}):j.length===0?e.jsxs("div",{className:"mt-8",children:[e.jsx("p",{className:"text-sm text-text-secondary mb-2",children:"Stations appear here once roles are marked visible in Operations."}),e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Go to"," ",e.jsx(A,{to:"/admin/roles",className:"text-accent hover:underline",children:"Roles"})," ","and enable ",e.jsx("strong",{children:"Visible in Operations"})," on roles that represent pipeline stations."]})]}):e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsxs("div",{className:"flex items-end justify-between",children:[e.jsx("div",{className:"flex-1",children:j.length>1&&e.jsx(gt,{fragments:j,aggregates:N,activeOrigin:(R==null?void 0:R.origin.role)??null,onSelect:P})}),e.jsx("div",{className:"flex items-center gap-0.5 px-4 pt-2 pb-0.5",children:["lin","log"].map(i=>e.jsx("button",{onClick:()=>d(i==="log"),className:`px-2 py-0.5 text-2xs font-mono rounded transition-colors ${(a?"log":"lin")===i?"text-accent font-semibold":"icon-link"}`,title:i==="lin"?"Linear Y axis":"Logarithmic Y axis — reveals shape across wide value ranges",children:i},i))})]}),e.jsxs("div",{className:"flex-1 min-h-[40vh] flex items-stretch overflow-hidden",children:[e.jsx("div",{className:"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden px-2 py-4",children:e.jsx(it,{stations:X,selectedRole:r,onSelect:Z,onUpstreamSelect:oe,onCmdClick:i=>D(`/escalations/available?role=${encodeURIComponent(i)}`),periodHours:we[t],logScale:a})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0 self-stretch"}),e.jsx(pt,{role:le,allMetrics:Q,orderedRoles:S.map(i=>i.role),globalPeriod:t,onClose:()=>x(null)})]}),e.jsx("div",{className:"max-h-[30vh] flex-none overflow-y-auto border-t border-surface-border",children:e.jsxs("table",{className:"w-full table-fixed",children:[e.jsx(Nt,{}),e.jsx("tbody",{children:S.map(({role:i})=>e.jsx(yt,{role:i,metric:w.find(v=>v.role===i.role),selected:r===i.role,periodHours:we[t],onClick:()=>Z(i.role)},i.role))})]})})]})]})}const Lt=Object.freeze(Object.defineProperty({__proto__:null,OperationsPage:vt,buildFragments:ye},Symbol.toStringTag,{value:"Module"}));export{Lt as O,it as P,ye as b,Ce as j};
2
- //# sourceMappingURL=OperationsPage-DvWrLuH6.js.map
@@ -1,2 +0,0 @@
1
- import{a as f,j as e}from"./vendor-query-RUZdMvN6.js";import{k as W,P as Y,E as J,H as K,G as X,I as Z,q as ee,r as se,s as te,M as ae,L as oe}from"./index-CfAi1OsI.js";import{f as ie}from"./useEventHooks-PDbuSJ12.js";import{u as re}from"./useFilterParams-crmlBw_l.js";import{u as ne}from"./useDebouncedValue-C4P2jQuh.js";import{b as le}from"./api-path-u2Jf9QXS.js";import{i as ce}from"./task-queues-7-sHKPsN.js";import{D as me}from"./DataTable-Bir0Xs1p.js";import{S as pe}from"./StickyPagination-hMrnLXde.js";import{R as ue,a as de}from"./RowActions-eYrzgQSj.js";import{E as he,a as ge,T as fe,b as xe}from"./escalation-columns-BY2mg9DY.js";import{L as be}from"./ListToolbar-IPXsTb3Q.js";import{E as we}from"./CountdownTimer-DPjIkerB.js";import{B as ye,ag as Pe,ah as ve,P as Se,ak as je}from"./vendor-icons-BpZiWH2f.js";import{u as Ce,a as Re,f as ke}from"./vendor-react-CdqEC2zv.js";import"./EmptyState-lpUFYfun.js";import"./FilterBar-D7GghUsU.js";import"./PriorityBadge-BETdj4M-.js";import"./RolePill-CnuBPhPw.js";import"./WorkflowPill-Da406nEj.js";import"./StatusBadge-DkgllZHv.js";import"./Modal-BU7No9NH.js";function Ke(){var N;const T=Ce(),{user:i,isSuperAdmin:V,hasRoleType:z}=W(),{filters:o,setFilter:y,pagination:t,sort:x,setSort:F}=re({filters:{role:"",type:"",priority:"",search:""}});ie({role:o.role||null,verbs:["claimed","resolved"]});const A=ne(o.search,300),M=Y(),{data:b}=J(),{data:w}=K(),{data:n}=X(),P=V||z("admin"),v=f.useMemo(()=>new Set(((i==null?void 0:i.roles)??[]).map(s=>s.role)),[i]),O=f.useMemo(()=>{const s=(n==null?void 0:n.roles)??[];return(P?s:s.filter(a=>v.has(a.role)&&!ce(a.role))).map(a=>({value:a.role,label:Z(a)})).sort((a,H)=>a.label.localeCompare(H.label))},[n,P,v]),l=Re(),{data:c}=ee(),S=se(),_=f.useCallback(()=>{var a;const s=window.prompt("Pin label:");if(!(s!=null&&s.trim()))return;const g=((a=c==null?void 0:c.preferences)==null?void 0:a.pinnedViews)??[];S.mutate({pinnedViews:[...g,{id:te(),label:s.trim(),url:l.pathname+l.search,badge:!0}]})},[l.pathname,l.search,c,S]),[I,j]=ke(),C=I.get("view"),q=f.useCallback(s=>{j(g=>{const a=new URLSearchParams(g);return s?a.set("view",s):a.delete("view"),a},{replace:!0})},[j]),m=o.role||null,p=((N=ae(m??"",void 0,!!m).data)==null?void 0:N.list_schema)??null,R=!!m&&!!p&&!!p["x-lt-layout"]&&p["x-lt-layout"]!=="table",u=R&&(C?C==="rich":!0),k={assigned_to:i==null?void 0:i.userId,status:"pending",role:o.role||void 0,type:o.type||void 0,priority:o.priority?parseInt(o.priority):void 0,search:A||void 0,sort_by:x.sort_by||"created_at",order:x.order||"desc"},{data:r,isLoading:U,error:d,refetch:B,isFetching:G}=oe({...k,limit:t.pageSize,offset:t.offset}),E=(r==null?void 0:r.escalations)??[],h=(r==null?void 0:r.total)??0,Q=le("/escalations",{...k,limit:t.pageSize,offset:t.offset}),D={key:"actions",label:"",render:s=>e.jsx(ue,{children:e.jsx(de,{icon:je,title:"Release escalation",onClick:()=>M.mutate(s.id),alwaysVisible:!0,colorClass:"text-status-warning/40 hover:text-status-warning"})}),className:"w-16 text-right"},$=[fe,...xe,D],L=s=>T(`/escalations/detail/${s.id}`,{state:{from:"/escalations/queue"}});return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-10 min-w-0",children:[e.jsx(he,{role:o.role,options:O,onChange:s=>y("role",s),emptyLabel:"My Escalations"}),e.jsx("button",{onClick:()=>{window.location.hash="#docs:dashboard.md:all-escalations"},className:"text-text-quaternary hover:text-accent transition-colors mt-1 shrink-0",title:"Open docs for this page",children:e.jsx(ye,{className:"w-4 h-4",strokeWidth:1.5})})]}),e.jsx(ge,{filters:o,setFilter:y,roles:(b==null?void 0:b.roles)??[],types:(w==null?void 0:w.types)??[],actions:e.jsxs(e.Fragment,{children:[e.jsx(be,{onRefresh:()=>B(),isFetching:G,apiPath:Q}),R&&e.jsx("button",{onClick:()=>q(u?"table":"rich"),className:"ml-2 inline-flex h-7 w-7 items-center justify-center rounded icon-link hover:bg-surface-hover",title:u?"Table view":"Rich view",children:u?e.jsx(Pe,{className:"w-4 h-4"}):e.jsx(ve,{className:"w-4 h-4"})}),e.jsx("button",{onClick:_,className:"ml-2 inline-flex h-7 w-7 items-center justify-center rounded icon-link hover:bg-surface-hover",title:"Pin this view — save the current filters to your Pinned section","data-testid":"pin-current-view",children:e.jsx(Se,{className:"w-4 h-4"})})]})}),d&&e.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:d.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${d.message}`}),u?e.jsx(we,{role:m,listSchema:p,activeEscalations:E,onRowClick:L,forceViewAction:!0,total:h,page:t.page,totalPages:t.totalPages(h),pageSize:t.pageSize,onPageChange:t.setPage,onPageSizeChange:t.setPageSize}):e.jsxs(e.Fragment,{children:[e.jsx(me,{columns:$,data:E,layout:"fixed",keyFn:s=>s.id,onRowClick:L,isLoading:U,emptyMessage:d?"Unable to load data":"No assigned escalations",sort:x,onSort:F}),e.jsx(pe,{page:t.page,totalPages:t.totalPages(h),onPageChange:t.setPage,total:h,pageSize:t.pageSize,onPageSizeChange:t.setPageSize})]})]})}export{Ke as OperatorDashboard};
2
- //# sourceMappingURL=OperatorDashboard-C-jE0IRA.js.map
@@ -1,2 +0,0 @@
1
- import{j as s}from"./vendor-query-RUZdMvN6.js";import{B as c}from"./BotPicker-DQOpVB4M.js";import{k as m}from"./index-CfAi1OsI.js";import{d as o,az as x}from"./vendor-icons-BpZiWH2f.js";function j({selected:e,onChange:n}){const{user:t,isSuperAdmin:a,hasRoleType:i}=m(),r=a||i("admin");return s.jsx("div",{children:r?s.jsx(c,{selected:e,onChange:n}):s.jsx("div",{className:"flex items-center gap-1.5",children:e?s.jsxs(s.Fragment,{children:[s.jsx(o,{className:"w-3 h-3 text-accent/75 shrink-0",strokeWidth:1.5}),s.jsxs("span",{className:"text-2xs text-text-secondary",children:["Running as ",s.jsx("span",{className:"font-medium text-accent font-mono",children:e})]})]}):s.jsxs(s.Fragment,{children:[s.jsx(x,{className:"w-3 h-3 text-accent/75 shrink-0",strokeWidth:1.5}),s.jsxs("span",{className:"text-2xs text-text-secondary",children:["Running as ",s.jsx("span",{className:"font-medium text-accent",children:(t==null?void 0:t.displayName)||(t==null?void 0:t.userId)||"you"})]})]})})})}export{j as R};
2
- //# sourceMappingURL=RunAsSelector-CS3KQ-BF.js.map
@@ -1,2 +0,0 @@
1
- import{j as t}from"./vendor-query-RUZdMvN6.js";import{ai as i}from"./index-CfAi1OsI.js";const d=[10,25,50,100];function m({page:s,totalPages:r,onPageChange:l,total:n,pageSize:c,onPageSizeChange:a}){if(n===0)return null;const x=(s-1)*c+1,o=Math.min(s*c,n);return t.jsxs("div",{className:"flex items-center justify-between pt-4",children:[t.jsxs("div",{className:"flex items-center gap-4",children:[t.jsxs("p",{className:"text-xs text-text-tertiary",children:[i(x),"–",i(o)," of ",i(n)]}),a&&t.jsx("select",{value:c,onChange:e=>a(parseInt(e.target.value)),className:"select text-xs py-1",children:d.map(e=>t.jsxs("option",{value:e,children:[e," / page"]},e))})]}),r>1&&t.jsxs("div",{className:"flex items-center gap-1",children:[t.jsx("button",{onClick:()=>l(s-1),disabled:s<=1,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Previous"}),t.jsxs("span",{className:"px-3 text-xs text-text-secondary",children:[s," / ",r]}),t.jsx("button",{onClick:()=>l(s+1),disabled:s>=r,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed",children:"Next"})]})]})}function f(s){return s.total===0?null:t.jsx("div",{className:"sticky bottom-0 z-20 bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-page-x px-page-x pt-2 pb-4",children:t.jsx(m,{...s})})}export{f as S};
2
- //# sourceMappingURL=StickyPagination-hMrnLXde.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StickyPagination-hMrnLXde.js","sources":["../../src/components/common/data/Pagination.tsx","../../src/components/common/data/StickyPagination.tsx"],"sourcesContent":["import { formatCount } from '../../../lib/format';\n\nconst PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\ninterface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function Pagination({\n page,\n totalPages,\n onPageChange,\n total,\n pageSize,\n onPageSizeChange,\n}: PaginationProps) {\n if (total === 0) return null;\n\n const start = (page - 1) * pageSize + 1;\n const end = Math.min(page * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between pt-4\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-xs text-text-tertiary\">\n {formatCount(start)}&ndash;{formatCount(end)} of {formatCount(total)}\n </p>\n {onPageSizeChange && (\n <select\n value={pageSize}\n onChange={(e) => onPageSizeChange(parseInt(e.target.value))}\n className=\"select text-xs py-1\"\n >\n {PAGE_SIZE_OPTIONS.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n </div>\n {totalPages > 1 && (\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n <span className=\"px-3 text-xs text-text-secondary\">\n {page} / {totalPages}\n </span>\n <button\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n className=\"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","import { Pagination } from './Pagination';\n\ninterface StickyPaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n total: number;\n pageSize: number;\n onPageSizeChange?: (size: number) => void;\n}\n\nexport function StickyPagination(props: StickyPaginationProps) {\n if (props.total === 0) return null;\n\n return (\n <div className=\"sticky bottom-0 z-20 bg-surface/95 backdrop-blur-sm border-t border-surface-border -mx-page-x px-page-x pt-2 pb-4\">\n <Pagination {...props} />\n </div>\n );\n}\n"],"names":["PAGE_SIZE_OPTIONS","Pagination","page","totalPages","onPageChange","total","pageSize","onPageSizeChange","start","end","jsxs","formatCount","jsx","size","StickyPagination","props"],"mappings":"wFAEA,MAAMA,EAAoB,CAAC,GAAI,GAAI,GAAI,GAAG,EAWnC,SAASC,EAAW,CACzB,KAAAC,EACA,WAAAC,EACA,aAAAC,EACA,MAAAC,EACA,SAAAC,EACA,iBAAAC,CACF,EAAoB,CAClB,GAAIF,IAAU,EAAG,OAAO,KAExB,MAAMG,GAASN,EAAO,GAAKI,EAAW,EAChCG,EAAM,KAAK,IAAIP,EAAOI,EAAUD,CAAK,EAE3C,OACEK,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,IAAA,CAAE,UAAU,6BACV,SAAA,CAAAC,EAAYH,CAAK,EAAE,IAAQG,EAAYF,CAAG,EAAE,OAAKE,EAAYN,CAAK,CAAA,EACrE,EACCE,GACCK,EAAAA,IAAC,SAAA,CACC,MAAON,EACP,SAAW,GAAMC,EAAiB,SAAS,EAAE,OAAO,KAAK,CAAC,EAC1D,UAAU,sBAET,WAAkB,IAAKM,GACtBH,OAAC,SAAA,CAAkB,MAAOG,EACvB,SAAA,CAAAA,EAAK,SAAA,CAAA,EADKA,CAEb,CACD,CAAA,CAAA,CACH,EAEJ,EACCV,EAAa,GACZO,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMR,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQ,EAClB,UAAU,oEACX,SAAA,UAAA,CAAA,EAGDQ,EAAAA,KAAC,OAAA,CAAK,UAAU,mCACb,SAAA,CAAAR,EAAK,MAAIC,CAAA,EACZ,EACAS,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMR,EAAaF,EAAO,CAAC,EACpC,SAAUA,GAAQC,EAClB,UAAU,oEACX,SAAA,MAAA,CAAA,CAED,CAAA,CACF,CAAA,EAEJ,CAEJ,CC1DO,SAASW,EAAiBC,EAA8B,CAC7D,OAAIA,EAAM,QAAU,EAAU,KAG5BH,MAAC,OAAI,UAAU,oHACb,eAACX,EAAA,CAAY,GAAGc,EAAO,CAAA,CACzB,CAEJ"}
@@ -1,2 +0,0 @@
1
- import{a as b,j as e}from"./vendor-query-RUZdMvN6.js";import{a as D,f as U}from"./workflows-DbPqi1TW.js";import{h as O}from"./useEventHooks-PDbuSJ12.js";import{u as z,E as B}from"./EventTable-CwPWl163.js";import{b as K,e as M}from"./tasks-UOtUkDk-.js";import{Y as c,b as v,D as Q,W as F,X as H,J as T,e as J}from"./index-CfAi1OsI.js";import{P as q}from"./PageHeader-Ce4GcIYo.js";import{C as N}from"./CollapsibleSection-CDADefUY.js";import{L as X}from"./ListToolbar-IPXsTb3Q.js";import{S as C}from"./StatusBadge-DkgllZHv.js";import{C as _}from"./CopyableId-4Lqlc5cU.js";import{ao as Y,am as Z,av as G,aw as ee,s as te}from"./vendor-icons-BpZiWH2f.js";import{L as u,e as se,u as ae}from"./vendor-react-CdqEC2zv.js";import{S as re}from"./SwimlaneTimeline-BlzV74V5.js";import"./FilterBar-D7GghUsU.js";import"./StreamMessageDetail-DyJyZwBl.js";function ne(t){const s=t.lastIndexOf("-");return s<=0?{taskQueue:t,workflowType:t}:{taskQueue:t.substring(0,s),workflowType:t.substring(s+1)}}function S({children:t}){return e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:t})}function oe({escalations:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(u,{to:`/escalations/detail/${s.id}`,className:"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.type,children:s.type}),e.jsx("span",{className:"block text-2xs text-text-tertiary truncate",children:s.role})]}),e.jsx(v,{date:s.created_at,format:"relative",className:"text-2xs text-text-tertiary whitespace-nowrap"}),e.jsx("span",{className:"w-20 flex justify-end",children:e.jsx(C,{status:s.status})})]},s.id))})}function le({tasks:t}){return e.jsx("div",{children:t.map(s=>e.jsxs(u,{to:`/workflows/tasks/detail/${s.id}`,className:"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group",children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate",title:s.workflow_type,children:s.workflow_type}),e.jsx("span",{className:"block text-2xs text-text-tertiary truncate",children:s.lt_type})]}),e.jsx(v,{date:s.created_at,format:"relative",className:"text-2xs text-text-tertiary whitespace-nowrap"}),e.jsx("span",{className:"w-20 flex justify-end",children:e.jsx(C,{status:s.status})})]},s.id))})}function ie({execution:t,parentWorkflowId:s,childTasks:a,escalations:r,headerActions:n,open:l}){const m=r.length>0||a.length>0,[x,o]=b.useState(m?"escalations":"details"),{taskQueue:p,workflowType:h}=ne(t.workflow_type),f=[{id:"details",icon:Y,label:"Details",content:e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(c,{label:"Status",children:e.jsx(C,{status:t.status})}),e.jsx(c,{label:"Workflow Type",children:e.jsx(_,{bare:!0,value:h,href:`/workflows/executions?entity=${encodeURIComponent(h)}`})}),e.jsx(c,{label:"Workflow ID",children:e.jsx(_,{bare:!0,value:t.workflow_id})}),s&&e.jsx(c,{label:"Parent",children:e.jsx(_,{bare:!0,value:s,href:`/workflows/executions/${s}`})}),e.jsx(c,{label:"Task Queue",children:e.jsx("span",{className:"font-mono",children:p})}),e.jsx(c,{label:"Start Time",children:t.start_time?e.jsx(v,{date:t.start_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(c,{label:"End Time",children:t.close_time?e.jsx(v,{date:t.close_time,format:"datetime"}):e.jsx("span",{className:"text-text-tertiary",children:"--"})}),e.jsx(c,{label:"Duration",children:e.jsx(Q,{ms:t.duration_ms,className:"font-mono"})}),e.jsxs(c,{label:"History Size",children:[t.summary.total_events," events"]}),e.jsxs(c,{label:"Activities",children:[t.summary.activities.completed," / ",t.summary.activities.total]})]})},{id:"escalations",icon:Z,label:"Escalations",content:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx(S,{children:"Escalations"}),r.length>0?e.jsx(oe,{escalations:r}):e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"This workflow has not escalated."})]}),a.length>0&&e.jsxs("div",{children:[e.jsx(S,{children:"Related Tasks"}),e.jsx(le,{tasks:a})]})]})}];return e.jsx(F,{open:l,width:384,className:"self-stretch",children:e.jsx("div",{className:"h-full pl-6",children:e.jsx(H,{views:f,activeId:x,onViewChange:o,headerActions:n,stickyClassName:"sticky top-0 z-10 h-[calc(100vh-5.25rem)] pt-9"})})})}function ce(t){var r;const s=t.events.find(n=>n.event_type==="workflow_execution_started"),a=(r=s==null?void 0:s.attributes)==null?void 0:r.input;return a&&typeof a=="object"?a:null}function de({execution:t}){const s=ce(t),a=t.result,r=(a==null?void 0:a.data)??a??null;return!s&&!r?null:e.jsxs("div",{className:"grid grid-cols-1 @form-cols:grid-cols-2 gap-4 mb-6",children:[s!==null&&e.jsx("div",{children:e.jsx(T,{data:s,label:"Input Envelope"})}),r!==null&&e.jsx("div",{children:e.jsx(T,{data:r,label:"Result"})})]})}function xe({isRunning:t,hasToolCalls:s,workflowId:a,onAction:r}){const[n,l]=b.useState(!1),m=b.useRef(null);return b.useEffect(()=>{if(!n)return;const x=o=>{m.current&&!m.current.contains(o.target)&&l(!1)};return document.addEventListener("mousedown",x),()=>document.removeEventListener("mousedown",x)},[n]),e.jsxs("div",{className:"relative",ref:m,children:[e.jsxs("button",{onClick:()=>l(!n),className:"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors",title:"Actions",children:["Actions",e.jsx(te,{className:`w-3 h-3 transition-transform ${n?"rotate-180":""}`})]}),n&&e.jsxs("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]",children:[e.jsx("button",{onClick:()=>{r("restart"),l(!1)},className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",children:"Restart Workflow"}),t&&e.jsx("button",{onClick:()=>{r("terminate"),l(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"}),s&&e.jsx(u,{to:`/mcp/queries/${a}?step=3`,className:"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover",onClick:()=>l(!1),children:"Compile into Pipeline"}),e.jsx(u,{to:`/mcp/executions/${encodeURIComponent(a)}?namespace=durable`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"View Pipeline Execution"}),e.jsx(u,{to:`/admin/streams?source=worker&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Worker Messages"}),e.jsx(u,{to:`/admin/streams?source=engine&jid=${encodeURIComponent(a)}`,className:"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover",onClick:()=>l(!1),children:"Engine Messages"})]})]})}function Te(){const{workflowId:t}=se();O(t);const s="Workflow Execution",{data:a,isLoading:r,error:n,refetch:l,isFetching:m}=D(t),{data:x}=K(t),{data:o}=M(t),{data:p}=J(t),h=ae(),f=U(),{isCollapsed:j,toggle:w}=z("workflow-execution"),P=d=>{var i;if(d==="terminate")confirm("Are you sure you want to terminate this workflow?")&&f.mutate(t);else if(d==="restart"&&a){const L=a.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/,""),g=a.events.find(V=>V.event_type==="workflow_execution_started"),E=(i=g==null?void 0:g.attributes)==null?void 0:i.input;E&&sessionStorage.setItem("lt:invoke:prefill",JSON.stringify(E)),h(`/workflows/start?type=${encodeURIComponent(L)}&mode=now`)}};if(r)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(n||!a){const d=(n==null?void 0:n.message)??"",i=d.includes("expired")||d.includes("no longer available");return e.jsxs("div",{children:[e.jsx(u,{to:"/workflows/executions",className:"text-xs text-text-tertiary hover:text-text-primary",children:"← Workflows"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:i?"Execution data is no longer available":n?"Unable to load execution":"Execution not found"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:i?"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.":d||"The workflow could not be resolved."})]})]})}const R=a.status!=="completed"&&a.status!=="failed",k=!j("side-panel"),I=a.parent_workflow_id,W=x&&x.workflow_id===a.workflow_id,y=I||(W?x.parent_workflow_id:null)||null,$=y&&y!==a.workflow_id?y:null,A=a.status==="completed"&&a.events.some(d=>{if(d.event_type!=="activity_task_completed")return!1;const i=d.attributes.activity_type;return i==="callDbTool"||i==="callVisionTool"||i==="callMcpTool"||(i==null?void 0:i.startsWith("mcp_"))});return e.jsxs("div",{className:"flex items-stretch min-w-0 -mt-10 -mr-10 -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 pt-10 pr-10 pb-16",children:[e.jsx(q,{title:s,actions:e.jsx("button",{onClick:()=>w("side-panel"),className:"text-text-tertiary hover:text-accent transition-colors",title:k?"Hide side panel":"Show side panel",children:k?e.jsx(G,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(ee,{className:"w-5 h-5",strokeWidth:1.5})})}),f.error&&e.jsx("div",{className:"py-3 mb-6",children:e.jsxs("p",{className:"text-xs text-status-error",children:["Terminate failed: ",f.error.message]})}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(N,{title:"Details",sectionKey:"details",isCollapsed:j("details"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(de,{execution:a})}),e.jsx(N,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:j("timeline"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(re,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"})}),e.jsx(N,{title:"Events",sectionKey:"events",isCollapsed:j("events"),onToggle:w,contentClassName:"mt-4 ml-9",children:e.jsx(B,{events:a.events,childTasks:o==null?void 0:o.tasks,jid:t,appId:"durable"})})]})]}),e.jsx(ie,{execution:a,parentWorkflowId:$,childTasks:(o==null?void 0:o.tasks)??[],escalations:(p==null?void 0:p.escalations)??[],headerActions:e.jsxs(e.Fragment,{children:[e.jsx(X,{onRefresh:()=>l(),isFetching:m,apiPath:`/workflow-states/${t}/execution`}),e.jsx(xe,{isRunning:R,hasToolCalls:A,workflowId:t,onAction:P})]}),open:k})]})}export{Te as WorkflowExecutionPage};
2
- //# sourceMappingURL=WorkflowExecutionPage-C15GSAoe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkflowExecutionPage-C15GSAoe.js","sources":["../../src/pages/workflows/workflow-execution/ExecutionSidePanel.tsx","../../src/pages/workflows/workflow-execution/ExecutionInputResult.tsx","../../src/pages/workflows/WorkflowExecutionPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Info, Bell } from 'lucide-react';\nimport { SlidePanel, SlidePanelViews, PanelField, type SlidePanelView } from '../../../components/common/layout/SlidePanel';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\nimport { CopyableId } from '../../../components/common/display/CopyableId';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { DurationValue } from '../../../components/common/display/DurationValue';\nimport type { WorkflowExecution, LTTaskRecord, LTEscalationRecord } from '../../../api/types';\n\n/**\n * Split a HotMesh compound entity key (taskQueue-workflowName) on the last '-'.\n * Workflow names are camelCase, so the last segment is always the workflow type.\n */\nfunction splitEntityKey(compound: string): { taskQueue: string; workflowType: string } {\n const lastDash = compound.lastIndexOf('-');\n if (lastDash <= 0) return { taskQueue: compound, workflowType: compound };\n return {\n taskQueue: compound.substring(0, lastDash),\n workflowType: compound.substring(lastDash + 1),\n };\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n {children}\n </p>\n );\n}\n\n/**\n * A workflow can escalate to multiple targets, and multiple times across its\n * lifecycle — each escalation is its own row: role and type on the left, the\n * status badge in a right-aligned column, so a long history reads as a table\n * instead of running on.\n */\nfunction EscalationRows({ escalations }: { escalations: LTEscalationRecord[] }) {\n return (\n <div>\n {escalations.map((esc) => (\n <Link\n key={esc.id}\n to={`/escalations/detail/${esc.id}`}\n className=\"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group\"\n >\n <span className=\"min-w-0\">\n <span className=\"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate\" title={esc.type}>\n {esc.type}\n </span>\n <span className=\"block text-2xs text-text-tertiary truncate\">{esc.role}</span>\n </span>\n <DateValue date={esc.created_at} format=\"relative\" className=\"text-2xs text-text-tertiary whitespace-nowrap\" />\n <span className=\"w-20 flex justify-end\"><StatusBadge status={esc.status} /></span>\n </Link>\n ))}\n </div>\n );\n}\n\nfunction TaskRows({ tasks }: { tasks: LTTaskRecord[] }) {\n return (\n <div>\n {tasks.map((t) => (\n <Link\n key={t.id}\n to={`/workflows/tasks/detail/${t.id}`}\n className=\"grid grid-cols-[1fr_auto_auto] items-center gap-x-3 py-2 border-b border-surface-border/40 last:border-b-0 group\"\n >\n <span className=\"min-w-0\">\n <span className=\"block text-xs font-mono text-text-primary group-hover:text-accent transition-colors truncate\" title={t.workflow_type}>\n {t.workflow_type}\n </span>\n <span className=\"block text-2xs text-text-tertiary truncate\">{t.lt_type}</span>\n </span>\n <DateValue date={t.created_at} format=\"relative\" className=\"text-2xs text-text-tertiary whitespace-nowrap\" />\n <span className=\"w-20 flex justify-end\"><StatusBadge status={t.status} /></span>\n </Link>\n ))}\n </div>\n );\n}\n\n/**\n * The execution detail side panel — the record's facts beside the timeline:\n *\n * Details — workflow identity, timing, and history metadata\n * Escalations — every escalation the workflow raised, plus related tasks\n */\nexport function ExecutionSidePanel({\n execution,\n parentWorkflowId,\n childTasks,\n escalations,\n headerActions,\n open,\n}: {\n execution: WorkflowExecution;\n parentWorkflowId: string | null;\n childTasks: LTTaskRecord[];\n escalations: LTEscalationRecord[];\n /** Page controls (toolbar, Actions menu) shown at the right of the icon row. */\n headerActions?: React.ReactNode;\n open: boolean;\n}) {\n const hasRelated = escalations.length > 0 || childTasks.length > 0;\n const [activeView, setActiveView] = useState(hasRelated ? 'escalations' : 'details');\n\n const { taskQueue, workflowType } = splitEntityKey(execution.workflow_type);\n\n const views: SlidePanelView[] = [\n {\n id: 'details',\n icon: Info,\n label: 'Details',\n content: (\n <dl className=\"space-y-3.5\">\n <PanelField label=\"Status\"><StatusBadge status={execution.status} /></PanelField>\n <PanelField label=\"Workflow Type\">\n <CopyableId bare value={workflowType} href={`/workflows/executions?entity=${encodeURIComponent(workflowType)}`} />\n </PanelField>\n <PanelField label=\"Workflow ID\">\n <CopyableId bare value={execution.workflow_id} />\n </PanelField>\n {parentWorkflowId && (\n <PanelField label=\"Parent\">\n <CopyableId bare value={parentWorkflowId} href={`/workflows/executions/${parentWorkflowId}`} />\n </PanelField>\n )}\n <PanelField label=\"Task Queue\"><span className=\"font-mono\">{taskQueue}</span></PanelField>\n <PanelField label=\"Start Time\">\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"End Time\">\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" />\n : <span className=\"text-text-tertiary\">--</span>}\n </PanelField>\n <PanelField label=\"Duration\">\n <DurationValue ms={execution.duration_ms} className=\"font-mono\" />\n </PanelField>\n <PanelField label=\"History Size\">{execution.summary.total_events} events</PanelField>\n <PanelField label=\"Activities\">\n {execution.summary.activities.completed} / {execution.summary.activities.total}\n </PanelField>\n </dl>\n ),\n },\n {\n id: 'escalations',\n icon: Bell,\n label: 'Escalations',\n content: (\n <div className=\"space-y-6\">\n <div>\n <SectionLabel>Escalations</SectionLabel>\n {escalations.length > 0\n ? <EscalationRows escalations={escalations} />\n : <p className=\"text-xs text-text-tertiary italic\">This workflow has not escalated.</p>}\n </div>\n {childTasks.length > 0 && (\n <div>\n <SectionLabel>Related Tasks</SectionLabel>\n <TaskRows tasks={childTasks} />\n </div>\n )}\n </div>\n ),\n },\n ];\n\n return (\n <SlidePanel open={open} width={384} className=\"self-stretch\">\n <div className=\"h-full pl-6\">\n <SlidePanelViews\n views={views}\n activeId={activeView}\n onViewChange={setActiveView}\n headerActions={headerActions}\n stickyClassName=\"sticky top-0 z-10 h-[calc(100vh-5.25rem)] pt-9\"\n />\n </div>\n </SlidePanel>\n );\n}\n","import { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport type { WorkflowExecution } from '../../../api/types';\n\ninterface ExecutionInputResultProps {\n execution: WorkflowExecution;\n}\n\n/**\n * Extract the workflow input envelope from the workflow_execution_started event.\n * HotMesh 0.13.0+ includes the actual trigger arguments (the envelope passed\n * to startWorkflow) in the start event's `input` attribute.\n */\nfunction extractInput(execution: WorkflowExecution): Record<string, unknown> | null {\n const startEvent = execution.events.find(\n (e) => e.event_type === 'workflow_execution_started',\n );\n const input = (startEvent?.attributes as any)?.input;\n return input && typeof input === 'object' ? input : null;\n}\n\nexport function ExecutionInputResult({ execution }: ExecutionInputResultProps) {\n const input = extractInput(execution);\n\n // Result: unwrap the workflow return — the `data` field is what LT users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n if (!input && !result) return null;\n\n return (\n <div className=\"grid grid-cols-1 @form-cols:grid-cols-2 gap-4 mb-6\">\n {input !== null && (\n <div>\n <JsonViewer data={input} label=\"Input Envelope\" />\n </div>\n )}\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { useParams, useNavigate, Link } from 'react-router-dom';\nimport { useWorkflowExecution, useTerminateWorkflow } from '../../api/workflows';\nimport { useWorkflowDetailEvents } from '../../hooks/useEventHooks';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useTaskByWorkflowId, useChildTasks } from '../../api/tasks';\nimport { useEscalationsByWorkflowId } from '../../api/escalations';\n\nimport { PanelRightClose, PanelRightOpen, ChevronDown } from 'lucide-react';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { ExecutionSidePanel } from './workflow-execution/ExecutionSidePanel';\nimport { ExecutionInputResult } from './workflow-execution/ExecutionInputResult';\nimport { SwimlaneTimeline } from './workflow-execution/SwimlaneTimeline';\nimport { EventTable } from './workflow-execution/EventTable';\n\nfunction ActionsDropdown({ isRunning, hasToolCalls, workflowId, onAction }: {\n isRunning: boolean;\n hasToolCalls: boolean;\n workflowId: string;\n onAction: (action: 'restart' | 'terminate') => 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 return (\n <div className=\"relative\" ref={ref}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-0.5 pl-2 pr-1 py-1 rounded-md text-2xs font-medium text-text-tertiary hover:text-accent hover:bg-surface-hover transition-colors\"\n title=\"Actions\"\n >\n Actions\n <ChevronDown className={`w-3 h-3 transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-[100]\">\n <button\n onClick={() => { onAction('restart'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n >\n Restart Workflow\n </button>\n {isRunning && (\n <button\n onClick={() => { onAction('terminate'); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n )}\n {hasToolCalls && (\n <Link\n to={`/mcp/queries/${workflowId}?step=3`}\n className=\"block w-full text-left px-4 py-2 text-xs text-accent hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Compile into Pipeline\n </Link>\n )}\n <Link\n to={`/mcp/executions/${encodeURIComponent(workflowId)}?namespace=durable`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n View Pipeline Execution\n </Link>\n <Link\n to={`/admin/streams?source=worker&jid=${encodeURIComponent(workflowId)}`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Worker Messages\n </Link>\n <Link\n to={`/admin/streams?source=engine&jid=${encodeURIComponent(workflowId)}`}\n className=\"block w-full text-left px-4 py-2 text-xs text-text-secondary hover:bg-surface-hover\"\n onClick={() => setOpen(false)}\n >\n Engine Messages\n </Link>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowExecutionPage() {\n const { workflowId } = useParams<{ workflowId: string }>();\n useWorkflowDetailEvents(workflowId);\n\n const executionTitle = 'Workflow Execution';\n const { data: execution, isLoading, error, refetch, isFetching } = useWorkflowExecution(workflowId!);\n const { data: task } = useTaskByWorkflowId(workflowId!);\n const { data: childTasksData } = useChildTasks(workflowId!);\n const { data: escalationsData } = useEscalationsByWorkflowId(workflowId);\n const navigate = useNavigate();\n const terminateMutation = useTerminateWorkflow();\n const { isCollapsed, toggle } = useCollapsedSections('workflow-execution');\n\n const handleAction = (action: 'restart' | 'terminate') => {\n if (action === 'terminate') {\n if (confirm('Are you sure you want to terminate this workflow?')) {\n terminateMutation.mutate(workflowId!);\n }\n } else if (action === 'restart' && execution) {\n // Extract entity from workflow_id (format: {entity}-{guid})\n const entity = execution.workflow_id.replace(/-[A-Za-z0-9_-]{20,}$/, '');\n // Extract original input from the started event\n const startEvent = execution.events.find((e) => e.event_type === 'workflow_execution_started');\n const input = (startEvent?.attributes as any)?.input;\n if (input) {\n sessionStorage.setItem('lt:invoke:prefill', JSON.stringify(input));\n }\n navigate(`/workflows/start?type=${encodeURIComponent(entity)}&mode=now`);\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n const msg = (error as Error)?.message ?? '';\n const isExpired = msg.includes('expired') || msg.includes('no longer available');\n\n return (\n <div>\n <Link to=\"/workflows/executions\" className=\"text-xs text-text-tertiary hover:text-text-primary\">\n &larr; Workflows\n </Link>\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {isExpired\n ? 'Execution data is no longer available'\n : error\n ? 'Unable to load execution'\n : 'Execution not found'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {isExpired\n ? \"This workflow's underlying job has expired. The task record is preserved, but the execution timeline has been cleaned up.\"\n : msg || 'The workflow could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const isRunning = execution.status !== 'completed' && execution.status !== 'failed';\n const sidePanelOpen = !isCollapsed('side-panel');\n\n // Parent relationship — prefer execution-level pj (from HotMesh raw state),\n // fall back to lt_tasks record. Self-references filtered (cron-invoked\n // workflows store themselves as parent).\n const executionParent = (execution as any).parent_workflow_id as string | undefined;\n const isLeaf = task && task.workflow_id === execution.workflow_id;\n const rawParent = executionParent || (isLeaf ? task.parent_workflow_id : null) || null;\n const parentWorkflowId = rawParent && rawParent !== execution.workflow_id ? rawParent : null;\n const hasToolCalls = execution.status === 'completed' && execution.events.some(\n (e) => {\n if (e.event_type !== 'activity_task_completed') return false;\n const actType = (e.attributes as any).activity_type;\n return actType === 'callDbTool' || actType === 'callVisionTool' || actType === 'callMcpTool' || actType?.startsWith('mcp_');\n },\n );\n\n return (\n // Master flow beside a full-height panel: the left column page-scrolls\n // like any detail page; the panel spans the middle row with its own\n // sticky viewport. Negative margins let the panel bleed to the page edge;\n // the left column re-adds those gutters.\n <div className=\"flex items-stretch min-w-0 -mt-10 -mr-10 -mb-16\">\n <div className=\"flex-1 min-w-0 pt-10 pr-10 pb-16\">\n {/* The main header stays quiet: title + the panel toggle. Status, the\n toolbar, and the Actions menu all live in the panel. */}\n <PageHeader\n title={executionTitle}\n actions={\n <button\n onClick={() => toggle('side-panel')}\n className=\"text-text-tertiary hover:text-accent transition-colors\"\n title={sidePanelOpen ? 'Hide side panel' : 'Show side panel'}\n >\n {sidePanelOpen\n ? <PanelRightClose className=\"w-5 h-5\" strokeWidth={1.5} />\n : <PanelRightOpen className=\"w-5 h-5\" strokeWidth={1.5} />}\n </button>\n }\n />\n\n {terminateMutation.error && (\n <div className=\"py-3 mb-6\">\n <p className=\"text-xs text-status-error\">\n Terminate failed: {terminateMutation.error.message}\n </p>\n </div>\n )}\n\n\n <div className=\"space-y-6\">\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <ExecutionInputResult execution={execution} />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <SwimlaneTimeline\n events={execution.events}\n childTasks={childTasksData?.tasks}\n jid={workflowId}\n appId=\"durable\"\n />\n </CollapsibleSection>\n\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle} contentClassName=\"mt-4 ml-9\">\n <EventTable\n events={execution.events}\n childTasks={childTasksData?.tasks}\n jid={workflowId}\n appId=\"durable\"\n />\n </CollapsibleSection>\n </div>\n </div>\n\n <ExecutionSidePanel\n execution={execution}\n parentWorkflowId={parentWorkflowId}\n childTasks={childTasksData?.tasks ?? []}\n escalations={escalationsData?.escalations ?? []}\n headerActions={\n <>\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/workflow-states/${workflowId}/execution`}\n />\n <ActionsDropdown\n isRunning={isRunning}\n hasToolCalls={hasToolCalls}\n workflowId={workflowId!}\n onAction={handleAction}\n />\n </>\n }\n open={sidePanelOpen}\n />\n </div>\n );\n}\n"],"names":["splitEntityKey","compound","lastDash","SectionLabel","children","jsx","EscalationRows","escalations","esc","jsxs","Link","DateValue","StatusBadge","TaskRows","tasks","t","ExecutionSidePanel","execution","parentWorkflowId","childTasks","headerActions","open","hasRelated","activeView","setActiveView","useState","taskQueue","workflowType","views","Info","PanelField","CopyableId","DurationValue","Bell","SlidePanel","SlidePanelViews","extractInput","startEvent","e","input","_a","ExecutionInputResult","rawResult","result","JsonViewer","ActionsDropdown","isRunning","hasToolCalls","workflowId","onAction","setOpen","ref","useRef","useEffect","handler","ChevronDown","WorkflowExecutionPage","useParams","useWorkflowDetailEvents","executionTitle","isLoading","error","refetch","isFetching","useWorkflowExecution","task","useTaskByWorkflowId","childTasksData","useChildTasks","escalationsData","useEscalationsByWorkflowId","navigate","useNavigate","terminateMutation","useTerminateWorkflow","isCollapsed","toggle","useCollapsedSections","handleAction","action","entity","msg","isExpired","sidePanelOpen","executionParent","isLeaf","rawParent","actType","PageHeader","PanelRightClose","PanelRightOpen","CollapsibleSection","SwimlaneTimeline","EventTable","Fragment","ListToolbar"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a as d,j as t}from"./vendor-query-RUZdMvN6.js";import{E as z}from"./ElapsedCell-BZVkVxE0.js";import{k as A,b as v}from"./index-CfAi1OsI.js";import{u as E,d as $,b as L}from"./workflows-DbPqi1TW.js";import{u as M}from"./useNamespace-tZSOlge3.js";import{b as I}from"./useEventHooks-PDbuSJ12.js";import{u as U}from"./useFilterParams-crmlBw_l.js";import{b as H}from"./api-path-u2Jf9QXS.js";import{D as O}from"./DataTable-Bir0Xs1p.js";import{W as B}from"./WorkflowPill-Da406nEj.js";import{P as V}from"./PageHeader-Ce4GcIYo.js";import{F as G,c as f,b as x}from"./FilterBar-D7GghUsU.js";import{S as J}from"./StickyPagination-hMrnLXde.js";import{L as Q}from"./ListToolbar-IPXsTb3Q.js";import{R as q,a as k}from"./RowActions-eYrzgQSj.js";import{H as K,Q as X}from"./vendor-icons-BpZiWH2f.js";import{u as Y}from"./vendor-react-CdqEC2zv.js";import"./controlplane-Zi4m_MSx.js";import"./EmptyState-lpUFYfun.js";const Z={running:"in_progress",completed:"completed",failed:"failed"},ee={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},te={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function se(p,n,m,l,a){return[{key:"workflow_id",label:"Workflow ID",render:e=>{const o=ee[Z[e.status]??e.status]??"bg-status-pending",r=e.status==="running"?" animate-pulse":"";return t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:`w-2.5 h-2.5 shrink-0 rounded-full dot-ring ${o}${r}`,title:e.status}),t.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:e.workflow_id})]})}},{key:"entity",label:"Type",render:e=>t.jsx(B,{type:e.entity,variant:a.get(e.entity)??"durable",size:"xs"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",render:e=>t.jsx(v,{date:e.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"updated_at",label:"Updated",render:e=>t.jsx(v,{date:e.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32",sortable:!0},{key:"duration",label:"Duration",render:e=>t.jsx(z,{startDate:e.created_at,endDate:e.status==="running"?null:e.updated_at,isLive:e.status==="running"}),className:"w-28"},{key:"actions",label:"",render:e=>t.jsxs(q,{children:[t.jsx(k,{icon:K,title:`Filter by ${e.entity}`,onClick:()=>p(e.entity)}),t.jsx("button",{onClick:o=>{o.stopPropagation(),n(e.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${e.status}`,children:t.jsx("svg",{className:`w-[18px] h-[18px] ${te[e.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:t.jsx("circle",{cx:"12",cy:"12",r:"6"})})}),m&&t.jsx(k,{icon:X,title:"View config",onClick:()=>l(`/workflows/registry/${encodeURIComponent(e.entity)}`)})]}),className:"w-24 text-right"}]}function ke({tier:p="all"}){I();const n=Y(),{isSuperAdmin:m}=A(),{namespace:l}=M(),{filters:a,setFilter:e,pagination:o,sort:r,setSort:j}=U({filters:{search:"",entity:"",status:"",tier:p}}),c=a.tier||"all",g=c==="certified"?"true":c==="durable"?"false":void 0,{data:b}=E(),{data:y}=$(),S=d.useMemo(()=>{const s=new Map;for(const w of y??[])s.set(w.workflow_type,w.tier??"durable");return s},[y]),_=se(s=>e("entity",s),s=>e("status",s),m,n,S),[u,C]=d.useState(a.search);d.useEffect(()=>{if(u===a.search)return;const s=setTimeout(()=>e("search",u),300);return()=>clearTimeout(s)},[u,e,a.search]);const{data:i,isLoading:N,refetch:P,isFetching:T}=L({limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0}),h=(i==null?void 0:i.total)??0,F=(i==null?void 0:i.jobs)??[],D=d.useMemo(()=>[...new Set((b??[]).map(s=>s.workflow_type))].sort(),[b]),R="Workflow Executions",W=c==="certified"?"No certified workflow executions found":c==="durable"?"No durable workflow executions found":"No workflow executions found";return t.jsxs("div",{children:[t.jsx(V,{title:R,docsHash:"#docs:dashboard.md:procedural-executions"}),t.jsxs(G,{actions:t.jsx(Q,{onRefresh:()=>P(),isFetching:T,apiPath:H("/workflow-states/jobs",{limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:r.sort_by||"created_at",order:r.order||"desc",registered:g,namespace:l||void 0})}),children:[t.jsx("input",{type:"text",placeholder:"Search workflow ID...",value:u,onChange:s=>C(s.target.value),className:"input text-2xs py-1 px-2 w-56"}),t.jsx(f,{}),t.jsx(x,{label:"Type",value:a.entity,onChange:s=>e("entity",s),options:D.map(s=>({value:s,label:s}))}),t.jsx(f,{}),t.jsx(x,{label:"Status",value:a.status,onChange:s=>e("status",s),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]}),t.jsx(f,{}),t.jsx(x,{label:"Tier",value:a.tier==="all"?"":a.tier,onChange:s=>e("tier",s||"all"),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]})]}),t.jsx(O,{columns:_,data:F,keyFn:s=>s.workflow_id,onRowClick:s=>n(`/workflows/executions/${s.workflow_id}`),isLoading:N,emptyMessage:W,sort:r,onSort:j}),t.jsx(J,{page:o.page,totalPages:o.totalPages(h),onPageChange:o.setPage,total:h,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ke as WorkflowsDashboard};
2
- //# sourceMappingURL=WorkflowsDashboard-BMQd_0tW.js.map
@@ -1,2 +0,0 @@
1
- import{u as i}from"./vendor-query-RUZdMvN6.js";import{d as e}from"./index-CfAi1OsI.js";function t(){return i({queryKey:["capabilities"],queryFn:()=>e("/capabilities")})}export{t as u};
2
- //# sourceMappingURL=capabilities-IaCcS7ge.js.map
@@ -1,2 +0,0 @@
1
- import{a as p,j as e}from"./vendor-query-RUZdMvN6.js";import{E as B,b as D,t as E}from"./index-CfAi1OsI.js";import{b as q,c as H,d as J,e as V,f as W,u as Q}from"./users-G8qwyZKS.js";import{u as T}from"./useFilterParams-crmlBw_l.js";import{D as I}from"./DataTable-Bir0Xs1p.js";import{S as F}from"./StickyPagination-hMrnLXde.js";import{F as K,a as M,b as $}from"./FilterBar-D7GghUsU.js";import{C as R}from"./ConfirmDeleteModal-CQsJUzEa.js";import{R as z,a as k}from"./RowActions-eYrzgQSj.js";import{P as O}from"./PageHeader-Ce4GcIYo.js";import{R as S}from"./RolePill-CnuBPhPw.js";import{M as C}from"./Modal-BU7No9NH.js";import{u as X,a as Y,b as Z,c as ee,d as se,e as te,f as ae,g as le,h as ne}from"./bots-ClLcDGJb.js";import{T as re}from"./TimeAgo-D_DA9ucC.js";import{a3 as ie,a4 as ce,aJ as oe,T as A,e as de,a2 as L,D as G,U as xe,d as me}from"./vendor-icons-BpZiWH2f.js";import{u as ue,a as pe,b as he,c as je}from"./personas-Cmz2SAEU.js";import{S as ge}from"./ScopeBadge-BUpYpS3x.js";import{L as ve,f as ye}from"./vendor-react-CdqEC2zv.js";import"./EmptyState-lpUFYfun.js";function fe({open:l,onClose:i}){const s=q(),[a,r]=p.useState({external_id:"",email:"",display_name:"",password:""}),[d,h]=p.useState(l);l!==d&&(h(l),l&&r({external_id:"",email:"",display_name:"",password:""}));const j=()=>{a.external_id.trim()&&s.mutate({external_id:a.external_id.trim(),email:a.email.trim()||void 0,display_name:a.display_name.trim()||void 0,password:a.password||void 0},{onSuccess:i})},m=(t,u)=>r(x=>({...x,[t]:u}));return e.jsx(C,{open:l,onClose:i,title:"Create User",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"External ID (required)"}),e.jsx("input",{type:"text",value:a.external_id,onChange:t=>m("external_id",t.target.value),placeholder:"e.g., john.doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:a.display_name,onChange:t=>m("display_name",t.target.value),placeholder:"John Doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:a.email,onChange:t=>m("email",t.target.value),placeholder:"john@example.com",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Password"}),e.jsx("input",{type:"password",value:a.password,onChange:t=>m("password",t.target.value),placeholder:"Leave blank for no password",className:"input text-xs w-full"})]}),s.error&&e.jsx("p",{className:"text-xs text-status-error",children:s.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:i,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:!a.external_id.trim()||s.isPending,className:"btn-primary text-xs",children:s.isPending?"Creating...":"Create"})]})]})})}function be({open:l,onClose:i,user:s}){const a=H(),[r,d]=p.useState({display_name:"",email:"",status:"active"}),[h,j]=p.useState(s);s!==h&&(j(s),s&&d({display_name:s.display_name??"",email:s.email??"",status:s.status}));const m=()=>{s&&a.mutate({id:s.id,display_name:r.display_name.trim()||void 0,email:r.email.trim()||void 0,status:r.status},{onSuccess:i})};return e.jsx(C,{open:l,onClose:i,title:`Edit — ${(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:r.display_name,onChange:t=>d(u=>({...u,display_name:t.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:r.email,onChange:t=>d(u=>({...u,email:t.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:r.status,onChange:t=>d(u=>({...u,status:t.target.value})),className:"select text-xs w-full",children:[e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"inactive",children:"Inactive"}),e.jsx("option",{value:"suspended",children:"Suspended"})]})]}),a.error&&e.jsx("p",{className:"text-xs text-status-error",children:a.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:i,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:a.isPending,className:"btn-primary text-xs",children:a.isPending?"Saving...":"Save"})]})]})})}function Ne({open:l,onClose:i}){const s=X(),[a,r]=p.useState({name:"",display_name:"",description:""}),[d,h]=p.useState(l);l!==d&&(h(l),l&&r({name:"",display_name:"",description:""}));const j=()=>{a.name.trim()&&s.mutate({name:a.name.trim(),display_name:a.display_name.trim()||void 0,description:a.description.trim()||void 0},{onSuccess:i})},m=(t,u)=>r(x=>({...x,[t]:u}));return e.jsx(C,{open:l,onClose:i,title:"Create Service Account",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name (required)"}),e.jsx("input",{type:"text",value:a.name,onChange:t=>m("name",t.target.value.replace(/\s+/g,"-").toLowerCase()),placeholder:"e.g., ci-bot",className:"input text-xs w-full font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:a.display_name,onChange:t=>m("display_name",t.target.value),placeholder:"CI Bot",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:a.description,onChange:t=>m("description",t.target.value),placeholder:"Runs scheduled workflows",className:"input text-xs w-full"})]}),s.error&&e.jsx("p",{className:"text-xs text-status-error",children:s.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:i,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:!a.name.trim()||s.isPending,className:"btn-primary text-xs",children:s.isPending?"Creating...":"Create"})]})]})})}function we({open:l,onClose:i,bot:s}){const a=Y(),[r,d]=p.useState({display_name:"",description:"",status:"active"}),[h,j]=p.useState(s);s!==h&&(j(s),s&&d({display_name:s.display_name??"",description:s.description??"",status:s.status}));const m=()=>{s&&a.mutate({id:s.id,display_name:r.display_name.trim()||void 0,description:r.description.trim()||void 0,status:r.status},{onSuccess:i})};return e.jsx(C,{open:l,onClose:i,title:`Edit — ${(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:r.display_name,onChange:t=>d(u=>({...u,display_name:t.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:r.description,onChange:t=>d(u=>({...u,description:t.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:r.status,onChange:t=>d(u=>({...u,status:t.target.value})),className:"select text-xs w-full",children:[e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"inactive",children:"Inactive"}),e.jsx("option",{value:"suspended",children:"Suspended"})]})]}),a.error&&e.jsx("p",{className:"text-xs text-status-error",children:a.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:i,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:a.isPending,className:"btn-primary text-xs",children:a.isPending?"Saving...":"Save"})]})]})})}function ke({botId:l}){const{data:i}=Z(l),s=ee(),a=se(),[r,d]=p.useState(""),[h,j]=p.useState("read"),[m,t]=p.useState(null),[u,x]=p.useState(!1),[g,o]=p.useState(null),f=(i==null?void 0:i.keys)??[],c={read:{label:"Read only",scopes:["mcp:read"],hint:"Discovery and monitoring — read-safe tools only"},full:{label:"Full access",scopes:["mcp:read","mcp:full"],hint:"All tools — can modify state"}},y=()=>{r.trim()&&s.mutate({botId:l,name:r.trim(),scopes:c[h].scopes},{onSuccess:v=>{t(v.rawKey),d("")}})},b=()=>{m&&(navigator.clipboard.writeText(m),x(!0),setTimeout(()=>x(!1),2e3))},N=()=>{g&&a.mutate({botId:l,keyId:g.id},{onSuccess:()=>o(null)})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"API Keys"}),m&&e.jsxs("div",{className:"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md",children:[e.jsx("p",{className:"text-2xs font-semibold text-status-success mb-1",children:"Key generated — copy now, it won't be shown again"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"text-2xs font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 min-w-0 overflow-hidden text-ellipsis whitespace-nowrap",children:m}),e.jsx("button",{onClick:b,className:"text-text-tertiary hover:text-text-primary shrink-0",title:"Copy to clipboard",children:u?e.jsx(ie,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(ce,{className:"w-3.5 h-3.5"})})]})]}),f.length===0?e.jsx("p",{className:"text-xs text-text-tertiary mb-3",children:"No API keys."}):e.jsx("div",{className:"space-y-1.5 mb-3",children:f.map(v=>e.jsxs("div",{className:"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx(oe,{className:"w-3 h-3 text-text-tertiary"}),e.jsx("span",{className:"text-text-primary font-mono",children:v.name}),(v.scopes??[]).map(n=>e.jsx("span",{className:`px-1.5 py-0.5 rounded text-2xs font-mono ${n.includes("full")?"bg-status-warning/15 text-status-warning":"bg-accent/10 text-accent"}`,children:n},n)),v.last_used_at&&e.jsxs("span",{className:"text-2xs text-text-tertiary",children:["used ",e.jsx(re,{date:v.last_used_at})]})]}),e.jsx("button",{onClick:()=>o(v),className:"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke key",children:e.jsx(A,{className:"w-3 h-3"})})]},v.id))}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("input",{type:"text",value:r,onChange:v=>d(v.target.value),placeholder:"Key name...",className:"input text-xs font-mono"}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("div",{className:"flex rounded-md border border-surface-border overflow-hidden shrink-0",children:Object.entries(c).map(([v,n])=>e.jsx("button",{type:"button",onClick:()=>j(v),title:n.hint,className:`px-2.5 py-1 text-2xs font-medium transition-colors ${h===v?"bg-accent text-text-inverse":"bg-surface text-text-secondary hover:bg-surface-hover"}`,children:n.label},v))}),e.jsxs("button",{onClick:y,disabled:!r.trim()||s.isPending,className:"btn-primary text-xs inline-flex items-center gap-1 shrink-0",children:[e.jsx(de,{className:"w-3 h-3"}),s.isPending?"...":"Generate"]})]})]}),s.error&&e.jsx("p",{className:"text-2xs text-status-error mt-1",children:s.error.message}),e.jsx(R,{open:!!g,onClose:()=>o(null),onConfirm:N,title:"Revoke API Key",description:e.jsxs(e.Fragment,{children:["Revoke API key"," ",e.jsx("span",{className:"font-medium text-text-primary font-mono",children:g==null?void 0:g.name}),"? This bot will no longer be able to authenticate with this key."]}),isPending:a.isPending,error:a.error})]})}function Se({bot:l}){const{data:i}=B(),s=te(),a=ae(),[r,d]=p.useState(""),[h,j]=p.useState("member"),m=(i==null?void 0:i.roles)??[],t=l.roles??[],u=p.useMemo(()=>{const o=new Set(t.map(f=>f.role));return m.filter(f=>!o.has(f))},[m,t]),x=()=>{r.trim()&&s.mutate({botId:l.id,role:r.trim(),type:h},{onSuccess:()=>{d(""),j("member")}})},g=o=>{a.mutate({botId:l.id,role:o})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"Roles"}),t.length===0?e.jsx("p",{className:"text-xs text-text-tertiary mb-3",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-wrap gap-2 mb-3",children:t.map(o=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary",children:[e.jsx(S,{role:o.role}),e.jsx("span",{className:"text-2xs text-text-tertiary",children:o.type}),e.jsx("button",{onClick:()=>g(o.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${o.role}`,children:"×"})]},o.role))}),u.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("select",{value:r,onChange:o=>d(o.target.value),className:"select text-xs font-mono w-full min-w-0","aria-label":"Role",children:[e.jsx("option",{value:"",children:"Select a role..."}),u.map(o=>e.jsx("option",{value:o,children:o},o))]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 items-end",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("label",{className:"block text-2xs text-text-tertiary mb-1",children:"Type"}),e.jsxs("select",{value:h,onChange:o=>j(o.target.value),className:"select text-xs w-full min-w-0","aria-label":"Role type",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]})]}),e.jsx("div",{className:"flex justify-end",children:e.jsx("button",{onClick:x,disabled:!r||s.isPending,className:"btn-primary text-xs",children:s.isPending?"...":"Add Role"})})]})]}),s.error&&e.jsx("p",{className:"text-2xs text-status-error mt-1",children:s.error.message})]})}function Ce({bot:l}){return l?e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:l.display_name||l.external_id}),l.description&&e.jsx("p",{className:"text-xs text-text-tertiary mt-0.5",children:l.description})]}),e.jsx(ke,{botId:l.id}),e.jsx(Se,{bot:l})]}):e.jsx("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a service account to manage its API keys and roles."})})}const _e={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"},Pe=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}];function Re({embedded:l=!1}){const{filters:i,setFilter:s,pagination:a}=T({filters:{status:"",search:""}}),r=le(),[d,h]=p.useState(!1),[j,m]=p.useState(null),[t,u]=p.useState(null),[x,g]=p.useState(null),{data:o,isLoading:f}=ne({status:i.status||void 0,search:i.search||void 0,limit:a.pageSize,offset:a.offset}),c=(o==null?void 0:o.total)??0,y=(o==null?void 0:o.bots)??[],b=p.useMemo(()=>t?y.find(n=>n.id===t.id)??t:null,[y,t]),N=[{key:"display_name",label:"Service Account",render:n=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${_e[n.status]??"bg-status-pending"}`,title:n.status}),e.jsx("span",{className:"text-sm text-text-primary whitespace-nowrap",children:n.display_name||n.external_id})]})},{key:"description",label:"Description",render:n=>e.jsx("span",{className:"block max-w-[32rem] truncate text-xs text-text-tertiary",title:n.description??void 0,children:n.description??""})},{key:"roles",label:"Roles",render:n=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(n.roles??[]).map(w=>e.jsx(S,{role:w.role},w.role))})},{key:"created_at",label:"Created",render:n=>e.jsx(D,{date:n.created_at}),className:"w-36 whitespace-nowrap"},{key:"actions",label:"",render:n=>e.jsxs(z,{children:[e.jsx(k,{icon:L,title:"Edit service account",onClick:()=>m(n)}),e.jsx(k,{icon:A,title:"Delete service account",onClick:()=>g(n),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],v=()=>{x&&r.mutate(x.id,{onSuccess:()=>{g(null),(t==null?void 0:t.id)===x.id&&u(null)}})};return e.jsxs("div",{children:[l?e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>h(!0),className:"btn-primary text-xs",children:"Add Service Account"})}):e.jsx(O,{title:"Service Accounts",actions:e.jsx("button",{onClick:()=>h(!0),className:"btn-primary text-xs",children:"Add Service Account"})}),e.jsxs(K,{children:[e.jsx(M,{label:"Search",value:i.search,onChange:n=>s("search",n),placeholder:"name, id, description…"}),e.jsx($,{label:"Status",value:i.status,onChange:n=>s("status",n),options:Pe})]}),e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-[1fr_360px] gap-6 items-start",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(I,{columns:N,data:y,keyFn:n=>n.id,isLoading:f,emptyMessage:"No service accounts yet",onRowClick:n=>u(n),activeRowKey:(b==null?void 0:b.id)??null}),e.jsx(F,{page:a.page,totalPages:a.totalPages(c),onPageChange:a.setPage,total:c,pageSize:a.pageSize,onPageSizeChange:a.setPageSize})]}),e.jsx("div",{className:"sticky top-4",children:e.jsx(Ce,{bot:b})})]}),e.jsx(Ne,{open:d,onClose:()=>h(!1)}),e.jsx(we,{open:!!j,onClose:()=>m(null),bot:j}),e.jsx(R,{open:!!x,onClose:()=>g(null),onConfirm:v,title:"Delete Service Account",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(x==null?void 0:x.display_name)||(x==null?void 0:x.external_id)}),"? This will also revoke all API keys. This action cannot be undone."]}),isPending:r.isPending,error:r.error})]})}const P=[{value:"all|all",label:"See all · act on all",read_scope:"all",write_scope:"all"},{value:"all|self",label:"See all · act on self",read_scope:"all",write_scope:"self"},{value:"self|self",label:"See self · act on self",read_scope:"self",write_scope:"self"},{value:"all|none",label:"See all · read-only",read_scope:"all",write_scope:"none"},{value:"self|none",label:"See self · read-only",read_scope:"self",write_scope:"none"}],_="all|all";function U(l){return P.find(i=>i.value===l)??P[0]}function Ae({user:l}){const{data:i}=ue(),{data:s}=pe(l.id),a=he(),r=je(),[d,h]=p.useState(""),j=(s==null?void 0:s.personas)??[],m=p.useMemo(()=>{const t=new Set(j.map(u=>u.key));return((i==null?void 0:i.personas)??[]).filter(u=>!t.has(u.key))},[i,j]);return j.length===0&&m.length===0?null:e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:"Personas"}),j.length>0&&e.jsx("div",{className:"flex flex-col gap-2",children:j.map(t=>e.jsxs("span",{className:"flex items-center gap-2.5 w-full min-w-0 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary",children:[e.jsx(G,{className:"w-3 h-3 shrink-0 text-text-tertiary","aria-hidden":!0}),e.jsx(ve,{to:`/admin/personas/${encodeURIComponent(t.key)}`,className:"flex-1 min-w-0 truncate transition-colors hover:text-accent",title:t.key,children:t.title||t.key}),e.jsxs("span",{className:"shrink-0 text-2xs text-text-tertiary tabular-nums",children:[t.roles.length," role",t.roles.length===1?"":"s"]}),e.jsx("button",{onClick:()=>r.mutate({userId:l.id,key:t.key}),className:"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1",title:`Unassign ${t.title||t.key}`,children:"×"})]},t.key))}),m.length>0&&e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("select",{value:d,onChange:t=>h(t.target.value),className:"select text-xs w-full min-w-0","aria-label":"Persona",children:[e.jsx("option",{value:"",children:"Assign a persona..."}),m.map(t=>e.jsx("option",{value:t.key,children:t.title||t.key},t.key))]}),e.jsx("button",{onClick:()=>{d&&a.mutate({userId:l.id,key:d},{onSuccess:()=>h("")})},disabled:!d||a.isPending,className:"btn-primary text-xs shrink-0",children:a.isPending?"...":"Assign"})]}),(a.error||r.error)&&e.jsx("p",{className:"text-2xs text-status-error",children:(a.error||r.error).message})]})}function Ue({user:l}){const{data:i}=B(),s=J(),a=V(),[r,d]=p.useState(""),[h,j]=p.useState("member"),[m,t]=p.useState(_),u=(i==null?void 0:i.roles)??[],x=(l==null?void 0:l.roles)??[],g=p.useMemo(()=>{const c=new Set(x.map(y=>y.role));return u.filter(y=>!c.has(y))},[u,x]),o=()=>{if(!l||!r.trim())return;const c=U(h==="member"?m:_);s.mutate({userId:l.id,role:r.trim(),type:h,read_scope:c.read_scope,write_scope:c.write_scope},{onSuccess:()=>{d(""),j("member"),t(_)}})},f=c=>{l&&a.mutate({userId:l.id,role:c})};return e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Role Membership"}),l?e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{children:e.jsx("p",{className:"text-sm text-text-primary",children:l.display_name||l.external_id})}),e.jsx(Ae,{user:l}),e.jsx("p",{className:"text-2xs text-text-tertiary",children:"Member of:"}),x.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-col gap-2",children:x.map(c=>e.jsxs("span",{className:"flex items-center gap-2.5 w-full min-w-0 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary",children:[e.jsx("span",{className:"flex-1 min-w-0 truncate",title:c.role,children:e.jsx(S,{role:c.role,tone:"inherit"})}),e.jsx("span",{className:"w-14 shrink-0 text-2xs uppercase tracking-wide text-text-tertiary",children:c.type}),c.type==="member"&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"w-px h-3 bg-surface-border shrink-0","aria-hidden":!0}),e.jsx(ge,{read:c.read_scope,write:c.write_scope,className:"shrink-0"})]}),c.granted_by_persona&&e.jsx("span",{className:"shrink-0",title:`Granted by persona ${c.granted_by_persona}`,children:e.jsx(G,{className:"w-3 h-3 text-text-tertiary","aria-hidden":!0})}),e.jsx("button",{onClick:()=>f(c.role),className:"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1",title:`Remove ${c.role}`,children:"×"})]},c.role))}),g.length>0&&e.jsxs("div",{className:"pt-3 border-t border-surface-border space-y-2",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-widest text-text-tertiary",children:"Add Role"}),e.jsxs("select",{value:r,onChange:c=>d(c.target.value),className:"select text-xs font-mono w-full min-w-0","aria-label":"Role",children:[e.jsx("option",{value:"",children:"Select a role..."}),g.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("label",{className:"block text-2xs text-text-tertiary mb-1",children:"Type"}),e.jsxs("select",{value:h,onChange:c=>j(c.target.value),className:"select text-xs w-full min-w-0","aria-label":"Role type",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]})]}),h==="member"&&e.jsxs("div",{className:"min-w-0",children:[e.jsx("label",{className:"block text-2xs text-text-tertiary mb-1",children:"Scope"}),e.jsx("select",{value:m,onChange:c=>t(c.target.value),className:"select text-xs w-full min-w-0","aria-label":"Work-surface scope",children:P.map(c=>e.jsx("option",{value:c.value,children:c.label},c.value))})]})]}),e.jsx("div",{className:"flex justify-end pt-1",children:e.jsx("button",{onClick:o,disabled:!r||s.isPending,className:"btn-primary text-xs",children:s.isPending?"...":"Add Role"})}),s.error&&e.jsx("p",{className:"text-2xs text-status-error",children:s.error.message})]})]}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a user to manage their roles."})]})}function Be({active:l,onChange:i}){const s=(a,r,d)=>e.jsxs("button",{onClick:()=>i(a),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${l===a?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[r,d]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[s("users",e.jsx(xe,{className:"w-3.5 h-3.5"}),"User Accounts"),s("service-accounts",e.jsx(me,{className:"w-3.5 h-3.5"}),"Service Accounts")]})}const De=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}],Ee={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function ss(){const{isBuilder:l}=E(),[i,s]=ye(),a=i.get("tab"),r=l&&a==="service-accounts"?"service-accounts":"users",d=h=>{s(h==="users"?{}:{tab:h})};return e.jsxs("div",{children:[e.jsx(O,{title:"Accounts",docsHash:"#docs:dashboard.md:accounts",actions:l?e.jsx(Be,{active:r,onChange:d}):void 0}),r==="users"?e.jsx(Te,{}):e.jsx(Re,{embedded:!0})]})}function Te(){const{isBuilder:l}=E(),{filters:i,setFilter:s,pagination:a}=T({filters:{status:"",search:""}}),r=W(),[d,h]=p.useState(!1),[j,m]=p.useState(null),[t,u]=p.useState(null),[x,g]=p.useState(null),{data:o,isLoading:f}=Q({status:i.status||void 0,search:i.search||void 0,limit:a.pageSize,offset:a.offset}),c=(o==null?void 0:o.total)??0,y=(o==null?void 0:o.users)??[],b=p.useMemo(()=>t?y.find(n=>n.id===t.id)??t:null,[y,t]),N=[{key:"display_name",label:"User",render:n=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2.5 h-2.5 rounded-full dot-ring shrink-0 ${Ee[n.status]??"bg-status-pending"}`,title:n.status}),e.jsx("span",{className:"text-xs text-text-primary whitespace-nowrap",children:n.display_name||n.external_id})]})},{key:"email",label:"Email",render:n=>n.email?e.jsx("span",{className:"text-xs text-text-secondary whitespace-nowrap",children:n.email}):e.jsx("span",{className:"text-xs text-text-quaternary",children:"—"})},{key:"roles",label:"Roles",render:n=>e.jsx("div",{className:"flex gap-2 flex-wrap",children:(n.roles??[]).map(w=>e.jsx(S,{role:w.role,size:"md"},w.role))})},{key:"created_at",label:"Created",render:n=>e.jsx(D,{date:n.created_at}),className:"w-36 whitespace-nowrap"},...l?[{key:"actions",label:"",render:n=>e.jsxs(z,{children:[e.jsx(k,{icon:L,title:"Edit user",onClick:()=>m(n)}),e.jsx(k,{icon:A,title:"Delete user",onClick:()=>g(n),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}]:[]],v=()=>{x&&r.mutate(x.id,{onSuccess:()=>g(null)})};return e.jsxs("div",{children:[l&&e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>h(!0),className:"btn-primary text-xs",children:"Add User"})}),e.jsxs(K,{children:[e.jsx(M,{label:"Search",value:i.search,onChange:n=>s("search",n),placeholder:"name, email, id…"}),e.jsx($,{label:"Status",value:i.status,onChange:n=>s("status",n),options:De})]}),e.jsxs("div",{className:"grid grid-cols-1 @split:grid-cols-[1fr_360px] gap-6 items-start",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(I,{columns:N,data:y,keyFn:n=>n.id,isLoading:f,emptyMessage:"No users found",onRowClick:n=>u(n),activeRowKey:(b==null?void 0:b.id)??null}),e.jsx(F,{page:a.page,totalPages:a.totalPages(c),onPageChange:a.setPage,total:c,pageSize:a.pageSize,onPageSizeChange:a.setPageSize})]}),e.jsx("div",{className:"sticky top-4",children:e.jsx(Ue,{user:b})})]}),e.jsx(fe,{open:d,onClose:()=>h(!1)}),e.jsx(be,{open:!!j,onClose:()=>m(null),user:j}),e.jsx(R,{open:!!x,onClose:()=>g(null),onConfirm:v,title:"Delete User",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(x==null?void 0:x.display_name)||(x==null?void 0:x.external_id)}),"? This action cannot be undone."]}),isPending:r.isPending,error:r.error})]})}export{ss as UsersPage};
2
- //# sourceMappingURL=index-CLmZaNTK.js.map