@hotmeshio/long-tail 0.1.15 → 0.1.16

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 (170) hide show
  1. package/build/api/settings.js +0 -3
  2. package/build/api/yaml-workflows/crud.js +25 -5
  3. package/build/index.d.ts +1 -1
  4. package/build/lib/db/schemas/schemas/001_schema.sql +485 -0
  5. package/build/lib/db/schemas/schemas/002_seed.sql +92 -0
  6. package/build/lib/events/socketio.d.ts +12 -0
  7. package/build/lib/events/socketio.js +24 -1
  8. package/build/routes/index.js +2 -0
  9. package/build/routes/nats-credentials.d.ts +2 -0
  10. package/build/routes/nats-credentials.js +22 -0
  11. package/build/services/yaml-workflow/workers/register.js +4 -2
  12. package/build/start/adapters.js +4 -1
  13. package/build/start/socket-auth.d.ts +13 -0
  14. package/build/start/socket-auth.js +32 -0
  15. package/build/tsconfig.tsbuildinfo +1 -1
  16. package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js → AdminDashboard-Bprul9Eb.js} +2 -2
  17. package/dashboard/dist/assets/{AdminDashboard-NLryl1_B.js.map → AdminDashboard-Bprul9Eb.js.map} +1 -1
  18. package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js → AvailableEscalationsPage-H_z5mC10.js} +2 -2
  19. package/dashboard/dist/assets/{AvailableEscalationsPage-6vexlrk3.js.map → AvailableEscalationsPage-H_z5mC10.js.map} +1 -1
  20. package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js → BotPicker-DcvILNUf.js} +2 -2
  21. package/dashboard/dist/assets/{BotPicker-DWhn0tr1.js.map → BotPicker-DcvILNUf.js.map} +1 -1
  22. package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js → CollapsibleSection-BWPbzgEe.js} +2 -2
  23. package/dashboard/dist/assets/{CollapsibleSection-CgYgQiOc.js.map → CollapsibleSection-BWPbzgEe.js.map} +1 -1
  24. package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js → ConfirmDeleteModal-Cy6KVLfC.js} +2 -2
  25. package/dashboard/dist/assets/{ConfirmDeleteModal-DCKAPXD3.js.map → ConfirmDeleteModal-Cy6KVLfC.js.map} +1 -1
  26. package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js → CopyableId-CRED8hvk.js} +2 -2
  27. package/dashboard/dist/assets/{CopyableId-DXkaAOYk.js.map → CopyableId-CRED8hvk.js.map} +1 -1
  28. package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js → CredentialsPage-BUdvxiE3.js} +2 -2
  29. package/dashboard/dist/assets/{CredentialsPage-B361BOfU.js.map → CredentialsPage-BUdvxiE3.js.map} +1 -1
  30. package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js → CustomDurationPicker-eOk2EqQ5.js} +2 -2
  31. package/dashboard/dist/assets/{CustomDurationPicker-D2G1ldiF.js.map → CustomDurationPicker-eOk2EqQ5.js.map} +1 -1
  32. package/dashboard/dist/assets/{DataTable-DXSUbA26.js → DataTable-bd2PTBJd.js} +2 -2
  33. package/dashboard/dist/assets/{DataTable-DXSUbA26.js.map → DataTable-bd2PTBJd.js.map} +1 -1
  34. package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js → ElapsedCell-BGo8vyus.js} +2 -2
  35. package/dashboard/dist/assets/{ElapsedCell-CQGqkXP_.js.map → ElapsedCell-BGo8vyus.js.map} +1 -1
  36. package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js → EmptyState-BygtU-Rh.js} +2 -2
  37. package/dashboard/dist/assets/{EmptyState-Dep92Wkg.js.map → EmptyState-BygtU-Rh.js.map} +1 -1
  38. package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js → EscalationsOverview-DUEcN5MP.js} +2 -2
  39. package/dashboard/dist/assets/{EscalationsOverview-DVEFVjs7.js.map → EscalationsOverview-DUEcN5MP.js.map} +1 -1
  40. package/dashboard/dist/assets/{EventTable-BMJAPkMi.js → EventTable-CmFhswLW.js} +2 -2
  41. package/dashboard/dist/assets/{EventTable-BMJAPkMi.js.map → EventTable-CmFhswLW.js.map} +1 -1
  42. package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js → FilterBar-BQNzsd3A.js} +2 -2
  43. package/dashboard/dist/assets/{FilterBar-DbVbCzH2.js.map → FilterBar-BQNzsd3A.js.map} +1 -1
  44. package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js → ListToolbar-OWOn-HiC.js} +2 -2
  45. package/dashboard/dist/assets/{ListToolbar-0XNuXj0M.js.map → ListToolbar-OWOn-HiC.js.map} +1 -1
  46. package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js → McpOverview-OkEzvClD.js} +2 -2
  47. package/dashboard/dist/assets/{McpOverview-CeYnCzBN.js.map → McpOverview-OkEzvClD.js.map} +1 -1
  48. package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js → McpQueryDetailPage-C6Ih5sC_.js} +2 -2
  49. package/dashboard/dist/assets/{McpQueryDetailPage-t3qW3QNa.js.map → McpQueryDetailPage-C6Ih5sC_.js.map} +1 -1
  50. package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js → McpQueryPage-BAuOf5TL.js} +2 -2
  51. package/dashboard/dist/assets/{McpQueryPage-CfUcdzaj.js.map → McpQueryPage-BAuOf5TL.js.map} +1 -1
  52. package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js → McpRunDetailPage-DMeiG4i_.js} +2 -2
  53. package/dashboard/dist/assets/{McpRunDetailPage-CZtodW_Z.js.map → McpRunDetailPage-DMeiG4i_.js.map} +1 -1
  54. package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js → McpRunsPage-CG3cNJh8.js} +2 -2
  55. package/dashboard/dist/assets/{McpRunsPage-Dzgq7HGt.js.map → McpRunsPage-CG3cNJh8.js.map} +1 -1
  56. package/dashboard/dist/assets/{Modal-yyhUeKoA.js → Modal-Dir9Rlnx.js} +2 -2
  57. package/dashboard/dist/assets/{Modal-yyhUeKoA.js.map → Modal-Dir9Rlnx.js.map} +1 -1
  58. package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js → OperatorDashboard-OqWC6Azy.js} +2 -2
  59. package/dashboard/dist/assets/{OperatorDashboard-Ceh7OQtZ.js.map → OperatorDashboard-OqWC6Azy.js.map} +1 -1
  60. package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js → PageHeader-FJIemmrC.js} +2 -2
  61. package/dashboard/dist/assets/{PageHeader-CZ9a8cpr.js.map → PageHeader-FJIemmrC.js.map} +1 -1
  62. package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js → PageHeaderWithStats-Br5y9qNO.js} +2 -2
  63. package/dashboard/dist/assets/{PageHeaderWithStats-BJuNs5NM.js.map → PageHeaderWithStats-Br5y9qNO.js.map} +1 -1
  64. package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js → PriorityBadge-C7D5d_HY.js} +2 -2
  65. package/dashboard/dist/assets/{PriorityBadge-BrPikMFy.js.map → PriorityBadge-C7D5d_HY.js.map} +1 -1
  66. package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js → ProcessDetailPage-DZIP6grw.js} +2 -2
  67. package/dashboard/dist/assets/{ProcessDetailPage-2miaYd8G.js.map → ProcessDetailPage-DZIP6grw.js.map} +1 -1
  68. package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js → ProcessesListPage-BQoPYkeB.js} +2 -2
  69. package/dashboard/dist/assets/{ProcessesListPage-DqpRDqjk.js.map → ProcessesListPage-BQoPYkeB.js.map} +1 -1
  70. package/dashboard/dist/assets/{RolePill-DxbJMfJu.js → RolePill-D6nMxMvp.js} +2 -2
  71. package/dashboard/dist/assets/{RolePill-DxbJMfJu.js.map → RolePill-D6nMxMvp.js.map} +1 -1
  72. package/dashboard/dist/assets/{RolesPage-CYHRo21-.js → RolesPage-CwLnJFhy.js} +2 -2
  73. package/dashboard/dist/assets/{RolesPage-CYHRo21-.js.map → RolesPage-CwLnJFhy.js.map} +1 -1
  74. package/dashboard/dist/assets/{RowActions-DurFwIwe.js → RowActions-JqgAB0p3.js} +2 -2
  75. package/dashboard/dist/assets/{RowActions-DurFwIwe.js.map → RowActions-JqgAB0p3.js.map} +1 -1
  76. package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js → RunAsSelector-KAlKtitB.js} +2 -2
  77. package/dashboard/dist/assets/{RunAsSelector-CNKraP6u.js.map → RunAsSelector-KAlKtitB.js.map} +1 -1
  78. package/dashboard/dist/assets/{StatCard-CKplpK3w.js → StatCard-B-WLhOaH.js} +2 -2
  79. package/dashboard/dist/assets/{StatCard-CKplpK3w.js.map → StatCard-B-WLhOaH.js.map} +1 -1
  80. package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js → StatusBadge-DVCf2ncM.js} +2 -2
  81. package/dashboard/dist/assets/{StatusBadge-Dm0V1dNN.js.map → StatusBadge-DVCf2ncM.js.map} +1 -1
  82. package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js → StepIndicator-D9Xvdf18.js} +2 -2
  83. package/dashboard/dist/assets/{StepIndicator-Dicx0WTZ.js.map → StepIndicator-D9Xvdf18.js.map} +1 -1
  84. package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js → StickyPagination-CJHMzYJj.js} +2 -2
  85. package/dashboard/dist/assets/{StickyPagination-B2jYvU3-.js.map → StickyPagination-CJHMzYJj.js.map} +1 -1
  86. package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js → SwimlaneTimeline-YiXPDyEL.js} +2 -2
  87. package/dashboard/dist/assets/{SwimlaneTimeline-ClwumkT1.js.map → SwimlaneTimeline-YiXPDyEL.js.map} +1 -1
  88. package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js → TagInput-DcPnUnSJ.js} +2 -2
  89. package/dashboard/dist/assets/{TagInput-CypDZ6Kl.js.map → TagInput-DcPnUnSJ.js.map} +1 -1
  90. package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js → TaskDetailPage-DftmYWD7.js} +2 -2
  91. package/dashboard/dist/assets/{TaskDetailPage-DooDNJGT.js.map → TaskDetailPage-DftmYWD7.js.map} +1 -1
  92. package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js → TaskQueuePill-BzduBqwy.js} +2 -2
  93. package/dashboard/dist/assets/{TaskQueuePill-C1hZ-j31.js.map → TaskQueuePill-BzduBqwy.js.map} +1 -1
  94. package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js → TasksListPage-DeewV4Gp.js} +2 -2
  95. package/dashboard/dist/assets/{TasksListPage-D7CdkAeg.js.map → TasksListPage-DeewV4Gp.js.map} +1 -1
  96. package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js → TimeAgo-DJZq-e4R.js} +2 -2
  97. package/dashboard/dist/assets/{TimeAgo-B5LXB2aj.js.map → TimeAgo-DJZq-e4R.js.map} +1 -1
  98. package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js → TimestampCell-Dx5uwGfS.js} +2 -2
  99. package/dashboard/dist/assets/{TimestampCell-Crb9b0Gw.js.map → TimestampCell-Dx5uwGfS.js.map} +1 -1
  100. package/dashboard/dist/assets/{UserName-OPg-nkRa.js → UserName-CnGk7MgL.js} +2 -2
  101. package/dashboard/dist/assets/{UserName-OPg-nkRa.js.map → UserName-CnGk7MgL.js.map} +1 -1
  102. package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js → WorkflowExecutionPage-CPQ0fIwf.js} +2 -2
  103. package/dashboard/dist/assets/{WorkflowExecutionPage-CcLVrs9b.js.map → WorkflowExecutionPage-CPQ0fIwf.js.map} +1 -1
  104. package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js → WorkflowPill-BrD5d1AG.js} +2 -2
  105. package/dashboard/dist/assets/{WorkflowPill-CCV4MMj7.js.map → WorkflowPill-BrD5d1AG.js.map} +1 -1
  106. package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js → WorkflowsDashboard-BzjhABZP.js} +2 -2
  107. package/dashboard/dist/assets/{WorkflowsDashboard-DB1SncBi.js.map → WorkflowsDashboard-BzjhABZP.js.map} +1 -1
  108. package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js → WorkflowsOverview-lBp2E6rN.js} +2 -2
  109. package/dashboard/dist/assets/{WorkflowsOverview-DvShiYJV.js.map → WorkflowsOverview-lBp2E6rN.js.map} +1 -1
  110. package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js → YamlWorkflowsPage-C_MkAp2i.js} +2 -2
  111. package/dashboard/dist/assets/{YamlWorkflowsPage-DCBoMeGI.js.map → YamlWorkflowsPage-C_MkAp2i.js.map} +1 -1
  112. package/dashboard/dist/assets/{bots-Dqos20NE.js → bots-fc_O_YIq.js} +2 -2
  113. package/dashboard/dist/assets/{bots-Dqos20NE.js.map → bots-fc_O_YIq.js.map} +1 -1
  114. package/dashboard/dist/assets/{escalation-A0CsbvNV.js → escalation-BYhLYHBz.js} +2 -2
  115. package/dashboard/dist/assets/{escalation-A0CsbvNV.js.map → escalation-BYhLYHBz.js.map} +1 -1
  116. package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js → escalation-columns-DjJyuC1g.js} +2 -2
  117. package/dashboard/dist/assets/{escalation-columns-BpBJN6k4.js.map → escalation-columns-DjJyuC1g.js.map} +1 -1
  118. package/dashboard/dist/assets/{helpers-CmznCuAx.js → helpers-CQG3Rh2y.js} +2 -2
  119. package/dashboard/dist/assets/{helpers-CmznCuAx.js.map → helpers-CQG3Rh2y.js.map} +1 -1
  120. package/dashboard/dist/assets/{index-C8-UaN4N.js → index-2nBhR7Dg.js} +2 -2
  121. package/dashboard/dist/assets/{index-C8-UaN4N.js.map → index-2nBhR7Dg.js.map} +1 -1
  122. package/dashboard/dist/assets/{index-DZHNte4o.js → index-4IUoh_hd.js} +2 -2
  123. package/dashboard/dist/assets/{index-DZHNte4o.js.map → index-4IUoh_hd.js.map} +1 -1
  124. package/dashboard/dist/assets/{index-BIeYV5QK.js → index-B2CqPzLK.js} +2 -2
  125. package/dashboard/dist/assets/{index-BIeYV5QK.js.map → index-B2CqPzLK.js.map} +1 -1
  126. package/dashboard/dist/assets/{index-ZjOUzWhc.js → index-B78xalb4.js} +2 -2
  127. package/dashboard/dist/assets/{index-ZjOUzWhc.js.map → index-B78xalb4.js.map} +1 -1
  128. package/dashboard/dist/assets/{index-CjxHCVxl.js → index-BI8r69O_.js} +2 -2
  129. package/dashboard/dist/assets/{index-CjxHCVxl.js.map → index-BI8r69O_.js.map} +1 -1
  130. package/dashboard/dist/assets/{index-t5frSddy.js → index-CUqCBBZG.js} +2 -2
  131. package/dashboard/dist/assets/{index-t5frSddy.js.map → index-CUqCBBZG.js.map} +1 -1
  132. package/dashboard/dist/assets/{index-Cr0Rqsj7.js → index-D51PaQZY.js} +2 -2
  133. package/dashboard/dist/assets/{index-Cr0Rqsj7.js.map → index-D51PaQZY.js.map} +1 -1
  134. package/dashboard/dist/assets/{index-XGOmZ117.js → index-DNtXXy1o.js} +2 -2
  135. package/dashboard/dist/assets/{index-XGOmZ117.js.map → index-DNtXXy1o.js.map} +1 -1
  136. package/dashboard/dist/assets/{index-VnYkWW8r.js → index-DR4qQvlW.js} +2 -2
  137. package/dashboard/dist/assets/{index-VnYkWW8r.js.map → index-DR4qQvlW.js.map} +1 -1
  138. package/dashboard/dist/assets/{index-CAj5LT9H.js → index-Dh0PCbR-.js} +2 -2
  139. package/dashboard/dist/assets/{index-CAj5LT9H.js.map → index-Dh0PCbR-.js.map} +1 -1
  140. package/dashboard/dist/assets/{index-BYwD3kHN.js → index-KYpLvJKB.js} +2 -2
  141. package/dashboard/dist/assets/{index-BYwD3kHN.js.map → index-KYpLvJKB.js.map} +1 -1
  142. package/dashboard/dist/assets/{index-puKKZ5l8.js → index-sNrqYt0Q.js} +53 -53
  143. package/dashboard/dist/assets/index-sNrqYt0Q.js.map +1 -0
  144. package/dashboard/dist/assets/{mcp-DrWymhSu.js → mcp-D2XfRh8v.js} +2 -2
  145. package/dashboard/dist/assets/{mcp-DrWymhSu.js.map → mcp-D2XfRh8v.js.map} +1 -1
  146. package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js → mcp-query-CIx_mIC7.js} +2 -2
  147. package/dashboard/dist/assets/{mcp-query-BhUxVEMS.js.map → mcp-query-CIx_mIC7.js.map} +1 -1
  148. package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js → mcp-runs-C9_J4LIH.js} +2 -2
  149. package/dashboard/dist/assets/{mcp-runs-DUfz4mLd.js.map → mcp-runs-C9_J4LIH.js.map} +1 -1
  150. package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js → namespaces-BwMljx6f.js} +2 -2
  151. package/dashboard/dist/assets/{namespaces-Cm6AY5sh.js.map → namespaces-BwMljx6f.js.map} +1 -1
  152. package/dashboard/dist/assets/{roles-2v1Kc7BJ.js → roles-Bd_sTV6I.js} +2 -2
  153. package/dashboard/dist/assets/{roles-2v1Kc7BJ.js.map → roles-Bd_sTV6I.js.map} +1 -1
  154. package/dashboard/dist/assets/{settings-DTQNp6tH.js → settings-BCb8eFyA.js} +2 -2
  155. package/dashboard/dist/assets/{settings-DTQNp6tH.js.map → settings-BCb8eFyA.js.map} +1 -1
  156. package/dashboard/dist/assets/{tasks-CS1rgG1s.js → tasks-Bq54qGGq.js} +2 -2
  157. package/dashboard/dist/assets/{tasks-CS1rgG1s.js.map → tasks-Bq54qGGq.js.map} +1 -1
  158. package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js → useEventHooks-BTbGf536.js} +2 -2
  159. package/dashboard/dist/assets/{useEventHooks-BjXX8x3a.js.map → useEventHooks-BTbGf536.js.map} +1 -1
  160. package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js → useYamlActivityEvents-CsYP09W5.js} +2 -2
  161. package/dashboard/dist/assets/{useYamlActivityEvents-BeR-nVWQ.js.map → useYamlActivityEvents-CsYP09W5.js.map} +1 -1
  162. package/dashboard/dist/assets/{users-DYsdQ7Md.js → users-BTBhafGc.js} +2 -2
  163. package/dashboard/dist/assets/{users-DYsdQ7Md.js.map → users-BTBhafGc.js.map} +1 -1
  164. package/dashboard/dist/assets/{workflows-2QAXh3UD.js → workflows-BkzA4ahe.js} +2 -2
  165. package/dashboard/dist/assets/{workflows-2QAXh3UD.js.map → workflows-BkzA4ahe.js.map} +1 -1
  166. package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js → yaml-workflows-Cs0EYp0F.js} +2 -2
  167. package/dashboard/dist/assets/{yaml-workflows-sx8-UEE3.js.map → yaml-workflows-Cs0EYp0F.js.map} +1 -1
  168. package/dashboard/dist/index.html +1 -1
  169. package/package.json +1 -1
  170. package/dashboard/dist/assets/index-puKKZ5l8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"helpers-CmznCuAx.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","jsxDEV","this","StatusBadge","TimeAgo"],"mappings":"gIAOA,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,OAAC,QAAK,UAAU,4CACb,WAAI,YAAY,OAAS,GACtB,GAAGD,EAAI,YAAY,MAAM,EAAG,EAAE,CAAC,MAC/BA,EAAI,aAHV,OAAA,GAAA,CAAA,SAAA,sDAAA,WAAA,GAAA,aAAA,CAAA,EAAAE,MAIA,CAAA,EAGJ,CACE,IAAK,SACL,MAAO,SACP,OAASF,YAASG,EAAA,CAAY,OAAQH,EAAI,MAAA,EAAzB,OAAA,GAAA,CAAA,SAAA,sDAAA,WAAA,GAAA,aAAA,EAAA,EAAAE,MAAiC,EAClD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASF,YAASI,EAAA,CAAQ,KAAMJ,EAAI,UAAA,EAAnB,OAAA,GAAA,CAAA,SAAA,sDAAA,WAAA,GAAA,aAAA,EAAA,EAAAE,MAA+B,EAChD,UAAW,MAAA,CAEf"}
