@hotmeshio/long-tail 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/build/api/controlplane.d.ts +1 -0
  2. package/build/api/controlplane.js +1 -0
  3. package/build/routes/controlplane.js +2 -2
  4. package/dashboard/dist/assets/{AdminDashboard-CR0FtTE6.js → AdminDashboard-C0_qN2h3.js} +2 -2
  5. package/dashboard/dist/assets/{AdminDashboard-CR0FtTE6.js.map → AdminDashboard-C0_qN2h3.js.map} +1 -1
  6. package/dashboard/dist/assets/{AgentConfigPage-BVypgq9m.js → AgentConfigPage-DG1zOIiz.js} +5 -5
  7. package/dashboard/dist/assets/{AgentConfigPage-BVypgq9m.js.map → AgentConfigPage-DG1zOIiz.js.map} +1 -1
  8. package/dashboard/dist/assets/{AgentDetailPage-D64ath8c.js → AgentDetailPage-B5kaAJDM.js} +3 -3
  9. package/dashboard/dist/assets/{AgentDetailPage-D64ath8c.js.map → AgentDetailPage-B5kaAJDM.js.map} +1 -1
  10. package/dashboard/dist/assets/{AgentsPage-j-zblMNR.js → AgentsPage-DJWSuoJA.js} +2 -2
  11. package/dashboard/dist/assets/{AgentsPage-j-zblMNR.js.map → AgentsPage-DJWSuoJA.js.map} +1 -1
  12. package/dashboard/dist/assets/{AvailableEscalationsPage-DmUid1h0.js → AvailableEscalationsPage-DrarbHov.js} +2 -2
  13. package/dashboard/dist/assets/{AvailableEscalationsPage-DmUid1h0.js.map → AvailableEscalationsPage-DrarbHov.js.map} +1 -1
  14. package/dashboard/dist/assets/{BotPicker-DCScT8BN.js → BotPicker-CvXQwE5Z.js} +2 -2
  15. package/dashboard/dist/assets/{BotPicker-DCScT8BN.js.map → BotPicker-CvXQwE5Z.js.map} +1 -1
  16. package/dashboard/dist/assets/{CapabilitiesPage-g5iUvHRL.js → CapabilitiesPage-BiL9QUxI.js} +2 -2
  17. package/dashboard/dist/assets/{CapabilitiesPage-g5iUvHRL.js.map → CapabilitiesPage-BiL9QUxI.js.map} +1 -1
  18. package/dashboard/dist/assets/{CollapsibleSection-Dj1YOsVG.js → CollapsibleSection-D9F01Tny.js} +2 -2
  19. package/dashboard/dist/assets/{CollapsibleSection-Dj1YOsVG.js.map → CollapsibleSection-D9F01Tny.js.map} +1 -1
  20. package/dashboard/dist/assets/{CredentialsPage-Dvb4QelY.js → CredentialsPage-C-rjAIK3.js} +2 -2
  21. package/dashboard/dist/assets/{CredentialsPage-Dvb4QelY.js.map → CredentialsPage-C-rjAIK3.js.map} +1 -1
  22. package/dashboard/dist/assets/{CronLabel-sk1BkcJd.js → CronLabel-DnZF8_vw.js} +2 -2
  23. package/dashboard/dist/assets/{CronLabel-sk1BkcJd.js.map → CronLabel-DnZF8_vw.js.map} +1 -1
  24. package/dashboard/dist/assets/{CustomDurationPicker-C0MV2Q06.js → CustomDurationPicker-BYDrcsYT.js} +2 -2
  25. package/dashboard/dist/assets/{CustomDurationPicker-C0MV2Q06.js.map → CustomDurationPicker-BYDrcsYT.js.map} +1 -1
  26. package/dashboard/dist/assets/{DropZone-DN8uwUtf.js → DropZone-BEW3jBzf.js} +2 -2
  27. package/dashboard/dist/assets/{DropZone-DN8uwUtf.js.map → DropZone-BEW3jBzf.js.map} +1 -1
  28. package/dashboard/dist/assets/{ElapsedCell-CFXhhKKc.js → ElapsedCell-BkiVdGaJ.js} +2 -2
  29. package/dashboard/dist/assets/{ElapsedCell-CFXhhKKc.js.map → ElapsedCell-BkiVdGaJ.js.map} +1 -1
  30. package/dashboard/dist/assets/{EscalationsOverview-BEuUFGwC.js → EscalationsOverview-Cg2SN0WK.js} +2 -2
  31. package/dashboard/dist/assets/{EscalationsOverview-BEuUFGwC.js.map → EscalationsOverview-Cg2SN0WK.js.map} +1 -1
  32. package/dashboard/dist/assets/{EventTable-DcwVWOKb.js → EventTable-B9wYf13g.js} +2 -2
  33. package/dashboard/dist/assets/{EventTable-DcwVWOKb.js.map → EventTable-B9wYf13g.js.map} +1 -1
  34. package/dashboard/dist/assets/{EventTopicPill-CWCP1v1O.js → EventTopicPill-By-6sXDp.js} +2 -2
  35. package/dashboard/dist/assets/{EventTopicPill-CWCP1v1O.js.map → EventTopicPill-By-6sXDp.js.map} +1 -1
  36. package/dashboard/dist/assets/{HomePage-BH-F5ws9.js → HomePage-74mCQ5nB.js} +2 -2
  37. package/dashboard/dist/assets/{HomePage-BH-F5ws9.js.map → HomePage-74mCQ5nB.js.map} +1 -1
  38. package/dashboard/dist/assets/ListToolbar-DL1wEuvL.js +2 -0
  39. package/dashboard/dist/assets/{ListToolbar-CUxJlz__.js.map → ListToolbar-DL1wEuvL.js.map} +1 -1
  40. package/dashboard/dist/assets/{McpOverview-O8XrOzy0.js → McpOverview-D34bLMuP.js} +2 -2
  41. package/dashboard/dist/assets/{McpOverview-O8XrOzy0.js.map → McpOverview-D34bLMuP.js.map} +1 -1
  42. package/dashboard/dist/assets/{McpQueryDetailPage-DhiR0Xrx.js → McpQueryDetailPage-gLGTGX6g.js} +2 -2
  43. package/dashboard/dist/assets/{McpQueryDetailPage-DhiR0Xrx.js.map → McpQueryDetailPage-gLGTGX6g.js.map} +1 -1
  44. package/dashboard/dist/assets/{McpQueryPage-Czot0nfl.js → McpQueryPage-wPHJkhEp.js} +2 -2
  45. package/dashboard/dist/assets/{McpQueryPage-Czot0nfl.js.map → McpQueryPage-wPHJkhEp.js.map} +1 -1
  46. package/dashboard/dist/assets/{McpRunDetailPage-B1kNnD_t.js → McpRunDetailPage-SoXudCbq.js} +2 -2
  47. package/dashboard/dist/assets/{McpRunDetailPage-B1kNnD_t.js.map → McpRunDetailPage-SoXudCbq.js.map} +1 -1
  48. package/dashboard/dist/assets/{McpRunsPage-QUY3pWp9.js → McpRunsPage-BUSxdydO.js} +2 -2
  49. package/dashboard/dist/assets/{McpRunsPage-QUY3pWp9.js.map → McpRunsPage-BUSxdydO.js.map} +1 -1
  50. package/dashboard/dist/assets/{OperatorDashboard-BG1Q9qZk.js → OperatorDashboard-CYCl2our.js} +2 -2
  51. package/dashboard/dist/assets/{OperatorDashboard-BG1Q9qZk.js.map → OperatorDashboard-CYCl2our.js.map} +1 -1
  52. package/dashboard/dist/assets/{PageHeader-DlzOOM4Y.js → PageHeader-Bo0SpcCK.js} +2 -2
  53. package/dashboard/dist/assets/{PageHeader-DlzOOM4Y.js.map → PageHeader-Bo0SpcCK.js.map} +1 -1
  54. package/dashboard/dist/assets/{PageHeaderWithStats-C5cZ3IOO.js → PageHeaderWithStats-7K5BdhOj.js} +2 -2
  55. package/dashboard/dist/assets/{PageHeaderWithStats-C5cZ3IOO.js.map → PageHeaderWithStats-7K5BdhOj.js.map} +1 -1
  56. package/dashboard/dist/assets/{ProcessDetailPage-DS1AwTso.js → ProcessDetailPage-DzGacZpO.js} +2 -2
  57. package/dashboard/dist/assets/{ProcessDetailPage-DS1AwTso.js.map → ProcessDetailPage-DzGacZpO.js.map} +1 -1
  58. package/dashboard/dist/assets/{ProcessesListPage-CAmVcn1P.js → ProcessesListPage-Bmn33g_l.js} +2 -2
  59. package/dashboard/dist/assets/{ProcessesListPage-CAmVcn1P.js.map → ProcessesListPage-Bmn33g_l.js.map} +1 -1
  60. package/dashboard/dist/assets/{RolePill-BZaUpkHg.js → RolePill-BDzPFQUv.js} +2 -2
  61. package/dashboard/dist/assets/{RolePill-BZaUpkHg.js.map → RolePill-BDzPFQUv.js.map} +1 -1
  62. package/dashboard/dist/assets/{RolesPage-CFdIXfmv.js → RolesPage-BTtaabkS.js} +2 -2
  63. package/dashboard/dist/assets/{RolesPage-CFdIXfmv.js.map → RolesPage-BTtaabkS.js.map} +1 -1
  64. package/dashboard/dist/assets/{RunAsSelector-BGww9lta.js → RunAsSelector-B1R8nJvE.js} +2 -2
  65. package/dashboard/dist/assets/{RunAsSelector-BGww9lta.js.map → RunAsSelector-B1R8nJvE.js.map} +1 -1
  66. package/dashboard/dist/assets/{ServerName-DfS3pfon.js → ServerName-CEOFF7UG.js} +2 -2
  67. package/dashboard/dist/assets/{ServerName-DfS3pfon.js.map → ServerName-CEOFF7UG.js.map} +1 -1
  68. package/dashboard/dist/assets/{SwimlaneTimeline-C2hGjy0V.js → SwimlaneTimeline-CU2ZD9cC.js} +2 -2
  69. package/dashboard/dist/assets/{SwimlaneTimeline-C2hGjy0V.js.map → SwimlaneTimeline-CU2ZD9cC.js.map} +1 -1
  70. package/dashboard/dist/assets/{TagInput-D21mrQx6.js → TagInput-VBY0xIwb.js} +2 -2
  71. package/dashboard/dist/assets/{TagInput-D21mrQx6.js.map → TagInput-VBY0xIwb.js.map} +1 -1
  72. package/dashboard/dist/assets/{TaskDetailPage-B49WQj8W.js → TaskDetailPage-CZw_F8y4.js} +2 -2
  73. package/dashboard/dist/assets/{TaskDetailPage-B49WQj8W.js.map → TaskDetailPage-CZw_F8y4.js.map} +1 -1
  74. package/dashboard/dist/assets/{TaskQueuePill-D8UMH1rd.js → TaskQueuePill-DZykFijh.js} +2 -2
  75. package/dashboard/dist/assets/{TaskQueuePill-D8UMH1rd.js.map → TaskQueuePill-DZykFijh.js.map} +1 -1
  76. package/dashboard/dist/assets/{TasksListPage-CJB-EvKX.js → TasksListPage-D-vHndyV.js} +2 -2
  77. package/dashboard/dist/assets/{TasksListPage-CJB-EvKX.js.map → TasksListPage-D-vHndyV.js.map} +1 -1
  78. package/dashboard/dist/assets/{TimeAgo-CnjY3XDt.js → TimeAgo-B6Gz4RAU.js} +2 -2
  79. package/dashboard/dist/assets/{TimeAgo-CnjY3XDt.js.map → TimeAgo-B6Gz4RAU.js.map} +1 -1
  80. package/dashboard/dist/assets/{TimestampCell-u1YA8eA3.js → TimestampCell-DZu9PtN2.js} +2 -2
  81. package/dashboard/dist/assets/{TimestampCell-u1YA8eA3.js.map → TimestampCell-DZu9PtN2.js.map} +1 -1
  82. package/dashboard/dist/assets/{ToolPill-Dmcwmqh2.js → ToolPill-RP2Tvlrx.js} +2 -2
  83. package/dashboard/dist/assets/{ToolPill-Dmcwmqh2.js.map → ToolPill-RP2Tvlrx.js.map} +1 -1
  84. package/dashboard/dist/assets/{ToolTestPanel-B1T4Hk0t.js → ToolTestPanel-D4cgYW2p.js} +2 -2
  85. package/dashboard/dist/assets/{ToolTestPanel-B1T4Hk0t.js.map → ToolTestPanel-D4cgYW2p.js.map} +1 -1
  86. package/dashboard/dist/assets/{TopicDetailPage-ClibbST4.js → TopicDetailPage-C5ZUZpU5.js} +3 -3
  87. package/dashboard/dist/assets/{TopicDetailPage-ClibbST4.js.map → TopicDetailPage-C5ZUZpU5.js.map} +1 -1
  88. package/dashboard/dist/assets/{TopicsPage-KjODhitc.js → TopicsPage-Cbc0nVj9.js} +2 -2
  89. package/dashboard/dist/assets/{TopicsPage-KjODhitc.js.map → TopicsPage-Cbc0nVj9.js.map} +1 -1
  90. package/dashboard/dist/assets/{UserName-DVqimwsO.js → UserName-YUoNrFAq.js} +2 -2
  91. package/dashboard/dist/assets/{UserName-DVqimwsO.js.map → UserName-YUoNrFAq.js.map} +1 -1
  92. package/dashboard/dist/assets/{WorkflowExecutionPage-DYNPy7Gk.js → WorkflowExecutionPage-CVGztAdK.js} +2 -2
  93. package/dashboard/dist/assets/{WorkflowExecutionPage-DYNPy7Gk.js.map → WorkflowExecutionPage-CVGztAdK.js.map} +1 -1
  94. package/dashboard/dist/assets/{WorkflowPill-h43nlUmM.js → WorkflowPill-pPuGH8v9.js} +2 -2
  95. package/dashboard/dist/assets/{WorkflowPill-h43nlUmM.js.map → WorkflowPill-pPuGH8v9.js.map} +1 -1
  96. package/dashboard/dist/assets/{WorkflowsDashboard-DdJm6X7x.js → WorkflowsDashboard-BFzCyvgv.js} +2 -2
  97. package/dashboard/dist/assets/{WorkflowsDashboard-DdJm6X7x.js.map → WorkflowsDashboard-BFzCyvgv.js.map} +1 -1
  98. package/dashboard/dist/assets/{WorkflowsOverview-CBOYkfpD.js → WorkflowsOverview-C_y7JCg2.js} +2 -2
  99. package/dashboard/dist/assets/{WorkflowsOverview-CBOYkfpD.js.map → WorkflowsOverview-C_y7JCg2.js.map} +1 -1
  100. package/dashboard/dist/assets/{YamlWorkflowsPage-BZnD_hMw.js → YamlWorkflowsPage-CYQjp3JI.js} +2 -2
  101. package/dashboard/dist/assets/{YamlWorkflowsPage-BZnD_hMw.js.map → YamlWorkflowsPage-CYQjp3JI.js.map} +1 -1
  102. package/dashboard/dist/assets/{agents-oHMkS1GD.js → agents-2pDPv2Ww.js} +2 -2
  103. package/dashboard/dist/assets/{agents-oHMkS1GD.js.map → agents-2pDPv2Ww.js.map} +1 -1
  104. package/dashboard/dist/assets/{bots-BispbsY3.js → bots-2uGZ2l7A.js} +2 -2
  105. package/dashboard/dist/assets/{bots-BispbsY3.js.map → bots-2uGZ2l7A.js.map} +1 -1
  106. package/dashboard/dist/assets/{controlplane-CIbrx5rX.js → controlplane-CQ29M7lK.js} +2 -2
  107. package/dashboard/dist/assets/controlplane-CQ29M7lK.js.map +1 -0
  108. package/dashboard/dist/assets/{escalation-qhj4TxA3.js → escalation-DWOUjrgL.js} +2 -2
  109. package/dashboard/dist/assets/{escalation-qhj4TxA3.js.map → escalation-DWOUjrgL.js.map} +1 -1
  110. package/dashboard/dist/assets/{escalation-columns-Dh_0iVTH.js → escalation-columns-WrgLIl-W.js} +2 -2
  111. package/dashboard/dist/assets/{escalation-columns-Dh_0iVTH.js.map → escalation-columns-WrgLIl-W.js.map} +1 -1
  112. package/dashboard/dist/assets/{helpers-BYw1qqKV.js → helpers-LN5b1KBx.js} +2 -2
  113. package/dashboard/dist/assets/{helpers-BYw1qqKV.js.map → helpers-LN5b1KBx.js.map} +1 -1
  114. package/dashboard/dist/assets/{index-CVRVw3g_.js → index-BMo7wCw8.js} +2 -2
  115. package/dashboard/dist/assets/{index-CVRVw3g_.js.map → index-BMo7wCw8.js.map} +1 -1
  116. package/dashboard/dist/assets/{index-BhhWCADo.js → index-CBS8FBcp.js} +18 -18
  117. package/dashboard/dist/assets/index-CBS8FBcp.js.map +1 -0
  118. package/dashboard/dist/assets/{index-ht5r_7jQ.js → index-CFJc47B8.js} +2 -2
  119. package/dashboard/dist/assets/{index-ht5r_7jQ.js.map → index-CFJc47B8.js.map} +1 -1
  120. package/dashboard/dist/assets/{index-zHicKKh9.js → index-C_A76Dl1.js} +2 -2
  121. package/dashboard/dist/assets/{index-zHicKKh9.js.map → index-C_A76Dl1.js.map} +1 -1
  122. package/dashboard/dist/assets/{index-B9t_vpam.js → index-CdNXBj7w.js} +2 -2
  123. package/dashboard/dist/assets/{index-B9t_vpam.js.map → index-CdNXBj7w.js.map} +1 -1
  124. package/dashboard/dist/assets/index-ChGBlYKj.css +1 -0
  125. package/dashboard/dist/assets/index-CovZsMow.js +15 -0
  126. package/dashboard/dist/assets/{index-D6YjH5uG.js.map → index-CovZsMow.js.map} +1 -1
  127. package/dashboard/dist/assets/index-CryoNbg0.js +2 -0
  128. package/dashboard/dist/assets/index-CryoNbg0.js.map +1 -0
  129. package/dashboard/dist/assets/{index-Bh9g-EOF.js → index-CvzfRxnj.js} +2 -2
  130. package/dashboard/dist/assets/{index-Bh9g-EOF.js.map → index-CvzfRxnj.js.map} +1 -1
  131. package/dashboard/dist/assets/{index-C4W1_Rfk.js → index-DDxZOINn.js} +2 -2
  132. package/dashboard/dist/assets/{index-C4W1_Rfk.js.map → index-DDxZOINn.js.map} +1 -1
  133. package/dashboard/dist/assets/{index-C2yJWps6.js → index-DqFfgd-7.js} +2 -2
  134. package/dashboard/dist/assets/{index-C2yJWps6.js.map → index-DqFfgd-7.js.map} +1 -1
  135. package/dashboard/dist/assets/index-J0dMfAmE.js +2 -0
  136. package/dashboard/dist/assets/index-J0dMfAmE.js.map +1 -0
  137. package/dashboard/dist/assets/{index-CY3EhrEA.js → index-dzxsXeMO.js} +2 -2
  138. package/dashboard/dist/assets/{index-CY3EhrEA.js.map → index-dzxsXeMO.js.map} +1 -1
  139. package/dashboard/dist/assets/{index-CEF3Idec.js → index-ugekH3E2.js} +2 -2
  140. package/dashboard/dist/assets/{index-CEF3Idec.js.map → index-ugekH3E2.js.map} +1 -1
  141. package/dashboard/dist/assets/{knowledge-B23TU6JN.js → knowledge-BhZk3Wy9.js} +2 -2
  142. package/dashboard/dist/assets/{knowledge-B23TU6JN.js.map → knowledge-BhZk3Wy9.js.map} +1 -1
  143. package/dashboard/dist/assets/{mcp-Cew_Sb-Q.js → mcp-FOHNY7Zj.js} +2 -2
  144. package/dashboard/dist/assets/{mcp-Cew_Sb-Q.js.map → mcp-FOHNY7Zj.js.map} +1 -1
  145. package/dashboard/dist/assets/{mcp-query-So0Oz5Lx.js → mcp-query-BoNH5uCn.js} +2 -2
  146. package/dashboard/dist/assets/{mcp-query-So0Oz5Lx.js.map → mcp-query-BoNH5uCn.js.map} +1 -1
  147. package/dashboard/dist/assets/{mcp-runs-4176y3SA.js → mcp-runs-BhkGaw2y.js} +2 -2
  148. package/dashboard/dist/assets/{mcp-runs-4176y3SA.js.map → mcp-runs-BhkGaw2y.js.map} +1 -1
  149. package/dashboard/dist/assets/{namespaces-CqBbWsJx.js → namespaces-duQCQRHq.js} +2 -2
  150. package/dashboard/dist/assets/{namespaces-CqBbWsJx.js.map → namespaces-duQCQRHq.js.map} +1 -1
  151. package/dashboard/dist/assets/{roles-BTxMgLE6.js → roles-DW6lI_g5.js} +2 -2
  152. package/dashboard/dist/assets/{roles-BTxMgLE6.js.map → roles-DW6lI_g5.js.map} +1 -1
  153. package/dashboard/dist/assets/{settings-CtQNxacL.js → settings-wTRbazzw.js} +2 -2
  154. package/dashboard/dist/assets/{settings-CtQNxacL.js.map → settings-wTRbazzw.js.map} +1 -1
  155. package/dashboard/dist/assets/{tasks-CIRlUTbo.js → tasks-C-QX245z.js} +2 -2
  156. package/dashboard/dist/assets/{tasks-CIRlUTbo.js.map → tasks-C-QX245z.js.map} +1 -1
  157. package/dashboard/dist/assets/{topics-C8YmK_j2.js → topics-CAnsyo3w.js} +2 -2
  158. package/dashboard/dist/assets/{topics-C8YmK_j2.js.map → topics-CAnsyo3w.js.map} +1 -1
  159. package/dashboard/dist/assets/{useEventHooks-BvMUy36X.js → useEventHooks-C689a4F7.js} +2 -2
  160. package/dashboard/dist/assets/{useEventHooks-BvMUy36X.js.map → useEventHooks-C689a4F7.js.map} +1 -1
  161. package/dashboard/dist/assets/{useYamlActivityEvents-DLEzqv-z.js → useYamlActivityEvents-BTHFGIsD.js} +2 -2
  162. package/dashboard/dist/assets/{useYamlActivityEvents-DLEzqv-z.js.map → useYamlActivityEvents-BTHFGIsD.js.map} +1 -1
  163. package/dashboard/dist/assets/{users-C_bD6mzW.js → users--D3LoFOD.js} +2 -2
  164. package/dashboard/dist/assets/{users-C_bD6mzW.js.map → users--D3LoFOD.js.map} +1 -1
  165. package/dashboard/dist/assets/{vendor-icons-DY1ctJgc.js → vendor-icons-BNtvBbnj.js} +107 -102
  166. package/dashboard/dist/assets/vendor-icons-BNtvBbnj.js.map +1 -0
  167. package/dashboard/dist/assets/{workflows-DFR0-hI3.js → workflows-MpNdzreD.js} +2 -2
  168. package/dashboard/dist/assets/{workflows-DFR0-hI3.js.map → workflows-MpNdzreD.js.map} +1 -1
  169. package/dashboard/dist/assets/{yaml-workflows-wXURdyjP.js → yaml-workflows-CFhnJzQy.js} +2 -2
  170. package/dashboard/dist/assets/{yaml-workflows-wXURdyjP.js.map → yaml-workflows-CFhnJzQy.js.map} +1 -1
  171. package/dashboard/dist/index.html +3 -3
  172. package/package.json +2 -2
  173. package/dashboard/dist/assets/ListToolbar-CUxJlz__.js +0 -2
  174. package/dashboard/dist/assets/controlplane-CIbrx5rX.js.map +0 -1
  175. package/dashboard/dist/assets/index-BhhWCADo.js.map +0 -1
  176. package/dashboard/dist/assets/index-Bn-VSH41.js +0 -2
  177. package/dashboard/dist/assets/index-Bn-VSH41.js.map +0 -1
  178. package/dashboard/dist/assets/index-CHxvfc97.css +0 -1
  179. package/dashboard/dist/assets/index-D-q2lzup.js +0 -2
  180. package/dashboard/dist/assets/index-D-q2lzup.js.map +0 -1
  181. package/dashboard/dist/assets/index-D6YjH5uG.js +0 -15
  182. package/dashboard/dist/assets/vendor-icons-DY1ctJgc.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"escalation-qhj4TxA3.js","sources":["../../src/components/common/display/CountdownTimer.tsx","../../src/lib/escalation.ts"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { format as fnsFormat } from 'date-fns';\nimport { formatRemaining } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\nconst COUNTDOWN_THRESHOLDS = [\n { maxMs: 0, color: 'text-status-error' },\n { maxMs: 5 * 60 * 1000, color: 'text-status-error' },\n { maxMs: 15 * 60 * 1000, color: 'text-status-warning' },\n { maxMs: Infinity, color: 'text-text-secondary' },\n] as const;\n\nfunction countdownColor(remainingMs: number): string {\n if (remainingMs <= 0) return COUNTDOWN_THRESHOLDS[0].color;\n for (const t of COUNTDOWN_THRESHOLDS) {\n if (remainingMs < t.maxMs) return t.color;\n }\n return COUNTDOWN_THRESHOLDS[COUNTDOWN_THRESHOLDS.length - 1].color;\n}\n\nexport function CountdownTimer({ until }: { until: string }) {\n const [remaining, setRemaining] = useState(() => new Date(until).getTime() - Date.now());\n\n useEffect(() => {\n const interval = setInterval(() => {\n setRemaining(new Date(until).getTime() - Date.now());\n }, 1000);\n return () => clearInterval(interval);\n }, [until]);\n\n const options = useMemo(() => {\n const d = new Date(until);\n return [\n { label: 'ms', value: String(Math.max(0, remaining)) },\n { label: 'until', value: d.toISOString() },\n { label: 'local', value: fnsFormat(d, 'MMM d, yyyy h:mm:ss a') },\n ];\n }, [until, remaining]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs font-mono ${countdownColor(remaining)}`}>\n {formatRemaining(remaining)}\n </span>\n </DateTooltip>\n );\n}\n","import type { LTEscalationRecord } from '../api/types';\n\nexport function isEffectivelyClaimed(esc: LTEscalationRecord): boolean {\n return !!(\n esc.assigned_to &&\n esc.assigned_until &&\n new Date(esc.assigned_until) > new Date()\n );\n}\n\n/** An ACK escalation has no associated workflow — it's a notification, not a task. */\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function isAvailable(esc: LTEscalationRecord): boolean {\n return (\n esc.status === 'pending' &&\n (!esc.assigned_to ||\n !esc.assigned_until ||\n new Date(esc.assigned_until) <= new Date())\n );\n}\n"],"names":["COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","t","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","options","useMemo","d","fnsFormat","jsx","DateTooltip","formatRemaining","isEffectivelyClaimed","esc","isAckEscalation"],"mappings":"uGAKA,MAAMA,EAAuB,CAC3B,CAAE,MAAO,EAAgB,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAS,IAAO,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAU,IAAM,MAAO,qBAAA,EAChC,CAAE,MAAO,IAAiB,MAAO,qBAAA,CACnC,EAEA,SAASC,EAAeC,EAA6B,CACnD,GAAIA,GAAe,EAAG,OAAOF,EAAqB,CAAC,EAAE,MACrD,UAAWG,KAAKH,EACd,GAAIE,EAAcC,EAAE,MAAO,OAAOA,EAAE,MAEtC,OAAOH,EAAqBA,EAAqB,OAAS,CAAC,EAAE,KAC/D,CAEO,SAASI,EAAe,CAAE,MAAAC,GAA4B,CAC3D,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,IAAM,IAAI,KAAKH,CAAK,EAAE,QAAA,EAAY,KAAK,KAAK,EAEvFI,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YAAY,IAAM,CACjCH,EAAa,IAAI,KAAKF,CAAK,EAAE,UAAY,KAAK,KAAK,CACrD,EAAG,GAAI,EACP,MAAO,IAAM,cAAcK,CAAQ,CACrC,EAAG,CAACL,CAAK,CAAC,EAEV,MAAMM,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,MAAMC,EAAI,IAAI,KAAKR,CAAK,EACxB,MAAO,CACL,CAAE,MAAO,KAAM,MAAO,OAAO,KAAK,IAAI,EAAGC,CAAS,CAAC,CAAA,EACnD,CAAE,MAAO,QAAS,MAAOO,EAAE,aAAY,EACvC,CAAE,MAAO,QAAS,MAAOC,EAAUD,EAAG,uBAAuB,CAAA,CAAE,CAEnE,EAAG,CAACR,EAAOC,CAAS,CAAC,EAErB,OACES,EAAAA,IAACC,EAAA,CAAY,QAAAL,EACX,SAAAI,MAAC,QAAK,UAAW,qBAAqBd,EAAeK,CAAS,CAAC,GAC5D,SAAAW,EAAgBX,CAAS,EAC5B,EACF,CAEJ,CC5CO,SAASY,EAAqBC,EAAkC,CACrE,MAAO,CAAC,EACNA,EAAI,aACJA,EAAI,gBACJ,IAAI,KAAKA,EAAI,cAAc,EAAI,IAAI,KAEvC,CAGO,SAASC,EAAgBD,EAAkC,CAChE,MAAO,CAACA,EAAI,aACd"}
1
+ {"version":3,"file":"escalation-DWOUjrgL.js","sources":["../../src/components/common/display/CountdownTimer.tsx","../../src/lib/escalation.ts"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { format as fnsFormat } from 'date-fns';\nimport { formatRemaining } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\nconst COUNTDOWN_THRESHOLDS = [\n { maxMs: 0, color: 'text-status-error' },\n { maxMs: 5 * 60 * 1000, color: 'text-status-error' },\n { maxMs: 15 * 60 * 1000, color: 'text-status-warning' },\n { maxMs: Infinity, color: 'text-text-secondary' },\n] as const;\n\nfunction countdownColor(remainingMs: number): string {\n if (remainingMs <= 0) return COUNTDOWN_THRESHOLDS[0].color;\n for (const t of COUNTDOWN_THRESHOLDS) {\n if (remainingMs < t.maxMs) return t.color;\n }\n return COUNTDOWN_THRESHOLDS[COUNTDOWN_THRESHOLDS.length - 1].color;\n}\n\nexport function CountdownTimer({ until }: { until: string }) {\n const [remaining, setRemaining] = useState(() => new Date(until).getTime() - Date.now());\n\n useEffect(() => {\n const interval = setInterval(() => {\n setRemaining(new Date(until).getTime() - Date.now());\n }, 1000);\n return () => clearInterval(interval);\n }, [until]);\n\n const options = useMemo(() => {\n const d = new Date(until);\n return [\n { label: 'ms', value: String(Math.max(0, remaining)) },\n { label: 'until', value: d.toISOString() },\n { label: 'local', value: fnsFormat(d, 'MMM d, yyyy h:mm:ss a') },\n ];\n }, [until, remaining]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs font-mono ${countdownColor(remaining)}`}>\n {formatRemaining(remaining)}\n </span>\n </DateTooltip>\n );\n}\n","import type { LTEscalationRecord } from '../api/types';\n\nexport function isEffectivelyClaimed(esc: LTEscalationRecord): boolean {\n return !!(\n esc.assigned_to &&\n esc.assigned_until &&\n new Date(esc.assigned_until) > new Date()\n );\n}\n\n/** An ACK escalation has no associated workflow — it's a notification, not a task. */\nexport function isAckEscalation(esc: LTEscalationRecord): boolean {\n return !esc.workflow_type;\n}\n\nexport function isAvailable(esc: LTEscalationRecord): boolean {\n return (\n esc.status === 'pending' &&\n (!esc.assigned_to ||\n !esc.assigned_until ||\n new Date(esc.assigned_until) <= new Date())\n );\n}\n"],"names":["COUNTDOWN_THRESHOLDS","countdownColor","remainingMs","t","CountdownTimer","until","remaining","setRemaining","useState","useEffect","interval","options","useMemo","d","fnsFormat","jsx","DateTooltip","formatRemaining","isEffectivelyClaimed","esc","isAckEscalation"],"mappings":"uGAKA,MAAMA,EAAuB,CAC3B,CAAE,MAAO,EAAgB,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAS,IAAO,MAAO,mBAAA,EAChC,CAAE,MAAO,IAAU,IAAM,MAAO,qBAAA,EAChC,CAAE,MAAO,IAAiB,MAAO,qBAAA,CACnC,EAEA,SAASC,EAAeC,EAA6B,CACnD,GAAIA,GAAe,EAAG,OAAOF,EAAqB,CAAC,EAAE,MACrD,UAAWG,KAAKH,EACd,GAAIE,EAAcC,EAAE,MAAO,OAAOA,EAAE,MAEtC,OAAOH,EAAqBA,EAAqB,OAAS,CAAC,EAAE,KAC/D,CAEO,SAASI,EAAe,CAAE,MAAAC,GAA4B,CAC3D,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAS,IAAM,IAAI,KAAKH,CAAK,EAAE,QAAA,EAAY,KAAK,KAAK,EAEvFI,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,YAAY,IAAM,CACjCH,EAAa,IAAI,KAAKF,CAAK,EAAE,UAAY,KAAK,KAAK,CACrD,EAAG,GAAI,EACP,MAAO,IAAM,cAAcK,CAAQ,CACrC,EAAG,CAACL,CAAK,CAAC,EAEV,MAAMM,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,MAAMC,EAAI,IAAI,KAAKR,CAAK,EACxB,MAAO,CACL,CAAE,MAAO,KAAM,MAAO,OAAO,KAAK,IAAI,EAAGC,CAAS,CAAC,CAAA,EACnD,CAAE,MAAO,QAAS,MAAOO,EAAE,aAAY,EACvC,CAAE,MAAO,QAAS,MAAOC,EAAUD,EAAG,uBAAuB,CAAA,CAAE,CAEnE,EAAG,CAACR,EAAOC,CAAS,CAAC,EAErB,OACES,EAAAA,IAACC,EAAA,CAAY,QAAAL,EACX,SAAAI,MAAC,QAAK,UAAW,qBAAqBd,EAAeK,CAAS,CAAC,GAC5D,SAAAW,EAAgBX,CAAS,EAC5B,EACF,CAEJ,CC5CO,SAASY,EAAqBC,EAAkC,CACrE,MAAO,CAAC,EACNA,EAAI,aACJA,EAAI,gBACJ,IAAI,KAAKA,EAAI,cAAc,EAAI,IAAI,KAEvC,CAGO,SAASC,EAAgBD,EAAkC,CAChE,MAAO,CAACA,EAAI,aACd"}
@@ -1,2 +1,2 @@
1
- import{j as s}from"./vendor-query-B2UbickB.js";import{F as x,b as l}from"./FilterBar-Ck4K4rzu.js";import{P as m}from"./PriorityBadge-DfQY9St9.js";import{R as p}from"./RolePill-BZaUpkHg.js";import{W as u}from"./WorkflowPill-h43nlUmM.js";import{T as d}from"./TimestampCell-u1YA8eA3.js";import{C as y,i as h,a as j}from"./escalation-qhj4TxA3.js";import{a3 as v,a4 as b,a5 as f,a6 as r}from"./vendor-icons-DY1ctJgc.js";import{L as k}from"./vendor-react-CX88sFS5.js";function N({row:e}){if(h(e)){const t=e.status==="resolved"?"text-status-success":"text-text-tertiary";return s.jsx(f,{className:`w-3 h-3 shrink-0 ${t}`})}return e.status==="resolved"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"}):e.status==="cancelled"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"}):j(e)?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"}):s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"})}const I=[{key:"description",label:"Summary",render:e=>s.jsxs("div",{className:"flex items-start gap-2 overflow-hidden",children:[s.jsx("span",{className:"mt-1 shrink-0",children:s.jsx(N,{row:e})}),s.jsxs("div",{className:"min-w-0 overflow-hidden",children:[s.jsx("p",{className:"text-xs text-text-primary truncate",children:e.description||e.type}),s.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[s.jsx(u,{type:e.type}),e.subtype&&e.subtype!==e.type&&s.jsx("span",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:e.subtype})]})]})]}),className:"max-w-0"},{key:"task_id",label:"Task",render:e=>e.task_id?s.jsxs(k,{to:`/workflows/tasks/detail/${e.task_id}`,onClick:t=>t.stopPropagation(),className:"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors",children:[e.task_id.slice(0,12),"…",s.jsx(v,{size:10,className:"opacity-0 group-hover/task:opacity-100 transition-opacity"})]}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-36 whitespace-nowrap"},{key:"role",label:"Role",render:e=>s.jsx(p,{role:e.role}),className:"w-28"},{key:"priority",label:"Priority",render:e=>s.jsx(m,{priority:e.priority}),className:"w-20",sortable:!0},{key:"created_at",label:"Created",render:e=>s.jsx(d,{date:e.created_at}),className:"w-40",sortable:!0}],A={key:"expires",label:s.jsx(b,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:e=>e.assigned_until?s.jsx(y,{until:e.assigned_until}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-16 whitespace-nowrap"},C=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],g=[{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"}];function B({filters:e,setFilter:t,roles:i,types:n,showStatus:o=!1,actions:c}){return s.jsxs(x,{actions:c,children:[o&&s.jsx(l,{label:"Status",value:e.status??"",onChange:a=>t("status",a),options:g}),s.jsx(l,{label:"Role",value:e.role,onChange:a=>t("role",a),options:i.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Type",value:e.type,onChange:a=>t("type",a),options:n.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Priority",value:e.priority,onChange:a=>t("priority",a),options:C})]})}export{I as E,A as T,B as a};
2
- //# sourceMappingURL=escalation-columns-Dh_0iVTH.js.map
1
+ import{j as s}from"./vendor-query-B2UbickB.js";import{F as x,b as l}from"./FilterBar-Ck4K4rzu.js";import{P as m}from"./PriorityBadge-DfQY9St9.js";import{R as p}from"./RolePill-BDzPFQUv.js";import{W as u}from"./WorkflowPill-pPuGH8v9.js";import{T as d}from"./TimestampCell-DZu9PtN2.js";import{C as y,i as h,a as j}from"./escalation-DWOUjrgL.js";import{a3 as v,a4 as b,a5 as f,a6 as r}from"./vendor-icons-BNtvBbnj.js";import{L as k}from"./vendor-react-CX88sFS5.js";function N({row:e}){if(h(e)){const t=e.status==="resolved"?"text-status-success":"text-text-tertiary";return s.jsx(f,{className:`w-3 h-3 shrink-0 ${t}`})}return e.status==="resolved"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success"}):e.status==="cancelled"?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error"}):j(e)?s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning"}):s.jsx(r,{className:"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active"})}const I=[{key:"description",label:"Summary",render:e=>s.jsxs("div",{className:"flex items-start gap-2 overflow-hidden",children:[s.jsx("span",{className:"mt-1 shrink-0",children:s.jsx(N,{row:e})}),s.jsxs("div",{className:"min-w-0 overflow-hidden",children:[s.jsx("p",{className:"text-xs text-text-primary truncate",children:e.description||e.type}),s.jsxs("div",{className:"flex items-center gap-2 mt-0.5",children:[s.jsx(u,{type:e.type}),e.subtype&&e.subtype!==e.type&&s.jsx("span",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:e.subtype})]})]})]}),className:"max-w-0"},{key:"task_id",label:"Task",render:e=>e.task_id?s.jsxs(k,{to:`/workflows/tasks/detail/${e.task_id}`,onClick:t=>t.stopPropagation(),className:"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors",children:[e.task_id.slice(0,12),"…",s.jsx(v,{size:10,className:"opacity-0 group-hover/task:opacity-100 transition-opacity"})]}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-36 whitespace-nowrap"},{key:"role",label:"Role",render:e=>s.jsx(p,{role:e.role}),className:"w-28"},{key:"priority",label:"Priority",render:e=>s.jsx(m,{priority:e.priority}),className:"w-20",sortable:!0},{key:"created_at",label:"Created",render:e=>s.jsx(d,{date:e.created_at}),className:"w-40",sortable:!0}],A={key:"expires",label:s.jsx(b,{className:"w-3.5 h-3.5 text-text-tertiary"}),render:e=>e.assigned_until?s.jsx(y,{until:e.assigned_until}):s.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-16 whitespace-nowrap"},C=[{value:"1",label:"P1"},{value:"2",label:"P2"},{value:"3",label:"P3"},{value:"4",label:"P4"}],g=[{value:"available",label:"Available"},{value:"claimed",label:"Claimed"},{value:"resolved",label:"Resolved"}];function B({filters:e,setFilter:t,roles:i,types:n,showStatus:o=!1,actions:c}){return s.jsxs(x,{actions:c,children:[o&&s.jsx(l,{label:"Status",value:e.status??"",onChange:a=>t("status",a),options:g}),s.jsx(l,{label:"Role",value:e.role,onChange:a=>t("role",a),options:i.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Type",value:e.type,onChange:a=>t("type",a),options:n.map(a=>({value:a,label:a}))}),s.jsx(l,{label:"Priority",value:e.priority,onChange:a=>t("priority",a),options:C})]})}export{I as E,A as T,B as a};
2
+ //# sourceMappingURL=escalation-columns-WrgLIl-W.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"escalation-columns-Dh_0iVTH.js","sources":["../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { ExternalLink, Circle, Bell, Clock } from 'lucide-react';\nimport type { Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport type { LTEscalationRecord } from '../../api/types';\n\n/** Status dot — rendered inline before summary. */\nfunction StatusDot({ row }: { row: LTEscalationRecord }) {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 shrink-0 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success\" />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active\" />;\n}\n\n/** Base columns shared by all escalation list pages. */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = [\n {\n key: 'description',\n label: 'Summary',\n render: (row) => (\n <div className=\"flex items-start gap-2 overflow-hidden\">\n <span className=\"mt-1 shrink-0\"><StatusDot row={row} /></span>\n <div className=\"min-w-0 overflow-hidden\">\n <p className=\"text-xs text-text-primary truncate\">{row.description || row.type}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <WorkflowPill type={row.type} />\n {row.subtype && row.subtype !== row.type && (\n <span className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{row.subtype}</span>\n )}\n </div>\n </div>\n </div>\n ),\n className: 'max-w-0',\n },\n {\n key: 'task_id',\n label: 'Task',\n render: (row) =>\n row.task_id ? (\n <Link\n to={`/workflows/tasks/detail/${row.task_id}`}\n onClick={(e) => e.stopPropagation()}\n className=\"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors\"\n >\n {row.task_id.slice(0, 12)}…\n <ExternalLink size={10} className=\"opacity-0 group-hover/task:opacity-100 transition-opacity\" />\n </Link>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n className: 'w-28',\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n sortable: true,\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n];\n\n/** Time-remaining column for claimed escalations — aligns with checkbox column on All Escalations. */\nexport const TIME_LEFT_COLUMN: Column<LTEscalationRecord> = {\n key: 'expires',\n label: (<Clock className=\"w-3.5 h-3.5 text-text-tertiary\" />) as any,\n render: (row) =>\n row.assigned_until ? (\n <CountdownTimer until={row.assigned_until} />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-16 whitespace-nowrap',\n};\n\n/** Status icon column — color-coded filled circle, or bell for ACK/notification escalations. */\nexport const STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) => {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 fill-status-success text-status-success\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 fill-text-tertiary text-text-tertiary\" />;\n },\n className: 'w-8',\n};\n\n/** Claimed-only status icon (always orange, or bell for ACK). */\nexport const CLAIMED_STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) =>\n isAckEscalation(row)\n ? <Bell className=\"w-3 h-3 text-status-warning\" />\n : <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />,\n className: 'w-8',\n};\n\n/** Priority filter options shared by both pages. */\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1' },\n { value: '2', label: 'P2' },\n { value: '3', label: 'P3' },\n { value: '4', label: 'P4' },\n];\n\n/** Status filter options for escalation list pages. */\nexport const STATUS_OPTIONS = [\n { value: 'available', label: 'Available' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'resolved', label: 'Resolved' },\n];\n\n/** Shared filter bar for escalation list pages. */\nexport function EscalationFilterBar({\n filters,\n setFilter,\n roles,\n types,\n showStatus = false,\n actions,\n}: {\n filters: { role: string; type: string; priority: string; status?: string };\n setFilter: (key: any, value: string) => void;\n roles: string[];\n types: string[];\n showStatus?: boolean;\n actions?: React.ReactNode;\n}) {\n return (\n <FilterBar actions={actions}>\n {showStatus && (\n <FilterSelect\n label=\"Status\"\n value={filters.status ?? ''}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n )}\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\n />\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n </FilterBar>\n );\n}\n"],"names":["StatusDot","row","isAckEscalation","color","jsx","Bell","Circle","isEffectivelyClaimed","ESCALATION_COLUMNS","jsxs","WorkflowPill","Link","e","ExternalLink","RolePill","PriorityBadge","TimestampCell","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","actions","FilterBar","FilterSelect","v","r","t"],"mappings":"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"}
1
+ {"version":3,"file":"escalation-columns-WrgLIl-W.js","sources":["../../src/pages/operator/escalation-columns.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport { ExternalLink, Circle, Bell, Clock } from 'lucide-react';\nimport type { Column } from '../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PriorityBadge } from '../../components/common/display/PriorityBadge';\nimport { RolePill } from '../../components/common/display/RolePill';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { TimestampCell } from '../../components/common/display/TimestampCell';\nimport { CountdownTimer } from '../../components/common/display/CountdownTimer';\nimport { isEffectivelyClaimed, isAckEscalation } from '../../lib/escalation';\nimport type { LTEscalationRecord } from '../../api/types';\n\n/** Status dot — rendered inline before summary. */\nfunction StatusDot({ row }: { row: LTEscalationRecord }) {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 shrink-0 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-success text-status-success\" />;\n }\n if (row.status === 'cancelled') {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-error text-status-error\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 shrink-0 fill-status-active text-status-active\" />;\n}\n\n/** Base columns shared by all escalation list pages. */\nexport const ESCALATION_COLUMNS: Column<LTEscalationRecord>[] = [\n {\n key: 'description',\n label: 'Summary',\n render: (row) => (\n <div className=\"flex items-start gap-2 overflow-hidden\">\n <span className=\"mt-1 shrink-0\"><StatusDot row={row} /></span>\n <div className=\"min-w-0 overflow-hidden\">\n <p className=\"text-xs text-text-primary truncate\">{row.description || row.type}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <WorkflowPill type={row.type} />\n {row.subtype && row.subtype !== row.type && (\n <span className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{row.subtype}</span>\n )}\n </div>\n </div>\n </div>\n ),\n className: 'max-w-0',\n },\n {\n key: 'task_id',\n label: 'Task',\n render: (row) =>\n row.task_id ? (\n <Link\n to={`/workflows/tasks/detail/${row.task_id}`}\n onClick={(e) => e.stopPropagation()}\n className=\"group/task inline-flex items-center gap-1 text-xs font-mono text-text-secondary hover:text-accent transition-colors\"\n >\n {row.task_id.slice(0, 12)}…\n <ExternalLink size={10} className=\"opacity-0 group-hover/task:opacity-100 transition-opacity\" />\n </Link>\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-36 whitespace-nowrap',\n },\n {\n key: 'role',\n label: 'Role',\n render: (row) => <RolePill role={row.role} />,\n className: 'w-28',\n },\n {\n key: 'priority',\n label: 'Priority',\n render: (row) => <PriorityBadge priority={row.priority} />,\n className: 'w-20',\n sortable: true,\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-40',\n sortable: true,\n },\n];\n\n/** Time-remaining column for claimed escalations — aligns with checkbox column on All Escalations. */\nexport const TIME_LEFT_COLUMN: Column<LTEscalationRecord> = {\n key: 'expires',\n label: (<Clock className=\"w-3.5 h-3.5 text-text-tertiary\" />) as any,\n render: (row) =>\n row.assigned_until ? (\n <CountdownTimer until={row.assigned_until} />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n ),\n className: 'w-16 whitespace-nowrap',\n};\n\n/** Status icon column — color-coded filled circle, or bell for ACK/notification escalations. */\nexport const STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) => {\n if (isAckEscalation(row)) {\n const color = row.status === 'resolved' ? 'text-status-success' : 'text-text-tertiary';\n return <Bell className={`w-3 h-3 ${color}`} />;\n }\n if (row.status === 'resolved') {\n return <Circle className=\"w-2.5 h-2.5 fill-status-success text-status-success\" />;\n }\n if (isEffectivelyClaimed(row)) {\n return <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />;\n }\n // pending (unclaimed)\n return <Circle className=\"w-2.5 h-2.5 fill-text-tertiary text-text-tertiary\" />;\n },\n className: 'w-8',\n};\n\n/** Claimed-only status icon (always orange, or bell for ACK). */\nexport const CLAIMED_STATUS_COLUMN: Column<LTEscalationRecord> = {\n key: 'status',\n label: '',\n render: (row) =>\n isAckEscalation(row)\n ? <Bell className=\"w-3 h-3 text-status-warning\" />\n : <Circle className=\"w-2.5 h-2.5 fill-status-warning text-status-warning\" />,\n className: 'w-8',\n};\n\n/** Priority filter options shared by both pages. */\nexport const PRIORITY_OPTIONS = [\n { value: '1', label: 'P1' },\n { value: '2', label: 'P2' },\n { value: '3', label: 'P3' },\n { value: '4', label: 'P4' },\n];\n\n/** Status filter options for escalation list pages. */\nexport const STATUS_OPTIONS = [\n { value: 'available', label: 'Available' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'resolved', label: 'Resolved' },\n];\n\n/** Shared filter bar for escalation list pages. */\nexport function EscalationFilterBar({\n filters,\n setFilter,\n roles,\n types,\n showStatus = false,\n actions,\n}: {\n filters: { role: string; type: string; priority: string; status?: string };\n setFilter: (key: any, value: string) => void;\n roles: string[];\n types: string[];\n showStatus?: boolean;\n actions?: React.ReactNode;\n}) {\n return (\n <FilterBar actions={actions}>\n {showStatus && (\n <FilterSelect\n label=\"Status\"\n value={filters.status ?? ''}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n )}\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n <FilterSelect\n label=\"Type\"\n value={filters.type}\n onChange={(v) => setFilter('type', v)}\n options={types.map((t) => ({ value: t, label: t }))}\n />\n <FilterSelect\n label=\"Priority\"\n value={filters.priority}\n onChange={(v) => setFilter('priority', v)}\n options={PRIORITY_OPTIONS}\n />\n </FilterBar>\n );\n}\n"],"names":["StatusDot","row","isAckEscalation","color","jsx","Bell","Circle","isEffectivelyClaimed","ESCALATION_COLUMNS","jsxs","WorkflowPill","Link","e","ExternalLink","RolePill","PriorityBadge","TimestampCell","TIME_LEFT_COLUMN","Clock","CountdownTimer","PRIORITY_OPTIONS","STATUS_OPTIONS","EscalationFilterBar","filters","setFilter","roles","types","showStatus","actions","FilterBar","FilterSelect","v","r","t"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as n}from"./vendor-query-B2UbickB.js";import{T as o}from"./TimeAgo-CnjY3XDt.js";import{S as l}from"./StatusBadge-XQlNFwmH.js";const i={"* * * * *":"Every minute","*/5 * * * *":"Every 5 minutes","*/15 * * * *":"Every 15 minutes","*/30 * * * *":"Every 30 minutes","0 * * * *":"Every hour","0 */2 * * *":"Every 2 hours","0 */6 * * *":"Every 6 hours","0 */12 * * *":"Every 12 hours","0 0 * * *":"Daily at midnight","0 9 * * *":"Daily at 9 AM","0 9 * * 1-5":"Weekdays at 9 AM","0 0 * * 0":"Weekly (Sunday midnight)","0 0 1 * *":"Monthly (1st at midnight)","0 2 * * *":"Daily at 2 AM"};function c(t){return i[t]??""}const f=[["*/15 * * * *","Every 15 min"],["0 * * * *","Every hour"],["0 */6 * * *","Every 6 hours"],["0 9 * * *","Daily 9 AM"],["0 9 * * 1-5","Weekdays 9 AM"],["0 0 * * 0","Weekly (Sun)"]];function E(t){const r=t==null?void 0:t.data;if(!r||typeof r!="object"||Array.isArray(r))return null;const s=Object.entries(r);return s.length===0||!s.every(([,e])=>typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e===null)?null:s.map(([e,a])=>({key:e,value:a===null?"":String(a),type:a===null?"string":typeof a}))}const h=[{key:"workflow_id",label:"Workflow ID",render:t=>n.jsx("span",{className:"font-mono text-[11px] text-text-secondary",children:t.workflow_id.length>40?`${t.workflow_id.slice(0,40)}...`:t.workflow_id})},{key:"status",label:"Status",render:t=>n.jsx(l,{status:t.status}),className:"w-28"},{key:"created_at",label:"Started",render:t=>n.jsx(o,{date:t.created_at}),className:"w-32"}];export{f as C,c as d,E as e,h as j};
2
- //# sourceMappingURL=helpers-BYw1qqKV.js.map
1
+ import{j as n}from"./vendor-query-B2UbickB.js";import{T as o}from"./TimeAgo-B6Gz4RAU.js";import{S as l}from"./StatusBadge-XQlNFwmH.js";const i={"* * * * *":"Every minute","*/5 * * * *":"Every 5 minutes","*/15 * * * *":"Every 15 minutes","*/30 * * * *":"Every 30 minutes","0 * * * *":"Every hour","0 */2 * * *":"Every 2 hours","0 */6 * * *":"Every 6 hours","0 */12 * * *":"Every 12 hours","0 0 * * *":"Daily at midnight","0 9 * * *":"Daily at 9 AM","0 9 * * 1-5":"Weekdays at 9 AM","0 0 * * 0":"Weekly (Sunday midnight)","0 0 1 * *":"Monthly (1st at midnight)","0 2 * * *":"Daily at 2 AM"};function c(t){return i[t]??""}const f=[["*/15 * * * *","Every 15 min"],["0 * * * *","Every hour"],["0 */6 * * *","Every 6 hours"],["0 9 * * *","Daily 9 AM"],["0 9 * * 1-5","Weekdays 9 AM"],["0 0 * * 0","Weekly (Sun)"]];function E(t){const r=t==null?void 0:t.data;if(!r||typeof r!="object"||Array.isArray(r))return null;const s=Object.entries(r);return s.length===0||!s.every(([,e])=>typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e===null)?null:s.map(([e,a])=>({key:e,value:a===null?"":String(a),type:a===null?"string":typeof a}))}const h=[{key:"workflow_id",label:"Workflow ID",render:t=>n.jsx("span",{className:"font-mono text-[11px] text-text-secondary",children:t.workflow_id.length>40?`${t.workflow_id.slice(0,40)}...`:t.workflow_id})},{key:"status",label:"Status",render:t=>n.jsx(l,{status:t.status}),className:"w-28"},{key:"created_at",label:"Started",render:t=>n.jsx(o,{date:t.created_at}),className:"w-32"}];export{f as C,c as d,E as e,h as j};
2
+ //# sourceMappingURL=helpers-LN5b1KBx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers-BYw1qqKV.js","sources":["../../src/pages/workflows/cron/helpers.tsx"],"sourcesContent":["import type { LTJob } from '../../../api/types';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\n\n// -- Cron descriptions -------------------------------------------------------\n\nconst CRON_DESCRIPTIONS: Record<string, string> = {\n '* * * * *': 'Every minute',\n '*/5 * * * *': 'Every 5 minutes',\n '*/15 * * * *': 'Every 15 minutes',\n '*/30 * * * *': 'Every 30 minutes',\n '0 * * * *': 'Every hour',\n '0 */2 * * *': 'Every 2 hours',\n '0 */6 * * *': 'Every 6 hours',\n '0 */12 * * *': 'Every 12 hours',\n '0 0 * * *': 'Daily at midnight',\n '0 9 * * *': 'Daily at 9 AM',\n '0 9 * * 1-5': 'Weekdays at 9 AM',\n '0 0 * * 0': 'Weekly (Sunday midnight)',\n '0 0 1 * *': 'Monthly (1st at midnight)',\n '0 2 * * *': 'Daily at 2 AM',\n};\n\nexport function describeCron(expr: string): string {\n return CRON_DESCRIPTIONS[expr] ?? '';\n}\n\nexport const COMMON_PATTERNS: [string, string][] = [\n ['*/15 * * * *', 'Every 15 min'],\n ['0 * * * *', 'Every hour'],\n ['0 */6 * * *', 'Every 6 hours'],\n ['0 9 * * *', 'Daily 9 AM'],\n ['0 9 * * 1-5', 'Weekdays 9 AM'],\n ['0 0 * * 0', 'Weekly (Sun)'],\n];\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n// -- Envelope helpers ---------------------------------------------------------\n\n/** Extract simple string/number/boolean keys from `data` for form view. */\nexport function extractFormFields(\n envelope: Record<string, unknown>,\n): { key: string; value: string; type: string }[] | null {\n const data = envelope?.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) return null;\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return null;\n // Only show form if all values are scalar\n const allScalar = entries.every(\n ([, v]) => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean' || v === null,\n );\n if (!allScalar) return null;\n return entries.map(([key, value]) => ({\n key,\n value: value === null ? '' : String(value),\n type: value === null ? 'string' : typeof value,\n }));\n}\n\n// -- Recent jobs table columns ------------------------------------------------\n\nexport const jobColumns: Column<LTJob>[] = [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => (\n <span className=\"font-mono text-[11px] text-text-secondary\">\n {row.workflow_id.length > 40\n ? `${row.workflow_id.slice(0, 40)}...`\n : row.workflow_id}\n </span>\n ),\n },\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={row.status} />,\n className: 'w-28',\n },\n {\n key: 'created_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-32',\n },\n];\n"],"names":["CRON_DESCRIPTIONS","describeCron","expr","COMMON_PATTERNS","extractFormFields","envelope","data","entries","v","key","value","jobColumns","row","jsx","StatusBadge","TimeAgo"],"mappings":"uIAOA,MAAMA,EAA4C,CAChD,YAAa,eACb,cAAe,kBACf,eAAgB,mBAChB,eAAgB,mBAChB,YAAa,aACb,cAAe,gBACf,cAAe,gBACf,eAAgB,iBAChB,YAAa,oBACb,YAAa,gBACb,cAAe,mBACf,YAAa,2BACb,YAAa,4BACb,YAAa,eACf,EAEO,SAASC,EAAaC,EAAsB,CACjD,OAAOF,EAAkBE,CAAI,GAAK,EACpC,CAEO,MAAMC,EAAsC,CACjD,CAAC,eAAgB,cAAc,EAC/B,CAAC,YAAa,YAAY,EAC1B,CAAC,cAAe,eAAe,EAC/B,CAAC,YAAa,YAAY,EAC1B,CAAC,cAAe,eAAe,EAC/B,CAAC,YAAa,cAAc,CAC9B,EAOO,SAASC,EACdC,EACuD,CACvD,MAAMC,EAAOD,GAAA,YAAAA,EAAU,KACvB,GAAI,CAACC,GAAQ,OAAOA,GAAS,UAAY,MAAM,QAAQA,CAAI,EAAG,OAAO,KACrE,MAAMC,EAAU,OAAO,QAAQD,CAA+B,EAM9D,OALIC,EAAQ,SAAW,GAKnB,CAHcA,EAAQ,MACxB,CAAC,EAAGC,CAAC,IAAM,OAAOA,GAAM,UAAY,OAAOA,GAAM,UAAY,OAAOA,GAAM,WAAaA,IAAM,IAAA,EAExE,KAChBD,EAAQ,IAAI,CAAC,CAACE,EAAKC,CAAK,KAAO,CACpC,IAAAD,EACA,MAAOC,IAAU,KAAO,GAAK,OAAOA,CAAK,EACzC,KAAMA,IAAU,KAAO,SAAW,OAAOA,CAAA,EACzC,CACJ,CAIO,MAAMC,EAA8B,CACzC,CACE,IAAK,cACL,MAAO,cACP,OAASC,GACPC,EAAAA,IAAC,QAAK,UAAU,4CACb,WAAI,YAAY,OAAS,GACtB,GAAGD,EAAI,YAAY,MAAM,EAAG,EAAE,CAAC,MAC/BA,EAAI,WAAA,CACV,CAAA,EAGJ,CACE,IAAK,SACL,MAAO,SACP,OAASA,SAASE,EAAA,CAAY,OAAQF,EAAI,OAAQ,EAClD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASG,EAAA,CAAQ,KAAMH,EAAI,WAAY,EAChD,UAAW,MAAA,CAEf"}
1
+ {"version":3,"file":"helpers-LN5b1KBx.js","sources":["../../src/pages/workflows/cron/helpers.tsx"],"sourcesContent":["import type { LTJob } from '../../../api/types';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\n\n// -- Cron descriptions -------------------------------------------------------\n\nconst CRON_DESCRIPTIONS: Record<string, string> = {\n '* * * * *': 'Every minute',\n '*/5 * * * *': 'Every 5 minutes',\n '*/15 * * * *': 'Every 15 minutes',\n '*/30 * * * *': 'Every 30 minutes',\n '0 * * * *': 'Every hour',\n '0 */2 * * *': 'Every 2 hours',\n '0 */6 * * *': 'Every 6 hours',\n '0 */12 * * *': 'Every 12 hours',\n '0 0 * * *': 'Daily at midnight',\n '0 9 * * *': 'Daily at 9 AM',\n '0 9 * * 1-5': 'Weekdays at 9 AM',\n '0 0 * * 0': 'Weekly (Sunday midnight)',\n '0 0 1 * *': 'Monthly (1st at midnight)',\n '0 2 * * *': 'Daily at 2 AM',\n};\n\nexport function describeCron(expr: string): string {\n return CRON_DESCRIPTIONS[expr] ?? '';\n}\n\nexport const COMMON_PATTERNS: [string, string][] = [\n ['*/15 * * * *', 'Every 15 min'],\n ['0 * * * *', 'Every hour'],\n ['0 */6 * * *', 'Every 6 hours'],\n ['0 9 * * *', 'Daily 9 AM'],\n ['0 9 * * 1-5', 'Weekdays 9 AM'],\n ['0 0 * * 0', 'Weekly (Sun)'],\n];\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n\n// -- Envelope helpers ---------------------------------------------------------\n\n/** Extract simple string/number/boolean keys from `data` for form view. */\nexport function extractFormFields(\n envelope: Record<string, unknown>,\n): { key: string; value: string; type: string }[] | null {\n const data = envelope?.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) return null;\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return null;\n // Only show form if all values are scalar\n const allScalar = entries.every(\n ([, v]) => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean' || v === null,\n );\n if (!allScalar) return null;\n return entries.map(([key, value]) => ({\n key,\n value: value === null ? '' : String(value),\n type: value === null ? 'string' : typeof value,\n }));\n}\n\n// -- Recent jobs table columns ------------------------------------------------\n\nexport const jobColumns: Column<LTJob>[] = [\n {\n key: 'workflow_id',\n label: 'Workflow ID',\n render: (row) => (\n <span className=\"font-mono text-[11px] text-text-secondary\">\n {row.workflow_id.length > 40\n ? `${row.workflow_id.slice(0, 40)}...`\n : row.workflow_id}\n </span>\n ),\n },\n {\n key: 'status',\n label: 'Status',\n render: (row) => <StatusBadge status={row.status} />,\n className: 'w-28',\n },\n {\n key: 'created_at',\n label: 'Started',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-32',\n },\n];\n"],"names":["CRON_DESCRIPTIONS","describeCron","expr","COMMON_PATTERNS","extractFormFields","envelope","data","entries","v","key","value","jobColumns","row","jsx","StatusBadge","TimeAgo"],"mappings":"uIAOA,MAAMA,EAA4C,CAChD,YAAa,eACb,cAAe,kBACf,eAAgB,mBAChB,eAAgB,mBAChB,YAAa,aACb,cAAe,gBACf,cAAe,gBACf,eAAgB,iBAChB,YAAa,oBACb,YAAa,gBACb,cAAe,mBACf,YAAa,2BACb,YAAa,4BACb,YAAa,eACf,EAEO,SAASC,EAAaC,EAAsB,CACjD,OAAOF,EAAkBE,CAAI,GAAK,EACpC,CAEO,MAAMC,EAAsC,CACjD,CAAC,eAAgB,cAAc,EAC/B,CAAC,YAAa,YAAY,EAC1B,CAAC,cAAe,eAAe,EAC/B,CAAC,YAAa,YAAY,EAC1B,CAAC,cAAe,eAAe,EAC/B,CAAC,YAAa,cAAc,CAC9B,EAOO,SAASC,EACdC,EACuD,CACvD,MAAMC,EAAOD,GAAA,YAAAA,EAAU,KACvB,GAAI,CAACC,GAAQ,OAAOA,GAAS,UAAY,MAAM,QAAQA,CAAI,EAAG,OAAO,KACrE,MAAMC,EAAU,OAAO,QAAQD,CAA+B,EAM9D,OALIC,EAAQ,SAAW,GAKnB,CAHcA,EAAQ,MACxB,CAAC,EAAGC,CAAC,IAAM,OAAOA,GAAM,UAAY,OAAOA,GAAM,UAAY,OAAOA,GAAM,WAAaA,IAAM,IAAA,EAExE,KAChBD,EAAQ,IAAI,CAAC,CAACE,EAAKC,CAAK,KAAO,CACpC,IAAAD,EACA,MAAOC,IAAU,KAAO,GAAK,OAAOA,CAAK,EACzC,KAAMA,IAAU,KAAO,SAAW,OAAOA,CAAA,EACzC,CACJ,CAIO,MAAMC,EAA8B,CACzC,CACE,IAAK,cACL,MAAO,cACP,OAASC,GACPC,EAAAA,IAAC,QAAK,UAAU,4CACb,WAAI,YAAY,OAAS,GACtB,GAAGD,EAAI,YAAY,MAAM,EAAG,EAAE,CAAC,MAC/BA,EAAI,WAAA,CACV,CAAA,EAGJ,CACE,IAAK,SACL,MAAO,SACP,OAASA,SAASE,EAAA,CAAY,OAAQF,EAAI,OAAQ,EAClD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASA,SAASG,EAAA,CAAQ,KAAMH,EAAI,WAAY,EAChD,UAAW,MAAA,CAEf"}
@@ -1,2 +1,2 @@
1
- import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{b as I,c as M,d as F,e as E,f as z,u as $}from"./users-C_bD6mzW.js";import{u as P}from"./useFilterParams-DZCAaBC7.js";import{D as R}from"./DataTable-D9yuBv0w.js";import{S as A}from"./StickyPagination-F9FZsRy9.js";import{F as O,b as G}from"./FilterBar-Ck4K4rzu.js";import{T as B}from"./TimestampCell-u1YA8eA3.js";import{C as w}from"./ConfirmDeleteModal-dOxidrSR.js";import{R as U,a as b}from"./RowActions-Dg-Fsm5O.js";import{P as T}from"./PageHeader-DlzOOM4Y.js";import{R as N}from"./RolePill-BZaUpkHg.js";import{M as k}from"./Modal-DEODGeqx.js";import{u as L,a as q,b as H,c as J,d as Y,e as Q,f as V,g as W,h as X}from"./bots-BispbsY3.js";import{u as K}from"./roles-BTxMgLE6.js";import{T as Z}from"./TimeAgo-CnjY3XDt.js";import{N as ee,O as te,ak as se,o as S,Y as ae,K as D,U as ne,a as ie}from"./vendor-icons-DY1ctJgc.js";import{f as le}from"./vendor-react-CX88sFS5.js";import"./index-BhhWCADo.js";import"./EmptyState-BcsfPq9T.js";function re({open:a,onClose:l}){const t=I(),[n,i]=x.useState({external_id:"",email:"",display_name:"",password:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({external_id:"",email:"",display_name:"",password:""}));const m=()=>{n.external_id.trim()&&t.mutate({external_id:n.external_id.trim(),email:n.email.trim()||void 0,display_name:n.display_name.trim()||void 0,password:n.password||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create User",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"External ID (required)"}),e.jsx("input",{type:"text",value:n.external_id,onChange:s=>d("external_id",s.target.value),placeholder:"e.g., john.doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"John Doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:n.email,onChange:s=>d("email",s.target.value),placeholder:"john@example.com",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Password"}),e.jsx("input",{type:"password",value:n.password,onChange:s=>d("password",s.target.value),placeholder:"Leave blank for no password",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.external_id.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function ce({open:a,onClose:l,user:t}){const n=M(),[i,o]=x.useState({display_name:"",email:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",email:t.email??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,email:i.email.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:i.email,onChange:s=>o(r=>({...r,email:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.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"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}function oe({open:a,onClose:l}){const t=L(),[n,i]=x.useState({name:"",display_name:"",description:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({name:"",display_name:"",description:""}));const m=()=>{n.name.trim()&&t.mutate({name:n.name.trim(),display_name:n.display_name.trim()||void 0,description:n.description.trim()||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create Bot",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name (required)"}),e.jsx("input",{type:"text",value:n.name,onChange:s=>d("name",s.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-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"CI Bot",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:n.description,onChange:s=>d("description",s.target.value),placeholder:"Runs scheduled workflows",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.name.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function de({open:a,onClose:l,bot:t}){const n=q(),[i,o]=x.useState({display_name:"",description:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",description:t.description??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,description:i.description.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:i.description,onChange:s=>o(r=>({...r,description:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.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"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}function xe({botId:a}){const{data:l}=H(a),t=J(),n=Y(),[i,o]=x.useState(""),[p,m]=x.useState(null),[d,s]=x.useState(!1),[r,h]=x.useState(null),v=(l==null?void 0:l.keys)??[],c=()=>{i.trim()&&t.mutate({botId:a,name:i.trim(),scopes:["mcp:tool:call"]},{onSuccess:y=>{m(y.rawKey),o("")}})},g=()=>{p&&(navigator.clipboard.writeText(p),s(!0),setTimeout(()=>s(!1),2e3))},f=()=>{r&&n.mutate({botId:a,keyId:r.id},{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"API Keys"}),p&&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-[10px] 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-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis",children:p}),e.jsx("button",{onClick:g,className:"text-text-tertiary hover:text-text-primary shrink-0",title:"Copy to clipboard",children:d?e.jsx(ee,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(te,{className:"w-3.5 h-3.5"})})]})]}),v.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:v.map(y=>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",children:[e.jsx(se,{className:"w-3 h-3 text-text-tertiary"}),e.jsx("span",{className:"text-text-primary font-mono",children:y.name}),y.last_used_at&&e.jsxs("span",{className:"text-[10px] text-text-tertiary",children:["used ",e.jsx(Z,{date:y.last_used_at})]})]}),e.jsx("button",{onClick:()=>h(y),className:"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke key",children:e.jsx(S,{className:"w-3 h-3"})})]},y.id))}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",value:i,onChange:y=>o(y.target.value),placeholder:"Key name...",className:"input text-xs flex-1 font-mono"}),e.jsxs("button",{onClick:c,disabled:!i.trim()||t.isPending,className:"btn-primary text-xs inline-flex items-center gap-1",children:[e.jsx(ae,{className:"w-3 h-3"}),t.isPending?"...":"Generate"]})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message}),e.jsx(w,{open:!!r,onClose:()=>h(null),onConfirm:f,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:r==null?void 0:r.name}),"? This bot will no longer be able to authenticate with this key."]}),isPending:n.isPending,error:n.error})]})}function me({bot:a}){const{data:l}=K(),t=Q(),n=V(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=a.roles??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{i.trim()&&t.mutate({botId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{n.mutate({botId:a.id,role:c})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"Roles"}),s.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:s.map(c=>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(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})}function pe({bot:a}){return a?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:a.display_name||a.external_id}),a.description&&e.jsx("p",{className:"text-xs text-text-tertiary mt-0.5",children:a.description})]}),e.jsx(xe,{botId:a.id}),e.jsx(me,{bot:a})]}):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 bot to manage its API keys and roles."})})}const ue={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function he({embedded:a=!1}){const{pagination:l}=P({filters:{}}),t=W(),[n,i]=x.useState(!1),[o,p]=x.useState(null),[m,d]=x.useState(null),[s,r]=x.useState(null),{data:h,isLoading:v}=X({limit:l.pageSize,offset:l.offset}),c=(h==null?void 0:h.total)??0,g=(h==null?void 0:h.bots)??[],f=x.useMemo(()=>m?g.find(j=>j.id===m.id)??m:null,[g,m]),y=[{key:"display_name",label:"Bot",render:j=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${ue[j.status]??"bg-status-pending"}`,title:j.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:j.display_name||j.external_id}),j.description&&e.jsx("p",{className:"text-xs text-text-tertiary",children:j.description})]})]})},{key:"roles",label:"Roles",render:j=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(j.roles??[]).map(u=>e.jsx(N,{role:u.role},u.role))})},{key:"created_at",label:"Created",render:j=>e.jsx(B,{date:j.created_at}),className:"w-44"},{key:"actions",label:"",render:j=>e.jsxs(U,{children:[e.jsx(b,{icon:D,title:"Edit bot",onClick:()=>p(j)}),e.jsx(b,{icon:S,title:"Delete bot",onClick:()=>r(j),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],C=()=>{s&&t.mutate(s.id,{onSuccess:()=>{r(null),(m==null?void 0:m.id)===s.id&&d(null)}})};return e.jsxs("div",{children:[a?e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}):e.jsx(T,{title:"Service Accounts",actions:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(R,{columns:y,data:g,keyFn:j=>j.id,isLoading:v,emptyMessage:"No bots yet",onRowClick:j=>d(j),activeRowKey:(f==null?void 0:f.id)??null}),e.jsx(A,{page:l.page,totalPages:l.totalPages(c),onPageChange:l.setPage,total:c,pageSize:l.pageSize,onPageSizeChange:l.setPageSize})]}),e.jsx(pe,{bot:f})]}),e.jsx(oe,{open:n,onClose:()=>i(!1)}),e.jsx(de,{open:!!o,onClose:()=>p(null),bot:o}),e.jsx(w,{open:!!s,onClose:()=>r(null),onConfirm:C,title:"Delete Bot",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)}),"? This will also revoke all API keys. This action cannot be undone."]}),isPending:t.isPending,error:t.error})]})}function je({user:a}){const{data:l}=K(),t=F(),n=E(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=(a==null?void 0:a.roles)??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{!a||!i.trim()||t.mutate({userId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{a&&n.mutate({userId:a.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-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Role Membership"}),a?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:a.display_name||a.external_id}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Member of:"})]}),s.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-wrap gap-2",children:s.map(c=>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(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"pt-3 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Role"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})]}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a user to manage their roles."})]})}function ge({active:a,onChange:l}){const t=(n,i,o)=>e.jsxs("button",{onClick:()=>l(n),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${a===n?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[i,o]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[t("users",e.jsx(ne,{className:"w-3.5 h-3.5"}),"User Accounts"),t("service-accounts",e.jsx(ie,{className:"w-3.5 h-3.5"}),"Service Accounts")]})}const ye=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}],ve={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function ze(){const[a,l]=le(),n=a.get("tab")==="service-accounts"?"service-accounts":"users",i=o=>{l(o==="users"?{}:{tab:o})};return e.jsxs("div",{children:[e.jsx(T,{title:"Accounts",docsHash:"#docs:dashboard.md:accounts",actions:e.jsx(ge,{active:n,onChange:i})}),n==="users"?e.jsx(fe,{}):e.jsx(he,{embedded:!0})]})}function fe(){const{filters:a,setFilter:l,pagination:t}=P({filters:{status:""}}),n=z(),[i,o]=x.useState(!1),[p,m]=x.useState(null),[d,s]=x.useState(null),[r,h]=x.useState(null),{data:v,isLoading:c}=$({status:a.status||void 0,limit:t.pageSize,offset:t.offset}),g=(v==null?void 0:v.total)??0,f=(v==null?void 0:v.users)??[],y=x.useMemo(()=>d?f.find(u=>u.id===d.id)??d:null,[f,d]),C=[{key:"display_name",label:"User",render:u=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${ve[u.status]??"bg-status-pending"}`,title:u.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:u.display_name||u.external_id}),u.email&&e.jsx("p",{className:"text-xs text-text-tertiary",children:u.email})]})]})},{key:"roles",label:"Roles",render:u=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(u.roles??[]).map(_=>e.jsx(N,{role:_.role},_.role))})},{key:"created_at",label:"Created",render:u=>e.jsx(B,{date:u.created_at}),className:"w-44"},{key:"actions",label:"",render:u=>e.jsxs(U,{children:[e.jsx(b,{icon:D,title:"Edit user",onClick:()=>m(u)}),e.jsx(b,{icon:S,title:"Delete user",onClick:()=>h(u),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],j=()=>{r&&n.mutate(r.id,{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>o(!0),className:"btn-primary text-xs",children:"Add User"})}),e.jsx(O,{children:e.jsx(G,{label:"Status",value:a.status,onChange:u=>l("status",u),options:ye})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(R,{columns:C,data:f,keyFn:u=>u.id,isLoading:c,emptyMessage:"No users found",onRowClick:u=>s(u),activeRowKey:(y==null?void 0:y.id)??null}),e.jsx(A,{page:t.page,totalPages:t.totalPages(g),onPageChange:t.setPage,total:g,pageSize:t.pageSize,onPageSizeChange:t.setPageSize})]}),e.jsx(je,{user:y})]}),e.jsx(re,{open:i,onClose:()=>o(!1)}),e.jsx(ce,{open:!!p,onClose:()=>m(null),user:p}),e.jsx(w,{open:!!r,onClose:()=>h(null),onConfirm:j,title:"Delete User",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(r==null?void 0:r.display_name)||(r==null?void 0:r.external_id)}),"? This action cannot be undone."]}),isPending:n.isPending,error:n.error})]})}export{ze as UsersPage};
2
- //# sourceMappingURL=index-CVRVw3g_.js.map
1
+ import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{b as I,c as M,d as F,e as E,f as z,u as $}from"./users--D3LoFOD.js";import{u as P}from"./useFilterParams-DZCAaBC7.js";import{D as R}from"./DataTable-D9yuBv0w.js";import{S as A}from"./StickyPagination-F9FZsRy9.js";import{F as O,b as G}from"./FilterBar-Ck4K4rzu.js";import{T as B}from"./TimestampCell-DZu9PtN2.js";import{C as w}from"./ConfirmDeleteModal-dOxidrSR.js";import{R as U,a as b}from"./RowActions-Dg-Fsm5O.js";import{P as T}from"./PageHeader-Bo0SpcCK.js";import{R as N}from"./RolePill-BDzPFQUv.js";import{M as k}from"./Modal-DEODGeqx.js";import{u as L,a as q,b as H,c as J,d as Y,e as Q,f as V,g as W,h as X}from"./bots-2uGZ2l7A.js";import{u as K}from"./roles-DW6lI_g5.js";import{T as Z}from"./TimeAgo-B6Gz4RAU.js";import{K as ee,O as te,ak as se,n as S,Y as ae,J as D,U as ne,a as ie}from"./vendor-icons-BNtvBbnj.js";import{f as le}from"./vendor-react-CX88sFS5.js";import"./index-CBS8FBcp.js";import"./EmptyState-BcsfPq9T.js";function re({open:a,onClose:l}){const t=I(),[n,i]=x.useState({external_id:"",email:"",display_name:"",password:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({external_id:"",email:"",display_name:"",password:""}));const m=()=>{n.external_id.trim()&&t.mutate({external_id:n.external_id.trim(),email:n.email.trim()||void 0,display_name:n.display_name.trim()||void 0,password:n.password||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create User",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"External ID (required)"}),e.jsx("input",{type:"text",value:n.external_id,onChange:s=>d("external_id",s.target.value),placeholder:"e.g., john.doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"John Doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:n.email,onChange:s=>d("email",s.target.value),placeholder:"john@example.com",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Password"}),e.jsx("input",{type:"password",value:n.password,onChange:s=>d("password",s.target.value),placeholder:"Leave blank for no password",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.external_id.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function ce({open:a,onClose:l,user:t}){const n=M(),[i,o]=x.useState({display_name:"",email:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",email:t.email??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,email:i.email.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:i.email,onChange:s=>o(r=>({...r,email:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.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"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}function oe({open:a,onClose:l}){const t=L(),[n,i]=x.useState({name:"",display_name:"",description:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({name:"",display_name:"",description:""}));const m=()=>{n.name.trim()&&t.mutate({name:n.name.trim(),display_name:n.display_name.trim()||void 0,description:n.description.trim()||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create Bot",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name (required)"}),e.jsx("input",{type:"text",value:n.name,onChange:s=>d("name",s.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-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"CI Bot",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:n.description,onChange:s=>d("description",s.target.value),placeholder:"Runs scheduled workflows",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.name.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function de({open:a,onClose:l,bot:t}){const n=q(),[i,o]=x.useState({display_name:"",description:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",description:t.description??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,description:i.description.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:i.description,onChange:s=>o(r=>({...r,description:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.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"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}function xe({botId:a}){const{data:l}=H(a),t=J(),n=Y(),[i,o]=x.useState(""),[p,m]=x.useState(null),[d,s]=x.useState(!1),[r,h]=x.useState(null),v=(l==null?void 0:l.keys)??[],c=()=>{i.trim()&&t.mutate({botId:a,name:i.trim(),scopes:["mcp:tool:call"]},{onSuccess:y=>{m(y.rawKey),o("")}})},g=()=>{p&&(navigator.clipboard.writeText(p),s(!0),setTimeout(()=>s(!1),2e3))},f=()=>{r&&n.mutate({botId:a,keyId:r.id},{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"API Keys"}),p&&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-[10px] 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-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis",children:p}),e.jsx("button",{onClick:g,className:"text-text-tertiary hover:text-text-primary shrink-0",title:"Copy to clipboard",children:d?e.jsx(ee,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(te,{className:"w-3.5 h-3.5"})})]})]}),v.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:v.map(y=>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",children:[e.jsx(se,{className:"w-3 h-3 text-text-tertiary"}),e.jsx("span",{className:"text-text-primary font-mono",children:y.name}),y.last_used_at&&e.jsxs("span",{className:"text-[10px] text-text-tertiary",children:["used ",e.jsx(Z,{date:y.last_used_at})]})]}),e.jsx("button",{onClick:()=>h(y),className:"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke key",children:e.jsx(S,{className:"w-3 h-3"})})]},y.id))}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",value:i,onChange:y=>o(y.target.value),placeholder:"Key name...",className:"input text-xs flex-1 font-mono"}),e.jsxs("button",{onClick:c,disabled:!i.trim()||t.isPending,className:"btn-primary text-xs inline-flex items-center gap-1",children:[e.jsx(ae,{className:"w-3 h-3"}),t.isPending?"...":"Generate"]})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message}),e.jsx(w,{open:!!r,onClose:()=>h(null),onConfirm:f,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:r==null?void 0:r.name}),"? This bot will no longer be able to authenticate with this key."]}),isPending:n.isPending,error:n.error})]})}function me({bot:a}){const{data:l}=K(),t=Q(),n=V(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=a.roles??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{i.trim()&&t.mutate({botId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{n.mutate({botId:a.id,role:c})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"Roles"}),s.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:s.map(c=>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(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})}function pe({bot:a}){return a?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:a.display_name||a.external_id}),a.description&&e.jsx("p",{className:"text-xs text-text-tertiary mt-0.5",children:a.description})]}),e.jsx(xe,{botId:a.id}),e.jsx(me,{bot:a})]}):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 bot to manage its API keys and roles."})})}const ue={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function he({embedded:a=!1}){const{pagination:l}=P({filters:{}}),t=W(),[n,i]=x.useState(!1),[o,p]=x.useState(null),[m,d]=x.useState(null),[s,r]=x.useState(null),{data:h,isLoading:v}=X({limit:l.pageSize,offset:l.offset}),c=(h==null?void 0:h.total)??0,g=(h==null?void 0:h.bots)??[],f=x.useMemo(()=>m?g.find(j=>j.id===m.id)??m:null,[g,m]),y=[{key:"display_name",label:"Bot",render:j=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${ue[j.status]??"bg-status-pending"}`,title:j.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:j.display_name||j.external_id}),j.description&&e.jsx("p",{className:"text-xs text-text-tertiary",children:j.description})]})]})},{key:"roles",label:"Roles",render:j=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(j.roles??[]).map(u=>e.jsx(N,{role:u.role},u.role))})},{key:"created_at",label:"Created",render:j=>e.jsx(B,{date:j.created_at}),className:"w-44"},{key:"actions",label:"",render:j=>e.jsxs(U,{children:[e.jsx(b,{icon:D,title:"Edit bot",onClick:()=>p(j)}),e.jsx(b,{icon:S,title:"Delete bot",onClick:()=>r(j),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],C=()=>{s&&t.mutate(s.id,{onSuccess:()=>{r(null),(m==null?void 0:m.id)===s.id&&d(null)}})};return e.jsxs("div",{children:[a?e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}):e.jsx(T,{title:"Service Accounts",actions:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(R,{columns:y,data:g,keyFn:j=>j.id,isLoading:v,emptyMessage:"No bots yet",onRowClick:j=>d(j),activeRowKey:(f==null?void 0:f.id)??null}),e.jsx(A,{page:l.page,totalPages:l.totalPages(c),onPageChange:l.setPage,total:c,pageSize:l.pageSize,onPageSizeChange:l.setPageSize})]}),e.jsx(pe,{bot:f})]}),e.jsx(oe,{open:n,onClose:()=>i(!1)}),e.jsx(de,{open:!!o,onClose:()=>p(null),bot:o}),e.jsx(w,{open:!!s,onClose:()=>r(null),onConfirm:C,title:"Delete Bot",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)}),"? This will also revoke all API keys. This action cannot be undone."]}),isPending:t.isPending,error:t.error})]})}function je({user:a}){const{data:l}=K(),t=F(),n=E(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=(a==null?void 0:a.roles)??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{!a||!i.trim()||t.mutate({userId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{a&&n.mutate({userId:a.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-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Role Membership"}),a?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:a.display_name||a.external_id}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Member of:"})]}),s.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-wrap gap-2",children:s.map(c=>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(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"pt-3 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Role"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})]}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a user to manage their roles."})]})}function ge({active:a,onChange:l}){const t=(n,i,o)=>e.jsxs("button",{onClick:()=>l(n),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${a===n?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[i,o]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[t("users",e.jsx(ne,{className:"w-3.5 h-3.5"}),"User Accounts"),t("service-accounts",e.jsx(ie,{className:"w-3.5 h-3.5"}),"Service Accounts")]})}const ye=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}],ve={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function ze(){const[a,l]=le(),n=a.get("tab")==="service-accounts"?"service-accounts":"users",i=o=>{l(o==="users"?{}:{tab:o})};return e.jsxs("div",{children:[e.jsx(T,{title:"Accounts",docsHash:"#docs:dashboard.md:accounts",actions:e.jsx(ge,{active:n,onChange:i})}),n==="users"?e.jsx(fe,{}):e.jsx(he,{embedded:!0})]})}function fe(){const{filters:a,setFilter:l,pagination:t}=P({filters:{status:""}}),n=z(),[i,o]=x.useState(!1),[p,m]=x.useState(null),[d,s]=x.useState(null),[r,h]=x.useState(null),{data:v,isLoading:c}=$({status:a.status||void 0,limit:t.pageSize,offset:t.offset}),g=(v==null?void 0:v.total)??0,f=(v==null?void 0:v.users)??[],y=x.useMemo(()=>d?f.find(u=>u.id===d.id)??d:null,[f,d]),C=[{key:"display_name",label:"User",render:u=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${ve[u.status]??"bg-status-pending"}`,title:u.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:u.display_name||u.external_id}),u.email&&e.jsx("p",{className:"text-xs text-text-tertiary",children:u.email})]})]})},{key:"roles",label:"Roles",render:u=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(u.roles??[]).map(_=>e.jsx(N,{role:_.role},_.role))})},{key:"created_at",label:"Created",render:u=>e.jsx(B,{date:u.created_at}),className:"w-44"},{key:"actions",label:"",render:u=>e.jsxs(U,{children:[e.jsx(b,{icon:D,title:"Edit user",onClick:()=>m(u)}),e.jsx(b,{icon:S,title:"Delete user",onClick:()=>h(u),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],j=()=>{r&&n.mutate(r.id,{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>o(!0),className:"btn-primary text-xs",children:"Add User"})}),e.jsx(O,{children:e.jsx(G,{label:"Status",value:a.status,onChange:u=>l("status",u),options:ye})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(R,{columns:C,data:f,keyFn:u=>u.id,isLoading:c,emptyMessage:"No users found",onRowClick:u=>s(u),activeRowKey:(y==null?void 0:y.id)??null}),e.jsx(A,{page:t.page,totalPages:t.totalPages(g),onPageChange:t.setPage,total:g,pageSize:t.pageSize,onPageSizeChange:t.setPageSize})]}),e.jsx(je,{user:y})]}),e.jsx(re,{open:i,onClose:()=>o(!1)}),e.jsx(ce,{open:!!p,onClose:()=>m(null),user:p}),e.jsx(w,{open:!!r,onClose:()=>h(null),onConfirm:j,title:"Delete User",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(r==null?void 0:r.display_name)||(r==null?void 0:r.external_id)}),"? This action cannot be undone."]}),isPending:n.isPending,error:n.error})]})}export{ze as UsersPage};
2
+ //# sourceMappingURL=index-BMo7wCw8.js.map