1
+ {"version":3,"file":"helpers-CQG3Rh2y.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","jsxDEV","this","StatusBadge","TimeAgo"],"mappings":"gIAOA,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,OAAC,QAAK,UAAU,4CACb,WAAI,YAAY,OAAS,GACtB,GAAGD,EAAI,YAAY,MAAM,EAAG,EAAE,CAAC,MAC/BA,EAAI,aAHV,OAAA,GAAA,CAAA,SAAA,sDAAA,WAAA,GAAA,aAAA,CAAA,EAAAE,MAIA,CAAA,EAGJ,CACE,IAAK,SACL,MAAO,SACP,OAASF,YAASG,EAAA,CAAY,OAAQH,EAAI,MAAA,EAAzB,OAAA,GAAA,CAAA,SAAA,sDAAA,WAAA,GAAA,aAAA,EAAA,EAAAE,MAAiC,EAClD,UAAW,MAAA,EAEb,CACE,IAAK,aACL,MAAO,UACP,OAASF,YAASI,EAAA,CAAQ,KAAMJ,EAAI,UAAA,EAAnB,OAAA,GAAA,CAAA,SAAA,sDAAA,WAAA,GAAA,aAAA,EAAA,EAAAE,MAA+B,EAChD,UAAW,MAAA,CAEf"}
@@ -1,2 +1,2 @@
1
- import{j as r}from"./index-puKKZ5l8.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{h as b}from"./workflows-2QAXh3UD.js";import{D as N}from"./DataTable-DXSUbA26.js";import{F as g,b as x}from"./FilterBar-DbVbCzH2.js";import{R as v,a as m}from"./RowActions-DurFwIwe.js";import{u as P}from"./useFilterParams-CGRYFw_A.js";import{P as W}from"./PageHeader-CZ9a8cpr.js";import{T as y}from"./TaskQueuePill-C1hZ-j31.js";import{W as D}from"./WorkflowPill-CCV4MMj7.js";import{a3 as E,a7 as j,N as C}from"./vendor-icons-CWl44VA6.js";import{c as q}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-Dep92Wkg.js";function B(){const a=q(),{data:u,isLoading:c}=b(),{filters:s,setFilter:i}=P({filters:{search:"",queue:""}}),[o,p]=l.useState(s.search);l.useEffect(()=>{if(o===s.search)return;const e=setTimeout(()=>i("search",o),300);return()=>clearTimeout(e)},[o,i,s.search]);const t=u??[],f=l.useMemo(()=>[...new Set(t.map(e=>e.task_queue).filter(Boolean))].sort(),[t]),k=l.useMemo(()=>{let e=t;if(s.search){const n=s.search.toLowerCase();e=e.filter(h=>h.name.toLowerCase().includes(n))}return s.queue&&(e=e.filter(n=>n.task_queue===s.queue)),e},[t,s]),d=[{key:"name",label:"Workflow",render:e=>r.jsxDEV(D,{type:e.name},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:52,columnNumber:24},this)},{key:"task_queue",label:"Queue",render:e=>r.jsxDEV(y,{queue:e.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:57,columnNumber:24},this),className:"whitespace-nowrap"},{key:"registered",label:"Status",render:e=>e.registered?r.jsxDEV("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[r.jsxDEV(E,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:131},this),"Certified"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:11},this):r.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:65,columnNumber:11},this),className:"whitespace-nowrap"},{key:"actions",label:"",render:e=>r.jsxDEV(v,{children:e.registered?r.jsxDEV(m,{icon:j,title:"View config",onClick:()=>a(`/workflows/registry/${encodeURIComponent(e.name)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:74,columnNumber:13},this):r.jsxDEV(m,{icon:C,title:"Register workflow",onClick:()=>a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:80,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:72,columnNumber:9},this),className:"w-16 text-right"}],w=e=>{e.registered?a(`/workflows/registry/${encodeURIComponent(e.name)}`):a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)};return r.jsxDEV("div",{children:[r.jsxDEV(W,{title:"Workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:102,columnNumber:7},this),r.jsxDEV(g,{children:[r.jsxDEV("input",{type:"text",placeholder:"Search workers...",value:o,onChange:e=>p(e.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:105,columnNumber:9},this),r.jsxDEV(x,{label:"Queue",value:s.queue,onChange:e=>i("queue",e),options:f.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:112,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:104,columnNumber:7},this),r.jsxDEV(N,{columns:d,data:k,keyFn:e=>e.name,onRowClick:w,isLoading:c,emptyMessage:"No active workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:120,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:101,columnNumber:5},this)}export{B as WorkersPage};
2
- //# sourceMappingURL=index-C8-UaN4N.js.map
1
+ import{j as r}from"./index-sNrqYt0Q.js";import{a as l}from"./vendor-query-DLp59M9_.js";import{h as b}from"./workflows-BkzA4ahe.js";import{D as N}from"./DataTable-bd2PTBJd.js";import{F as g,b as x}from"./FilterBar-BQNzsd3A.js";import{R as v,a as m}from"./RowActions-JqgAB0p3.js";import{u as P}from"./useFilterParams-CGRYFw_A.js";import{P as W}from"./PageHeader-FJIemmrC.js";import{T as y}from"./TaskQueuePill-BzduBqwy.js";import{W as D}from"./WorkflowPill-BrD5d1AG.js";import{a3 as E,a7 as j,N as C}from"./vendor-icons-CWl44VA6.js";import{c as q}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-BygtU-Rh.js";function B(){const a=q(),{data:u,isLoading:c}=b(),{filters:s,setFilter:i}=P({filters:{search:"",queue:""}}),[o,p]=l.useState(s.search);l.useEffect(()=>{if(o===s.search)return;const e=setTimeout(()=>i("search",o),300);return()=>clearTimeout(e)},[o,i,s.search]);const t=u??[],f=l.useMemo(()=>[...new Set(t.map(e=>e.task_queue).filter(Boolean))].sort(),[t]),k=l.useMemo(()=>{let e=t;if(s.search){const n=s.search.toLowerCase();e=e.filter(h=>h.name.toLowerCase().includes(n))}return s.queue&&(e=e.filter(n=>n.task_queue===s.queue)),e},[t,s]),d=[{key:"name",label:"Workflow",render:e=>r.jsxDEV(D,{type:e.name},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:52,columnNumber:24},this)},{key:"task_queue",label:"Queue",render:e=>r.jsxDEV(y,{queue:e.task_queue},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:57,columnNumber:24},this),className:"whitespace-nowrap"},{key:"registered",label:"Status",render:e=>e.registered?r.jsxDEV("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[r.jsxDEV(E,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:131},this),"Certified"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:64,columnNumber:11},this):r.jsxDEV("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:65,columnNumber:11},this),className:"whitespace-nowrap"},{key:"actions",label:"",render:e=>r.jsxDEV(v,{children:e.registered?r.jsxDEV(m,{icon:j,title:"View config",onClick:()=>a(`/workflows/registry/${encodeURIComponent(e.name)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:74,columnNumber:13},this):r.jsxDEV(m,{icon:C,title:"Register workflow",onClick:()=>a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:80,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:72,columnNumber:9},this),className:"w-16 text-right"}],w=e=>{e.registered?a(`/workflows/registry/${encodeURIComponent(e.name)}`):a(`/workflows/registry/new?workflow_type=${encodeURIComponent(e.name)}&task_queue=${encodeURIComponent(e.task_queue)}`)};return r.jsxDEV("div",{children:[r.jsxDEV(W,{title:"Workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:102,columnNumber:7},this),r.jsxDEV(g,{children:[r.jsxDEV("input",{type:"text",placeholder:"Search workers...",value:o,onChange:e=>p(e.target.value),className:"input text-[11px] py-1 px-2 w-56"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:105,columnNumber:9},this),r.jsxDEV(x,{label:"Queue",value:s.queue,onChange:e=>i("queue",e),options:f.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:112,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:104,columnNumber:7},this),r.jsxDEV(N,{columns:d,data:k,keyFn:e=>e.name,onRowClick:w,isLoading:c,emptyMessage:"No active workers"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:120,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workers/WorkersPage.tsx",lineNumber:101,columnNumber:5},this)}export{B as WorkersPage};
2
+ //# sourceMappingURL=index-2nBhR7Dg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-C8-UaN4N.js","sources":["../../src/pages/workflows/workers/WorkersPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Plus, Eye, ShieldCheck } from 'lucide-react';\nimport { useActiveWorkers } from '../../../api/workflows';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { ActiveWorker } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkersPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useActiveWorkers();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkers = data ?? [];\n\n const queues = useMemo(\n () => [...new Set(allWorkers.map((w) => w.task_queue).filter(Boolean))].sort(),\n [allWorkers],\n );\n\n const workers = useMemo(() => {\n let result = allWorkers;\n if (filters.search) {\n const q = filters.search.toLowerCase();\n result = result.filter((w) => w.name.toLowerCase().includes(q));\n }\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n return result;\n }, [allWorkers, filters]);\n\n const columns: Column<ActiveWorker>[] = [\n {\n key: 'name',\n label: 'Workflow',\n render: (row) => <WorkflowPill type={row.name} />,\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => <TaskQueuePill queue={row.task_queue} />,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Status',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={Eye}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.name)}`)}\n />\n ) : (\n <RowAction\n icon={Plus}\n title=\"Register workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleRowClick = (row: ActiveWorker) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.name)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`);\n }\n };\n\n return (\n <div>\n <PageHeader title=\"Workers\" />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workers...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workers}\n keyFn={(row) => row.name}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No active workers\"\n />\n </div>\n );\n}\n"],"names":["WorkersPage","navigate","useNavigate","data","isLoading","useActiveWorkers","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","allWorkers","queues","useMemo","w","workers","result","q","columns","row","WorkflowPill","TaskQueuePill","jsxDEV","ShieldCheck","RowActionGroup","RowAction","Eye","Plus","handleRowClick","PageHeader","FilterBar","FilterSelect","v","DataTable"],"mappings":"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"}
1
+ {"version":3,"file":"index-2nBhR7Dg.js","sources":["../../src/pages/workflows/workers/WorkersPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Plus, Eye, ShieldCheck } from 'lucide-react';\nimport { useActiveWorkers } from '../../../api/workflows';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { ActiveWorker } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkersPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useActiveWorkers();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkers = data ?? [];\n\n const queues = useMemo(\n () => [...new Set(allWorkers.map((w) => w.task_queue).filter(Boolean))].sort(),\n [allWorkers],\n );\n\n const workers = useMemo(() => {\n let result = allWorkers;\n if (filters.search) {\n const q = filters.search.toLowerCase();\n result = result.filter((w) => w.name.toLowerCase().includes(q));\n }\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n return result;\n }, [allWorkers, filters]);\n\n const columns: Column<ActiveWorker>[] = [\n {\n key: 'name',\n label: 'Workflow',\n render: (row) => <WorkflowPill type={row.name} />,\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => <TaskQueuePill queue={row.task_queue} />,\n className: 'whitespace-nowrap',\n },\n {\n key: 'registered',\n label: 'Status',\n render: (row) => row.registered\n ? <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>\n : <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary\">Durable</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.registered ? (\n <RowAction\n icon={Eye}\n title=\"View config\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.name)}`)}\n />\n ) : (\n <RowAction\n icon={Plus}\n title=\"Register workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`)}\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleRowClick = (row: ActiveWorker) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.name)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.name)}&task_queue=${encodeURIComponent(row.task_queue)}`);\n }\n };\n\n return (\n <div>\n <PageHeader title=\"Workers\" />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workers...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workers}\n keyFn={(row) => row.name}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No active workers\"\n />\n </div>\n );\n}\n"],"names":["WorkersPage","navigate","useNavigate","data","isLoading","useActiveWorkers","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","allWorkers","queues","useMemo","w","workers","result","q","columns","row","WorkflowPill","TaskQueuePill","jsxDEV","ShieldCheck","RowActionGroup","RowAction","Eye","Plus","handleRowClick","PageHeader","FilterBar","FilterSelect","v","DataTable"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./index-puKKZ5l8.js";import{a as u}from"./vendor-query-DLp59M9_.js";import{b as A,c as T,d as K,e as I,f as F,u as z}from"./users-DYsdQ7Md.js";import{u as C}from"./useFilterParams-CGRYFw_A.js";import{D as U}from"./DataTable-DXSUbA26.js";import{S as k}from"./StickyPagination-B2jYvU3-.js";import{F as $,b as O}from"./FilterBar-DbVbCzH2.js";import{T as w}from"./TimestampCell-Crb9b0Gw.js";import{C as y}from"./ConfirmDeleteModal-DCKAPXD3.js";import{R as M,a as D}from"./RowActions-DurFwIwe.js";import{P as S}from"./PageHeader-CZ9a8cpr.js";import{R as E}from"./RolePill-DxbJMfJu.js";import{M as j}from"./Modal-yyhUeKoA.js";import{a as G,b as L,c as q,d as H,e as J,f as Q,g as W,h as X,u as Y}from"./bots-Dqos20NE.js";import{u as R}from"./roles-2v1Kc7BJ.js";import{T as Z}from"./TimeAgo-B5LXB2aj.js";import{D as ee,H as se,ae,l as P,N as te,z as _,U as ie,a4 as re}from"./vendor-icons-CWl44VA6.js";import{f as le}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-Dep92Wkg.js";function oe({open:t,onClose:l}){const s=A(),[i,r]=u.useState({external_id:"",email:"",display_name:"",password:""}),[d,p]=u.useState(t);t!==d&&(p(t),t&&r({external_id:"",email:"",display_name:"",password:""}));const c=()=>{i.external_id.trim()&&s.mutate({external_id:i.external_id.trim(),email:i.email.trim()||void 0,display_name:i.display_name.trim()||void 0,password:i.password||void 0},{onSuccess:l})},m=(a,o)=>r(N=>({...N,[a]:o}));return e.jsxDEV(j,{open:t,onClose:l,title:"Create User",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"External ID (required)"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:46,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.external_id,onChange:a=>m("external_id",a.target.value),placeholder:"e.g., john.doe",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:49,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:45,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:58,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.display_name,onChange:a=>m("display_name",a.target.value),placeholder:"John Doe",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:61,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:57,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:70,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.email,onChange:a=>m("email",a.target.value),placeholder:"john@example.com",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:73,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:69,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Password"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:82,columnNumber:11},this),e.jsxDEV("input",{type:"password",value:i.password,onChange:a=>m("password",a.target.value),placeholder:"Leave blank for no password",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:85,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:81,columnNumber:9},this),s.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:95,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:99,columnNumber:11},this),e.jsxDEV("button",{onClick:c,disabled:!i.external_id.trim()||s.isPending,className:"btn-primary text-xs",children:s.isPending?"Creating...":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:102,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:98,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:44,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:43,columnNumber:5},this)}function ne({open:t,onClose:l,user:s}){const i=T(),[r,d]=u.useState({display_name:"",email:"",status:"active"}),[p,c]=u.useState(s);s!==p&&(c(s),s&&d({display_name:s.display_name??"",email:s.email??"",status:s.status}));const m=()=>{s&&i.mutate({id:s.id,display_name:r.display_name.trim()||void 0,email:r.email.trim()||void 0,status:r.status},{onSuccess:l})};return e.jsxDEV(j,{open:t,onClose:l,title:`Edit — ${(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)||""}`,children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:55,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.display_name,onChange:a=>d(o=>({...o,display_name:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:66,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.email,onChange:a=>d(o=>({...o,email:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:65,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:77,columnNumber:11},this),e.jsxDEV("select",{value:r.status,onChange:a=>d(o=>({...o,status:a.target.value})),className:"select text-xs w-full",children:[e.jsxDEV("option",{value:"active",children:"Active"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:85,columnNumber:13},this),e.jsxDEV("option",{value:"inactive",children:"Inactive"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:86,columnNumber:13},this),e.jsxDEV("option",{value:"suspended",children:"Suspended"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:87,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:80,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:76,columnNumber:9},this),i.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:i.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:92,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:96,columnNumber:11},this),e.jsxDEV("button",{onClick:m,disabled:i.isPending,className:"btn-primary text-xs",children:i.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:99,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:95,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:53,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:48,columnNumber:5},this)}function de({open:t,onClose:l}){const s=G(),[i,r]=u.useState({name:"",display_name:"",description:""}),[d,p]=u.useState(t);t!==d&&(p(t),t&&r({name:"",display_name:"",description:""}));const c=()=>{i.name.trim()&&s.mutate({name:i.name.trim(),display_name:i.display_name.trim()||void 0,description:i.description.trim()||void 0},{onSuccess:l})},m=(a,o)=>r(N=>({...N,[a]:o}));return e.jsxDEV(j,{open:t,onClose:l,title:"Create Bot",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name (required)"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:44,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.name,onChange:a=>m("name",a.target.value.replace(/\s+/g,"-").toLowerCase()),placeholder:"e.g., ci-bot",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:47,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:43,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:56,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.display_name,onChange:a=>m("display_name",a.target.value),placeholder:"CI Bot",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:59,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:55,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:68,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.description,onChange:a=>m("description",a.target.value),placeholder:"Runs scheduled workflows",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:71,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:67,columnNumber:9},this),s.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:81,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:85,columnNumber:11},this),e.jsxDEV("button",{onClick:c,disabled:!i.name.trim()||s.isPending,className:"btn-primary text-xs",children:s.isPending?"Creating...":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:88,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:84,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:42,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:41,columnNumber:5},this)}function me({open:t,onClose:l,bot:s}){const i=L(),[r,d]=u.useState({display_name:"",description:"",status:"active"}),[p,c]=u.useState(s);s!==p&&(c(s),s&&d({display_name:s.display_name??"",description:s.description??"",status:s.status}));const m=()=>{s&&i.mutate({id:s.id,display_name:r.display_name.trim()||void 0,description:r.description.trim()||void 0,status:r.status},{onSuccess:l})};return e.jsxDEV(j,{open:t,onClose:l,title:`Edit — ${(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)||""}`,children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:55,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.display_name,onChange:a=>d(o=>({...o,display_name:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:66,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.description,onChange:a=>d(o=>({...o,description:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:65,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:77,columnNumber:11},this),e.jsxDEV("select",{value:r.status,onChange:a=>d(o=>({...o,status:a.target.value})),className:"select text-xs w-full",children:[e.jsxDEV("option",{value:"active",children:"Active"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:85,columnNumber:13},this),e.jsxDEV("option",{value:"inactive",children:"Inactive"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:86,columnNumber:13},this),e.jsxDEV("option",{value:"suspended",children:"Suspended"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:87,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:80,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:76,columnNumber:9},this),i.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:i.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:92,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:96,columnNumber:11},this),e.jsxDEV("button",{onClick:m,disabled:i.isPending,className:"btn-primary text-xs",children:i.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:99,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:95,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:53,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:48,columnNumber:5},this)}function ue({botId:t}){const{data:l}=q(t),s=H(),i=J(),[r,d]=u.useState(""),[p,c]=u.useState(null),[m,a]=u.useState(!1),[o,N]=u.useState(null),g=(l==null?void 0:l.keys)??[],n=()=>{r.trim()&&s.mutate({botId:t,name:r.trim(),scopes:["mcp:tool:call"]},{onSuccess:f=>{c(f.rawKey),d("")}})},h=()=>{p&&(navigator.clipboard.writeText(p),a(!0),setTimeout(()=>a(!1),2e3))},v=()=>{o&&i.mutate({botId:t,keyId:o.id},{onSuccess:()=>N(null)})};return e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"API Keys"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:58,columnNumber:7},this),p&&e.jsxDEV("div",{className:"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold text-status-success mb-1",children:"Key generated — copy now, it won't be shown again"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:64,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("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},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:68,columnNumber:13},this),e.jsxDEV("button",{onClick:h,className:"text-text-tertiary hover:text-text-primary shrink-0",title:"Copy to clipboard",children:m?e.jsxDEV(ee,{className:"w-3.5 h-3.5 text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:76,columnNumber:25},this):e.jsxDEV(se,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:76,columnNumber:81},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:71,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:67,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:63,columnNumber:9},this),g.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-3",children:"No API keys."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:83,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-1.5 mb-3",children:g.map(f=>e.jsxDEV("div",{className:"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(ae,{className:"w-3 h-3 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:92,columnNumber:17},this),e.jsxDEV("span",{className:"text-text-primary font-mono",children:f.name},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:93,columnNumber:17},this),f.last_used_at&&e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:["used ",e.jsxDEV(Z,{date:f.last_used_at},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:96,columnNumber:26},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:95,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:91,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>N(f),className:"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke key",children:e.jsxDEV(P,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:105,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:100,columnNumber:15},this)]},f.id,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:87,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:85,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("input",{type:"text",value:r,onChange:f=>d(f.target.value),placeholder:"Key name...",className:"input text-xs flex-1 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:113,columnNumber:9},this),e.jsxDEV("button",{onClick:n,disabled:!r.trim()||s.isPending,className:"btn-primary text-xs inline-flex items-center gap-1",children:[e.jsxDEV(te,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:125,columnNumber:11},this),s.isPending?"...":"Generate"]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:120,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:112,columnNumber:7},this),s.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:130,columnNumber:9},this),e.jsxDEV(y,{open:!!o,onClose:()=>N(null),onConfirm:v,title:"Revoke API Key",description:e.jsxDEV(e.Fragment,{children:["Revoke API key"," ",e.jsxDEV("span",{className:"font-medium text-text-primary font-mono",children:o==null?void 0:o.name},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:141,columnNumber:13},this),"? This bot will no longer be able to authenticate with this key."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:139,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:133,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:57,columnNumber:5},this)}function ce({bot:t}){const{data:l}=R(),s=Q(),i=W(),[r,d]=u.useState(""),[p,c]=u.useState("member"),m=(l==null?void 0:l.roles)??[],a=t.roles??[],o=u.useMemo(()=>{const n=new Set(a.map(h=>h.role));return m.filter(h=>!n.has(h))},[m,a]),N=()=>{r.trim()&&s.mutate({botId:t.id,role:r.trim(),type:p},{onSuccess:()=>{d(""),c("member")}})},g=n=>{i.mutate({botId:t.id,role:n})};return e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"Roles"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:183,columnNumber:7},this),a.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-3",children:"No roles assigned."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:188,columnNumber:9},this):e.jsxDEV("div",{className:"flex flex-wrap gap-2 mb-3",children:a.map(n=>e.jsxDEV("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.jsxDEV(E,{role:n.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:196,columnNumber:15},this),e.jsxDEV("span",{className:"text-[9px] text-text-tertiary",children:n.type},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:197,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>g(n.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${n.role}`,children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:198,columnNumber:15},this)]},n.role,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:192,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:190,columnNumber:9},this),o.length>0&&e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:r,onChange:n=>d(n.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Select a role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:217,columnNumber:13},this),o.map(n=>e.jsxDEV("option",{value:n,children:n},n,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:219,columnNumber:15},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:212,columnNumber:11},this),e.jsxDEV("select",{value:p,onChange:n=>c(n.target.value),className:"select text-xs w-24",children:[e.jsxDEV("option",{value:"member",children:"member"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:227,columnNumber:13},this),e.jsxDEV("option",{value:"admin",children:"admin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:228,columnNumber:13},this),e.jsxDEV("option",{value:"superadmin",children:"superadmin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:229,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:222,columnNumber:11},this),e.jsxDEV("button",{onClick:N,disabled:!r||s.isPending,className:"btn-primary text-xs",children:s.isPending?"...":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:231,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:211,columnNumber:9},this),s.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:241,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:182,columnNumber:5},this)}function pe({bot:t}){return t?e.jsxDEV("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:t.display_name||t.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:261,columnNumber:9},this),t.description&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-0.5",children:t.description},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:263,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:260,columnNumber:7},this),e.jsxDEV(ue,{botId:t.id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:267,columnNumber:7},this),e.jsxDEV(ce,{bot:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:268,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:259,columnNumber:5},this):e.jsxDEV("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Select a bot to manage its API keys and roles."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:251,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:250,columnNumber:7},this)}const be={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function Ne({embedded:t=!1}){const{pagination:l}=C({filters:{}}),s=X(),[i,r]=u.useState(!1),[d,p]=u.useState(null),[c,m]=u.useState(null),[a,o]=u.useState(null),{data:N,isLoading:g}=Y({limit:l.pageSize,offset:l.offset}),n=(N==null?void 0:N.total)??0,h=(N==null?void 0:N.bots)??[],v=u.useMemo(()=>c?h.find(x=>x.id===c.id)??c:null,[h,c]),f=[{key:"display_name",label:"Bot",render:x=>e.jsxDEV("div",{className:"flex items-center gap-2.5",children:[e.jsxDEV("span",{className:`w-2 h-2 rounded-full shrink-0 ${be[x.status]??"bg-status-pending"}`,title:x.status},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:51,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:x.display_name||x.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:56,columnNumber:13},this),x.description&&e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:x.description},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:60,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:55,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:50,columnNumber:9},this)},{key:"roles",label:"Roles",render:x=>e.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:(x.roles??[]).map(b=>e.jsxDEV(E,{role:b.role},b.role,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:72,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:70,columnNumber:9},this)},{key:"created_at",label:"Created",render:x=>e.jsxDEV(w,{date:x.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:80,columnNumber:24},this),className:"w-44"},{key:"actions",label:"",render:x=>e.jsxDEV(M,{children:[e.jsxDEV(D,{icon:_,title:"Edit bot",onClick:()=>p(x)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:88,columnNumber:11},this),e.jsxDEV(D,{icon:P,title:"Delete bot",onClick:()=>o(x),colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:93,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:87,columnNumber:9},this),className:"w-16 text-right"}],V=()=>{a&&s.mutate(a.id,{onSuccess:()=>{o(null),(c==null?void 0:c.id)===a.id&&m(null)}})};return e.jsxDEV("div",{children:[t?e.jsxDEV("div",{className:"flex justify-end mb-4",children:e.jsxDEV("button",{onClick:()=>r(!0),className:"btn-primary text-xs",children:"Add Bot"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:119,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:118,columnNumber:9},this):e.jsxDEV(S,{title:"Service Accounts",actions:e.jsxDEV("button",{onClick:()=>r(!0),className:"btn-primary text-xs",children:"Add Bot"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:127,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:124,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6",children:[e.jsxDEV("div",{className:"overflow-x-clip",children:[e.jsxDEV(U,{columns:f,data:h,keyFn:x=>x.id,isLoading:g,emptyMessage:"No bots yet",onRowClick:x=>m(x),activeRowKey:(v==null?void 0:v.id)??null},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:136,columnNumber:11},this),e.jsxDEV(k,{page:l.page,totalPages:l.totalPages(n),onPageChange:l.setPage,total:n,pageSize:l.pageSize,onPageSizeChange:l.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:146,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:135,columnNumber:9},this),e.jsxDEV(pe,{bot:v},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:156,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:134,columnNumber:7},this),e.jsxDEV(de,{open:i,onClose:()=>r(!1)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:159,columnNumber:7},this),e.jsxDEV(me,{open:!!d,onClose:()=>p(null),bot:d},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:161,columnNumber:7},this),e.jsxDEV(y,{open:!!a,onClose:()=>o(null),onConfirm:V,title:"Delete Bot",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:(a==null?void 0:a.display_name)||(a==null?void 0:a.external_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:175,columnNumber:13},this),"? This will also revoke all API keys. This action cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:173,columnNumber:11},this),isPending:s.isPending,error:s.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:167,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:116,columnNumber:5},this)}function xe({user:t}){const{data:l}=R(),s=K(),i=I(),[r,d]=u.useState(""),[p,c]=u.useState("member"),m=(l==null?void 0:l.roles)??[],a=(t==null?void 0:t.roles)??[],o=u.useMemo(()=>{const n=new Set(a.map(h=>h.role));return m.filter(h=>!n.has(h))},[m,a]),N=()=>{!t||!r.trim()||s.mutate({userId:t.id,role:r.trim(),type:p},{onSuccess:()=>{d(""),c("member")}})},g=n=>{t&&i.mutate({userId:t.id,role:n})};return e.jsxDEV("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Role Membership"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:37,columnNumber:7},this),t?e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:t.display_name||t.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:48,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Member of:"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:49,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:47,columnNumber:11},this),a.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"No roles assigned."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:53,columnNumber:13},this):e.jsxDEV("div",{className:"flex flex-wrap gap-2",children:a.map(n=>e.jsxDEV("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.jsxDEV(E,{role:n.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:61,columnNumber:19},this),e.jsxDEV("span",{className:"text-[9px] text-text-tertiary",children:n.type},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:62,columnNumber:19},this),e.jsxDEV("button",{onClick:()=>g(n.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${n.role}`,children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:63,columnNumber:19},this)]},n.role,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:57,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:55,columnNumber:13},this),o.length>0&&e.jsxDEV("div",{className:"pt-3 border-t border-surface-border",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:77,columnNumber:15},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:r,onChange:n=>d(n.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Select a role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:86,columnNumber:19},this),o.map(n=>e.jsxDEV("option",{value:n,children:n},n,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:88,columnNumber:21},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:81,columnNumber:17},this),e.jsxDEV("select",{value:p,onChange:n=>c(n.target.value),className:"select text-xs w-24",children:[e.jsxDEV("option",{value:"member",children:"member"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:96,columnNumber:19},this),e.jsxDEV("option",{value:"admin",children:"admin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:97,columnNumber:19},this),e.jsxDEV("option",{value:"superadmin",children:"superadmin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:98,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:91,columnNumber:17},this),e.jsxDEV("button",{onClick:N,disabled:!r||s.isPending,className:"btn-primary text-xs",children:s.isPending?"...":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:100,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:80,columnNumber:15},this),s.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:109,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:76,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:46,columnNumber:9},this):e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Select a user to manage their roles."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:42,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:36,columnNumber:5},this)}function he({active:t,onChange:l}){const s=(i,r,d)=>e.jsxDEV("button",{onClick:()=>l(i),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${t===i?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[r,d]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:7,columnNumber:5},this);return e.jsxDEV("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[s("users",e.jsxDEV(ie,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:22,columnNumber:21},this),"User Accounts"),s("service-accounts",e.jsxDEV(re,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:23,columnNumber:32},this),"Service Accounts")]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:21,columnNumber:5},this)}const fe=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}],ge={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function Fe(){const[t,l]=le(),i=t.get("tab")==="service-accounts"?"service-accounts":"users",r=d=>{l(d==="users"?{}:{tab:d})};return e.jsxDEV("div",{children:[e.jsxDEV(S,{title:"Accounts",actions:e.jsxDEV(he,{active:i,onChange:r},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:50,columnNumber:18},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:48,columnNumber:7},this),i==="users"?e.jsxDEV(ve,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:52,columnNumber:32},this):e.jsxDEV(Ne,{embedded:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:52,columnNumber:56},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:47,columnNumber:5},this)}function ve(){const{filters:t,setFilter:l,pagination:s}=C({filters:{status:""}}),i=F(),[r,d]=u.useState(!1),[p,c]=u.useState(null),[m,a]=u.useState(null),[o,N]=u.useState(null),{data:g,isLoading:n}=z({status:t.status||void 0,limit:s.pageSize,offset:s.offset}),h=(g==null?void 0:g.total)??0,v=(g==null?void 0:g.users)??[],f=u.useMemo(()=>m?v.find(b=>b.id===m.id)??m:null,[v,m]),V=[{key:"display_name",label:"User",render:b=>e.jsxDEV("div",{className:"flex items-center gap-2.5",children:[e.jsxDEV("span",{className:`w-2 h-2 rounded-full shrink-0 ${ge[b.status]??"bg-status-pending"}`,title:b.status},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:88,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:b.display_name||b.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:93,columnNumber:13},this),b.email&&e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:b.email},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:97,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:92,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:87,columnNumber:9},this)},{key:"roles",label:"Roles",render:b=>e.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:(b.roles??[]).map(B=>e.jsxDEV(E,{role:B.role},B.role,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:109,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:107,columnNumber:9},this)},{key:"created_at",label:"Created",render:b=>e.jsxDEV(w,{date:b.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:117,columnNumber:24},this),className:"w-44"},{key:"actions",label:"",render:b=>e.jsxDEV(M,{children:[e.jsxDEV(D,{icon:_,title:"Edit user",onClick:()=>c(b)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:125,columnNumber:11},this),e.jsxDEV(D,{icon:P,title:"Delete user",onClick:()=>N(b),colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:130,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:124,columnNumber:9},this),className:"w-16 text-right"}],x=()=>{o&&i.mutate(o.id,{onSuccess:()=>N(null)})};return e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex justify-end mb-4",children:e.jsxDEV("button",{onClick:()=>d(!0),className:"btn-primary text-xs",children:"Add User"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:152,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:151,columnNumber:7},this),e.jsxDEV($,{children:e.jsxDEV(O,{label:"Status",value:t.status,onChange:b=>l("status",b),options:fe},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:158,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:157,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxDEV("div",{className:"overflow-x-clip",children:[e.jsxDEV(U,{columns:V,data:v,keyFn:b=>b.id,isLoading:n,emptyMessage:"No users found",onRowClick:b=>a(b),activeRowKey:(f==null?void 0:f.id)??null},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:169,columnNumber:11},this),e.jsxDEV(k,{page:s.page,totalPages:s.totalPages(h),onPageChange:s.setPage,total:h,pageSize:s.pageSize,onPageSizeChange:s.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:179,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:168,columnNumber:9},this),e.jsxDEV(xe,{user:f},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:190,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:166,columnNumber:7},this),e.jsxDEV(oe,{open:r,onClose:()=>d(!1)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:193,columnNumber:7},this),e.jsxDEV(ne,{open:!!p,onClose:()=>c(null),user:p},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:195,columnNumber:7},this),e.jsxDEV(y,{open:!!o,onClose:()=>N(null),onConfirm:x,title:"Delete User",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:(o==null?void 0:o.display_name)||(o==null?void 0:o.external_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:209,columnNumber:13},this),"? This action cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:207,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:201,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:150,columnNumber:5},this)}export{Fe as UsersPage};
2
- //# sourceMappingURL=index-DZHNte4o.js.map
1
+ import{j as e}from"./index-sNrqYt0Q.js";import{a as u}from"./vendor-query-DLp59M9_.js";import{b as A,c as T,d as K,e as I,f as F,u as z}from"./users-BTBhafGc.js";import{u as C}from"./useFilterParams-CGRYFw_A.js";import{D as U}from"./DataTable-bd2PTBJd.js";import{S as k}from"./StickyPagination-CJHMzYJj.js";import{F as $,b as O}from"./FilterBar-BQNzsd3A.js";import{T as w}from"./TimestampCell-Dx5uwGfS.js";import{C as y}from"./ConfirmDeleteModal-Cy6KVLfC.js";import{R as M,a as D}from"./RowActions-JqgAB0p3.js";import{P as S}from"./PageHeader-FJIemmrC.js";import{R as E}from"./RolePill-D6nMxMvp.js";import{M as j}from"./Modal-Dir9Rlnx.js";import{a as G,b as L,c as q,d as H,e as J,f as Q,g as W,h as X,u as Y}from"./bots-fc_O_YIq.js";import{u as R}from"./roles-Bd_sTV6I.js";import{T as Z}from"./TimeAgo-DJZq-e4R.js";import{D as ee,H as se,ae,l as P,N as te,z as _,U as ie,a4 as re}from"./vendor-icons-CWl44VA6.js";import{f as le}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-BygtU-Rh.js";function oe({open:t,onClose:l}){const s=A(),[i,r]=u.useState({external_id:"",email:"",display_name:"",password:""}),[d,p]=u.useState(t);t!==d&&(p(t),t&&r({external_id:"",email:"",display_name:"",password:""}));const c=()=>{i.external_id.trim()&&s.mutate({external_id:i.external_id.trim(),email:i.email.trim()||void 0,display_name:i.display_name.trim()||void 0,password:i.password||void 0},{onSuccess:l})},m=(a,o)=>r(N=>({...N,[a]:o}));return e.jsxDEV(j,{open:t,onClose:l,title:"Create User",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"External ID (required)"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:46,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.external_id,onChange:a=>m("external_id",a.target.value),placeholder:"e.g., john.doe",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:49,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:45,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:58,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.display_name,onChange:a=>m("display_name",a.target.value),placeholder:"John Doe",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:61,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:57,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:70,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.email,onChange:a=>m("email",a.target.value),placeholder:"john@example.com",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:73,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:69,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Password"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:82,columnNumber:11},this),e.jsxDEV("input",{type:"password",value:i.password,onChange:a=>m("password",a.target.value),placeholder:"Leave blank for no password",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:85,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:81,columnNumber:9},this),s.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:95,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:99,columnNumber:11},this),e.jsxDEV("button",{onClick:c,disabled:!i.external_id.trim()||s.isPending,className:"btn-primary text-xs",children:s.isPending?"Creating...":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:102,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:98,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:44,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/CreateUserModal.tsx",lineNumber:43,columnNumber:5},this)}function ne({open:t,onClose:l,user:s}){const i=T(),[r,d]=u.useState({display_name:"",email:"",status:"active"}),[p,c]=u.useState(s);s!==p&&(c(s),s&&d({display_name:s.display_name??"",email:s.email??"",status:s.status}));const m=()=>{s&&i.mutate({id:s.id,display_name:r.display_name.trim()||void 0,email:r.email.trim()||void 0,status:r.status},{onSuccess:l})};return e.jsxDEV(j,{open:t,onClose:l,title:`Edit — ${(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)||""}`,children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:55,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.display_name,onChange:a=>d(o=>({...o,display_name:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:66,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.email,onChange:a=>d(o=>({...o,email:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:65,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:77,columnNumber:11},this),e.jsxDEV("select",{value:r.status,onChange:a=>d(o=>({...o,status:a.target.value})),className:"select text-xs w-full",children:[e.jsxDEV("option",{value:"active",children:"Active"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:85,columnNumber:13},this),e.jsxDEV("option",{value:"inactive",children:"Inactive"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:86,columnNumber:13},this),e.jsxDEV("option",{value:"suspended",children:"Suspended"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:87,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:80,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:76,columnNumber:9},this),i.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:i.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:92,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:96,columnNumber:11},this),e.jsxDEV("button",{onClick:m,disabled:i.isPending,className:"btn-primary text-xs",children:i.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:99,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:95,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:53,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/EditUserModal.tsx",lineNumber:48,columnNumber:5},this)}function de({open:t,onClose:l}){const s=G(),[i,r]=u.useState({name:"",display_name:"",description:""}),[d,p]=u.useState(t);t!==d&&(p(t),t&&r({name:"",display_name:"",description:""}));const c=()=>{i.name.trim()&&s.mutate({name:i.name.trim(),display_name:i.display_name.trim()||void 0,description:i.description.trim()||void 0},{onSuccess:l})},m=(a,o)=>r(N=>({...N,[a]:o}));return e.jsxDEV(j,{open:t,onClose:l,title:"Create Bot",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name (required)"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:44,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.name,onChange:a=>m("name",a.target.value.replace(/\s+/g,"-").toLowerCase()),placeholder:"e.g., ci-bot",className:"input text-xs w-full font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:47,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:43,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:56,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.display_name,onChange:a=>m("display_name",a.target.value),placeholder:"CI Bot",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:59,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:55,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:68,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:i.description,onChange:a=>m("description",a.target.value),placeholder:"Runs scheduled workflows",className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:71,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:67,columnNumber:9},this),s.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:81,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:85,columnNumber:11},this),e.jsxDEV("button",{onClick:c,disabled:!i.name.trim()||s.isPending,className:"btn-primary text-xs",children:s.isPending?"Creating...":"Create"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:88,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:84,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:42,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/CreateBotModal.tsx",lineNumber:41,columnNumber:5},this)}function me({open:t,onClose:l,bot:s}){const i=L(),[r,d]=u.useState({display_name:"",description:"",status:"active"}),[p,c]=u.useState(s);s!==p&&(c(s),s&&d({display_name:s.display_name??"",description:s.description??"",status:s.status}));const m=()=>{s&&i.mutate({id:s.id,display_name:r.display_name.trim()||void 0,description:r.description.trim()||void 0,status:r.status},{onSuccess:l})};return e.jsxDEV(j,{open:t,onClose:l,title:`Edit — ${(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)||""}`,children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:55,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.display_name,onChange:a=>d(o=>({...o,display_name:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:58,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:54,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:66,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:r.description,onChange:a=>d(o=>({...o,description:a.target.value})),className:"input text-xs w-full"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:69,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:65,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:77,columnNumber:11},this),e.jsxDEV("select",{value:r.status,onChange:a=>d(o=>({...o,status:a.target.value})),className:"select text-xs w-full",children:[e.jsxDEV("option",{value:"active",children:"Active"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:85,columnNumber:13},this),e.jsxDEV("option",{value:"inactive",children:"Inactive"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:86,columnNumber:13},this),e.jsxDEV("option",{value:"suspended",children:"Suspended"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:87,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:80,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:76,columnNumber:9},this),i.error&&e.jsxDEV("p",{className:"text-xs text-status-error",children:i.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:92,columnNumber:11},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:96,columnNumber:11},this),e.jsxDEV("button",{onClick:m,disabled:i.isPending,className:"btn-primary text-xs",children:i.isPending?"Saving...":"Save"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:99,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:95,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:53,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/EditBotModal.tsx",lineNumber:48,columnNumber:5},this)}function ue({botId:t}){const{data:l}=q(t),s=H(),i=J(),[r,d]=u.useState(""),[p,c]=u.useState(null),[m,a]=u.useState(!1),[o,N]=u.useState(null),g=(l==null?void 0:l.keys)??[],n=()=>{r.trim()&&s.mutate({botId:t,name:r.trim(),scopes:["mcp:tool:call"]},{onSuccess:f=>{c(f.rawKey),d("")}})},h=()=>{p&&(navigator.clipboard.writeText(p),a(!0),setTimeout(()=>a(!1),2e3))},v=()=>{o&&i.mutate({botId:t,keyId:o.id},{onSuccess:()=>N(null)})};return e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"API Keys"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:58,columnNumber:7},this),p&&e.jsxDEV("div",{className:"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold text-status-success mb-1",children:"Key generated — copy now, it won't be shown again"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:64,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("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},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:68,columnNumber:13},this),e.jsxDEV("button",{onClick:h,className:"text-text-tertiary hover:text-text-primary shrink-0",title:"Copy to clipboard",children:m?e.jsxDEV(ee,{className:"w-3.5 h-3.5 text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:76,columnNumber:25},this):e.jsxDEV(se,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:76,columnNumber:81},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:71,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:67,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:63,columnNumber:9},this),g.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-3",children:"No API keys."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:83,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-1.5 mb-3",children:g.map(f=>e.jsxDEV("div",{className:"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV(ae,{className:"w-3 h-3 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:92,columnNumber:17},this),e.jsxDEV("span",{className:"text-text-primary font-mono",children:f.name},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:93,columnNumber:17},this),f.last_used_at&&e.jsxDEV("span",{className:"text-[10px] text-text-tertiary",children:["used ",e.jsxDEV(Z,{date:f.last_used_at},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:96,columnNumber:26},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:95,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:91,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>N(f),className:"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke key",children:e.jsxDEV(P,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:105,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:100,columnNumber:15},this)]},f.id,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:87,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:85,columnNumber:9},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("input",{type:"text",value:r,onChange:f=>d(f.target.value),placeholder:"Key name...",className:"input text-xs flex-1 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:113,columnNumber:9},this),e.jsxDEV("button",{onClick:n,disabled:!r.trim()||s.isPending,className:"btn-primary text-xs inline-flex items-center gap-1",children:[e.jsxDEV(te,{className:"w-3 h-3"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:125,columnNumber:11},this),s.isPending?"...":"Generate"]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:120,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:112,columnNumber:7},this),s.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:130,columnNumber:9},this),e.jsxDEV(y,{open:!!o,onClose:()=>N(null),onConfirm:v,title:"Revoke API Key",description:e.jsxDEV(e.Fragment,{children:["Revoke API key"," ",e.jsxDEV("span",{className:"font-medium text-text-primary font-mono",children:o==null?void 0:o.name},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:141,columnNumber:13},this),"? This bot will no longer be able to authenticate with this key."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:139,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:133,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:57,columnNumber:5},this)}function ce({bot:t}){const{data:l}=R(),s=Q(),i=W(),[r,d]=u.useState(""),[p,c]=u.useState("member"),m=(l==null?void 0:l.roles)??[],a=t.roles??[],o=u.useMemo(()=>{const n=new Set(a.map(h=>h.role));return m.filter(h=>!n.has(h))},[m,a]),N=()=>{r.trim()&&s.mutate({botId:t.id,role:r.trim(),type:p},{onSuccess:()=>{d(""),c("member")}})},g=n=>{i.mutate({botId:t.id,role:n})};return e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"Roles"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:183,columnNumber:7},this),a.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary mb-3",children:"No roles assigned."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:188,columnNumber:9},this):e.jsxDEV("div",{className:"flex flex-wrap gap-2 mb-3",children:a.map(n=>e.jsxDEV("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.jsxDEV(E,{role:n.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:196,columnNumber:15},this),e.jsxDEV("span",{className:"text-[9px] text-text-tertiary",children:n.type},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:197,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>g(n.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${n.role}`,children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:198,columnNumber:15},this)]},n.role,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:192,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:190,columnNumber:9},this),o.length>0&&e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:r,onChange:n=>d(n.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Select a role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:217,columnNumber:13},this),o.map(n=>e.jsxDEV("option",{value:n,children:n},n,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:219,columnNumber:15},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:212,columnNumber:11},this),e.jsxDEV("select",{value:p,onChange:n=>c(n.target.value),className:"select text-xs w-24",children:[e.jsxDEV("option",{value:"member",children:"member"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:227,columnNumber:13},this),e.jsxDEV("option",{value:"admin",children:"admin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:228,columnNumber:13},this),e.jsxDEV("option",{value:"superadmin",children:"superadmin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:229,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:222,columnNumber:11},this),e.jsxDEV("button",{onClick:N,disabled:!r||s.isPending,className:"btn-primary text-xs",children:s.isPending?"...":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:231,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:211,columnNumber:9},this),s.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:241,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:182,columnNumber:5},this)}function pe({bot:t}){return t?e.jsxDEV("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:t.display_name||t.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:261,columnNumber:9},this),t.description&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-0.5",children:t.description},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:263,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:260,columnNumber:7},this),e.jsxDEV(ue,{botId:t.id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:267,columnNumber:7},this),e.jsxDEV(ce,{bot:t},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:268,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:259,columnNumber:5},this):e.jsxDEV("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Select a bot to manage its API keys and roles."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:251,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotDetailPanel.tsx",lineNumber:250,columnNumber:7},this)}const be={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function Ne({embedded:t=!1}){const{pagination:l}=C({filters:{}}),s=X(),[i,r]=u.useState(!1),[d,p]=u.useState(null),[c,m]=u.useState(null),[a,o]=u.useState(null),{data:N,isLoading:g}=Y({limit:l.pageSize,offset:l.offset}),n=(N==null?void 0:N.total)??0,h=(N==null?void 0:N.bots)??[],v=u.useMemo(()=>c?h.find(x=>x.id===c.id)??c:null,[h,c]),f=[{key:"display_name",label:"Bot",render:x=>e.jsxDEV("div",{className:"flex items-center gap-2.5",children:[e.jsxDEV("span",{className:`w-2 h-2 rounded-full shrink-0 ${be[x.status]??"bg-status-pending"}`,title:x.status},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:51,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:x.display_name||x.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:56,columnNumber:13},this),x.description&&e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:x.description},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:60,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:55,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:50,columnNumber:9},this)},{key:"roles",label:"Roles",render:x=>e.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:(x.roles??[]).map(b=>e.jsxDEV(E,{role:b.role},b.role,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:72,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:70,columnNumber:9},this)},{key:"created_at",label:"Created",render:x=>e.jsxDEV(w,{date:x.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:80,columnNumber:24},this),className:"w-44"},{key:"actions",label:"",render:x=>e.jsxDEV(M,{children:[e.jsxDEV(D,{icon:_,title:"Edit bot",onClick:()=>p(x)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:88,columnNumber:11},this),e.jsxDEV(D,{icon:P,title:"Delete bot",onClick:()=>o(x),colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:93,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:87,columnNumber:9},this),className:"w-16 text-right"}],V=()=>{a&&s.mutate(a.id,{onSuccess:()=>{o(null),(c==null?void 0:c.id)===a.id&&m(null)}})};return e.jsxDEV("div",{children:[t?e.jsxDEV("div",{className:"flex justify-end mb-4",children:e.jsxDEV("button",{onClick:()=>r(!0),className:"btn-primary text-xs",children:"Add Bot"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:119,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:118,columnNumber:9},this):e.jsxDEV(S,{title:"Service Accounts",actions:e.jsxDEV("button",{onClick:()=>r(!0),className:"btn-primary text-xs",children:"Add Bot"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:127,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:124,columnNumber:9},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6",children:[e.jsxDEV("div",{className:"overflow-x-clip",children:[e.jsxDEV(U,{columns:f,data:h,keyFn:x=>x.id,isLoading:g,emptyMessage:"No bots yet",onRowClick:x=>m(x),activeRowKey:(v==null?void 0:v.id)??null},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:136,columnNumber:11},this),e.jsxDEV(k,{page:l.page,totalPages:l.totalPages(n),onPageChange:l.setPage,total:n,pageSize:l.pageSize,onPageSizeChange:l.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:146,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:135,columnNumber:9},this),e.jsxDEV(pe,{bot:v},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:156,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:134,columnNumber:7},this),e.jsxDEV(de,{open:i,onClose:()=>r(!1)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:159,columnNumber:7},this),e.jsxDEV(me,{open:!!d,onClose:()=>p(null),bot:d},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:161,columnNumber:7},this),e.jsxDEV(y,{open:!!a,onClose:()=>o(null),onConfirm:V,title:"Delete Bot",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:(a==null?void 0:a.display_name)||(a==null?void 0:a.external_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:175,columnNumber:13},this),"? This will also revoke all API keys. This action cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:173,columnNumber:11},this),isPending:s.isPending,error:s.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:167,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/bots/BotsPage.tsx",lineNumber:116,columnNumber:5},this)}function xe({user:t}){const{data:l}=R(),s=K(),i=I(),[r,d]=u.useState(""),[p,c]=u.useState("member"),m=(l==null?void 0:l.roles)??[],a=(t==null?void 0:t.roles)??[],o=u.useMemo(()=>{const n=new Set(a.map(h=>h.role));return m.filter(h=>!n.has(h))},[m,a]),N=()=>{!t||!r.trim()||s.mutate({userId:t.id,role:r.trim(),type:p},{onSuccess:()=>{d(""),c("member")}})},g=n=>{t&&i.mutate({userId:t.id,role:n})};return e.jsxDEV("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Role Membership"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:37,columnNumber:7},this),t?e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:t.display_name||t.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:48,columnNumber:13},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Member of:"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:49,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:47,columnNumber:11},this),a.length===0?e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"No roles assigned."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:53,columnNumber:13},this):e.jsxDEV("div",{className:"flex flex-wrap gap-2",children:a.map(n=>e.jsxDEV("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.jsxDEV(E,{role:n.role},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:61,columnNumber:19},this),e.jsxDEV("span",{className:"text-[9px] text-text-tertiary",children:n.type},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:62,columnNumber:19},this),e.jsxDEV("button",{onClick:()=>g(n.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${n.role}`,children:"×"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:63,columnNumber:19},this)]},n.role,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:57,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:55,columnNumber:13},this),o.length>0&&e.jsxDEV("div",{className:"pt-3 border-t border-surface-border",children:[e.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:77,columnNumber:15},this),e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("select",{value:r,onChange:n=>d(n.target.value),className:"select text-xs font-mono flex-1",children:[e.jsxDEV("option",{value:"",children:"Select a role..."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:86,columnNumber:19},this),o.map(n=>e.jsxDEV("option",{value:n,children:n},n,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:88,columnNumber:21},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:81,columnNumber:17},this),e.jsxDEV("select",{value:p,onChange:n=>c(n.target.value),className:"select text-xs w-24",children:[e.jsxDEV("option",{value:"member",children:"member"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:96,columnNumber:19},this),e.jsxDEV("option",{value:"admin",children:"admin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:97,columnNumber:19},this),e.jsxDEV("option",{value:"superadmin",children:"superadmin"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:98,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:91,columnNumber:17},this),e.jsxDEV("button",{onClick:N,disabled:!r||s.isPending,className:"btn-primary text-xs",children:s.isPending?"...":"Add"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:100,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:80,columnNumber:15},this),s.error&&e.jsxDEV("p",{className:"text-[10px] text-status-error mt-1",children:s.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:109,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:76,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:46,columnNumber:9},this):e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Select a user to manage their roles."},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:42,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/RolePanel.tsx",lineNumber:36,columnNumber:5},this)}function he({active:t,onChange:l}){const s=(i,r,d)=>e.jsxDEV("button",{onClick:()=>l(i),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${t===i?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[r,d]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:7,columnNumber:5},this);return e.jsxDEV("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[s("users",e.jsxDEV(ie,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:22,columnNumber:21},this),"User Accounts"),s("service-accounts",e.jsxDEV(re,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:23,columnNumber:32},this),"Service Accounts")]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/AccountTabToggle.tsx",lineNumber:21,columnNumber:5},this)}const fe=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}],ge={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function Fe(){const[t,l]=le(),i=t.get("tab")==="service-accounts"?"service-accounts":"users",r=d=>{l(d==="users"?{}:{tab:d})};return e.jsxDEV("div",{children:[e.jsxDEV(S,{title:"Accounts",actions:e.jsxDEV(he,{active:i,onChange:r},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:50,columnNumber:18},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:48,columnNumber:7},this),i==="users"?e.jsxDEV(ve,{},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:52,columnNumber:32},this):e.jsxDEV(Ne,{embedded:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:52,columnNumber:56},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:47,columnNumber:5},this)}function ve(){const{filters:t,setFilter:l,pagination:s}=C({filters:{status:""}}),i=F(),[r,d]=u.useState(!1),[p,c]=u.useState(null),[m,a]=u.useState(null),[o,N]=u.useState(null),{data:g,isLoading:n}=z({status:t.status||void 0,limit:s.pageSize,offset:s.offset}),h=(g==null?void 0:g.total)??0,v=(g==null?void 0:g.users)??[],f=u.useMemo(()=>m?v.find(b=>b.id===m.id)??m:null,[v,m]),V=[{key:"display_name",label:"User",render:b=>e.jsxDEV("div",{className:"flex items-center gap-2.5",children:[e.jsxDEV("span",{className:`w-2 h-2 rounded-full shrink-0 ${ge[b.status]??"bg-status-pending"}`,title:b.status},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:88,columnNumber:11},this),e.jsxDEV("div",{children:[e.jsxDEV("p",{className:"text-sm text-text-primary",children:b.display_name||b.external_id},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:93,columnNumber:13},this),b.email&&e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:b.email},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:97,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:92,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:87,columnNumber:9},this)},{key:"roles",label:"Roles",render:b=>e.jsxDEV("div",{className:"flex gap-1 flex-wrap",children:(b.roles??[]).map(B=>e.jsxDEV(E,{role:B.role},B.role,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:109,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:107,columnNumber:9},this)},{key:"created_at",label:"Created",render:b=>e.jsxDEV(w,{date:b.created_at},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:117,columnNumber:24},this),className:"w-44"},{key:"actions",label:"",render:b=>e.jsxDEV(M,{children:[e.jsxDEV(D,{icon:_,title:"Edit user",onClick:()=>c(b)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:125,columnNumber:11},this),e.jsxDEV(D,{icon:P,title:"Delete user",onClick:()=>N(b),colorClass:"text-text-tertiary hover:text-status-error"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:130,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:124,columnNumber:9},this),className:"w-16 text-right"}],x=()=>{o&&i.mutate(o.id,{onSuccess:()=>N(null)})};return e.jsxDEV("div",{children:[e.jsxDEV("div",{className:"flex justify-end mb-4",children:e.jsxDEV("button",{onClick:()=>d(!0),className:"btn-primary text-xs",children:"Add User"},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:152,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:151,columnNumber:7},this),e.jsxDEV($,{children:e.jsxDEV(O,{label:"Status",value:t.status,onChange:b=>l("status",b),options:fe},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:158,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:157,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxDEV("div",{className:"overflow-x-clip",children:[e.jsxDEV(U,{columns:V,data:v,keyFn:b=>b.id,isLoading:n,emptyMessage:"No users found",onRowClick:b=>a(b),activeRowKey:(f==null?void 0:f.id)??null},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:169,columnNumber:11},this),e.jsxDEV(k,{page:s.page,totalPages:s.totalPages(h),onPageChange:s.setPage,total:h,pageSize:s.pageSize,onPageSizeChange:s.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:179,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:168,columnNumber:9},this),e.jsxDEV(xe,{user:f},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:190,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:166,columnNumber:7},this),e.jsxDEV(oe,{open:r,onClose:()=>d(!1)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:193,columnNumber:7},this),e.jsxDEV(ne,{open:!!p,onClose:()=>c(null),user:p},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:195,columnNumber:7},this),e.jsxDEV(y,{open:!!o,onClose:()=>N(null),onConfirm:x,title:"Delete User",description:e.jsxDEV(e.Fragment,{children:["Delete"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:(o==null?void 0:o.display_name)||(o==null?void 0:o.external_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:209,columnNumber:13},this),"? This action cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:207,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:201,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/admin/users/UsersPage.tsx",lineNumber:150,columnNumber:5},this)}export{Fe as UsersPage};
2
+ //# sourceMappingURL=index-4IUoh_hd.js.map