@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":"index-DZHNte4o.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotDetailPanel.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/pages/admin/users/RolePanel.tsx","../../src/pages/admin/users/AccountTabToggle.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Bot\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: ['mcp:tool:call'] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-[10px] font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {k.last_used_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs flex-1 font-mono\"\n />\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n {createKey.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\nexport function BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a bot to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useBots, useDeleteBot } from '../../../api/bots';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport type { BotRecord } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\nimport { BotDetailPanel } from './BotDetailPanel';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n const { pagination } = useFilterParams({ filters: {} });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n\n const { data, isLoading } = useBots({\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Bot',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.description && (\n <p className=\"text-xs text-text-tertiary\">{row.description}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit bot\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete bot\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n }\n />\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6\">\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={bots}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No bots yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <BotDetailPanel bot={activeBot} />\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Bot\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useRoles } from '../../../api/roles';\nimport { useAddUserRole, useRemoveUserRole } from '../../../api/users';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { RolePill } from '../../../components/common/display/RolePill';\n\nexport function RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n addRole.mutate(\n { userId: user.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Member of:</p>\n </div>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Role\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { User, Bot } from 'lucide-react';\n\nexport type AccountTab = 'users' | 'service-accounts';\n\nexport function AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n const btn = (tab: AccountTab, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(tab)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n active === tab\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('users', <User className=\"w-3.5 h-3.5\" />, 'User Accounts')}\n {btn('service-accounts', <Bot className=\"w-3.5 h-3.5\" />, 'Service Accounts')}\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useUsers, useDeleteUser } from '../../../api/users';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\nimport { RolePanel } from './RolePanel';\nimport { AccountTabToggle, type AccountTab } from './AccountTabToggle';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function UsersPage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = tabParam === 'service-accounts' ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n actions={<AccountTabToggle active={activeTab} onChange={handleTabChange} />}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\nfunction UserAccountsPanel() {\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.email && (\n <p className=\"text-xs text-text-tertiary\">{row.email}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n {/* Left — users table */}\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <RolePanel user={activeUser} />\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsxDEV","Modal","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","ApiKeysSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","TimeAgo","Trash2","Plus","ConfirmDeleteModal","Fragment","RolesSection","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotDetailPanel","statusDot","BotsPage","embedded","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","isLoading","useBots","total","bots","activeBot","b","columns","row","TimestampCell","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","DataTable","StickyPagination","RolePanel","useAddUserRole","useRemoveUserRole","AccountTabToggle","active","onChange","btn","tab","icon","label","User","Bot","statusOptions","UsersPage","searchParams","setSearchParams","useSearchParams","activeTab","handleTabChange","UserAccountsPanel","filters","setFilter","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","u","FilterBar","FilterSelect","v"],"mappings":"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"}
1
+ {"version":3,"file":"index-4IUoh_hd.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotDetailPanel.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/pages/admin/users/RolePanel.tsx","../../src/pages/admin/users/AccountTabToggle.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Bot\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: ['mcp:tool:call'] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-[10px] font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {k.last_used_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs flex-1 font-mono\"\n />\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n {createKey.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\nexport function BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a bot to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useBots, useDeleteBot } from '../../../api/bots';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport type { BotRecord } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\nimport { BotDetailPanel } from './BotDetailPanel';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n const { pagination } = useFilterParams({ filters: {} });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n\n const { data, isLoading } = useBots({\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Bot',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.description && (\n <p className=\"text-xs text-text-tertiary\">{row.description}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit bot\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete bot\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n }\n />\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6\">\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={bots}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No bots yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <BotDetailPanel bot={activeBot} />\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Bot\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useRoles } from '../../../api/roles';\nimport { useAddUserRole, useRemoveUserRole } from '../../../api/users';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { RolePill } from '../../../components/common/display/RolePill';\n\nexport function RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n addRole.mutate(\n { userId: user.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Member of:</p>\n </div>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n &times;\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Role\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { User, Bot } from 'lucide-react';\n\nexport type AccountTab = 'users' | 'service-accounts';\n\nexport function AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n const btn = (tab: AccountTab, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(tab)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n active === tab\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('users', <User className=\"w-3.5 h-3.5\" />, 'User Accounts')}\n {btn('service-accounts', <Bot className=\"w-3.5 h-3.5\" />, 'Service Accounts')}\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useUsers, useDeleteUser } from '../../../api/users';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\nimport { RolePanel } from './RolePanel';\nimport { AccountTabToggle, type AccountTab } from './AccountTabToggle';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function UsersPage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = tabParam === 'service-accounts' ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n actions={<AccountTabToggle active={activeTab} onChange={handleTabChange} />}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\nfunction UserAccountsPanel() {\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.email && (\n <p className=\"text-xs text-text-tertiary\">{row.email}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n {/* Left — users table */}\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <RolePanel user={activeUser} />\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsxDEV","Modal","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","ApiKeysSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","TimeAgo","Trash2","Plus","ConfirmDeleteModal","Fragment","RolesSection","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotDetailPanel","statusDot","BotsPage","embedded","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","isLoading","useBots","total","bots","activeBot","b","columns","row","TimestampCell","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","DataTable","StickyPagination","RolePanel","useAddUserRole","useRemoveUserRole","AccountTabToggle","active","onChange","btn","tab","icon","label","User","Bot","statusOptions","UsersPage","searchParams","setSearchParams","useSearchParams","activeTab","handleTabChange","UserAccountsPanel","filters","setFilter","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","u","FilterBar","FilterSelect","v"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{b as j,j as e}from"./index-puKKZ5l8.js";import{u as $,c as T,a as m}from"./vendor-query-DLp59M9_.js";import{P as q}from"./PageHeader-CZ9a8cpr.js";import{F as A,a as G}from"./FilterBar-DbVbCzH2.js";import{L as H}from"./ListToolbar-0XNuXj0M.js";import{E as K}from"./EmptyState-Dep92Wkg.js";import{F as X,k as B,D as U,H as J,i as Q,al as Y,am as Z,an as ee,ao as se,ap as ae,X as ie,aq as re,_ as te,ar as le,l as ne,j as oe}from"./vendor-icons-CWl44VA6.js";import{T as M}from"./TimeAgo-B5LXB2aj.js";import{f as me}from"./vendor-react-Co3Y8ikm.js";function ce(s,r=100,t){const a=new URLSearchParams;s&&a.set("prefix",s),a.set("pageSize",String(r)),t&&a.set("continuationToken",t);const l=a.toString();return $({queryKey:["fileBrowse",s,r,t],queryFn:()=>j(`/file-browser/browse?${l}`)})}function ue(s){return $({queryKey:["fileMetadata",s],queryFn:()=>j(`/file-browser/metadata/${s}`),enabled:!!s})}function de(){return T({mutationFn:s=>j("/file-browser/signed-url",{method:"POST",body:JSON.stringify(s)})})}function pe(){return T({mutationFn:s=>j(`/file-browser/delete/${s}`,{method:"DELETE"})})}function be(s){return`/api/files/${s.replace(/^\/+/,"")}`}function fe({prefix:s,onNavigate:r}){const t=s?s.replace(/\/+$/,"").split("/").filter(Boolean):[];return e.jsxDEV("nav",{className:"flex items-center gap-1 text-sm mb-6 min-h-[28px]",children:[e.jsxDEV("button",{onClick:()=>r(""),className:`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${t.length===0?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:[e.jsxDEV(X,{className:"w-4 h-4 text-accent/75",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:21,columnNumber:9},this),e.jsxDEV("span",{children:"Files"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:13,columnNumber:7},this),t.map((a,l)=>{const i=l===t.length-1,c=t.slice(0,l+1).join("/")+"/";return e.jsxDEV("span",{className:"flex items-center gap-1",children:[e.jsxDEV(B,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:30,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>r(c),className:`px-1.5 py-0.5 rounded transition-colors ${i?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:a},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:31,columnNumber:13},this)]},c,!0,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:29,columnNumber:11},this)})]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:12,columnNumber:5},this)}function he(s){return s<1024?`${s} B`:s<1024*1024?`${(s/1024).toFixed(1)} KB`:s<1024*1024*1024?`${(s/(1024*1024)).toFixed(1)} MB`:`${(s/(1024*1024*1024)).toFixed(1)} GB`}function F(s){return s.split("/").pop()||s}function L({label:s,value:r,mono:t,children:a}){return e.jsxDEV("div",{children:[e.jsxDEV("dt",{className:"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:31,columnNumber:7},this),e.jsxDEV("dd",{className:`text-sm text-text-secondary ${t?"font-mono text-xs break-all":""}`,children:a||r},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:32,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:30,columnNumber:5},this)}function Ne({url:s}){const[r,t]=m.useState(null),[a,l]=m.useState(!1);return r===null&&!a&&fetch(s).then(i=>{if(!i.ok)throw new Error;return i.text()}).then(i=>t(i.slice(0,1e5))).catch(()=>l(!0)),a?e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Could not load preview"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:53,columnNumber:21},this):r===null?e.jsxDEV("div",{className:"animate-pulse h-32 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:55,columnNumber:12},this):e.jsxDEV("pre",{className:"font-mono text-xs text-text-secondary bg-surface-sunken rounded-md p-3 overflow-x-auto max-h-[400px] overflow-y-auto whitespace-pre-wrap break-words",children:r},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:59,columnNumber:5},this)}function xe({metadata:s}){const[r,t]=m.useState(null);async function a(l,i){await navigator.clipboard.writeText(l),t(i),setTimeout(()=>t(null),2e3)}return e.jsxDEV("div",{className:"space-y-3",children:[e.jsxDEV("div",{children:[e.jsxDEV("dt",{className:"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5",children:"Path"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:79,columnNumber:9},this),e.jsxDEV("dd",{onClick:()=>a(s.path,"path"),className:"group flex items-center gap-1.5 text-xs font-mono text-text-secondary break-all cursor-pointer hover:text-text-primary transition-colors",title:"Click to copy",children:[e.jsxDEV("span",{className:"flex-1",children:s.path},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:85,columnNumber:11},this),r==="path"?e.jsxDEV(U,{className:"w-3.5 h-3.5 text-status-success shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:87,columnNumber:15},this):e.jsxDEV(J,{className:"w-3.5 h-3.5 opacity-0 group-hover:opacity-100 text-text-tertiary shrink-0 transition-opacity"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:88,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:80,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:78,columnNumber:7},this),e.jsxDEV(L,{label:"Type",value:s.content_type},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:91,columnNumber:7},this),e.jsxDEV(L,{label:"Size",value:he(s.size)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:92,columnNumber:7},this),e.jsxDEV(L,{label:"Modified",children:e.jsxDEV(M,{date:s.modified_at},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:94,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:93,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:77,columnNumber:5},this)}async function ge(s,r){const a=await(await fetch(s)).blob(),l=URL.createObjectURL(a),i=document.createElement("a");i.href=l,i.download=r,i.style.display="none",document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(l)}function ve(s){return s<1024?`${s} B`:s<1024*1024?`${(s/1024).toFixed(1)} KB`:s<1024*1024*1024?`${(s/(1024*1024)).toFixed(1)} MB`:`${(s/(1024*1024*1024)).toFixed(1)} GB`}function we(s){var t;const r=((t=s.split(".").pop())==null?void 0:t.toLowerCase())||"";return["png","jpg","jpeg","gif","svg","webp"].includes(r)?e.jsxDEV(Y,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:22,columnNumber:12},this):["json"].includes(r)?e.jsxDEV(Z,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:25,columnNumber:12},this):["csv","xlsx","xls"].includes(r)?e.jsxDEV(ee,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:28,columnNumber:12},this):["txt","md","html","xml","yaml","yml","css","js","ts"].includes(r)?e.jsxDEV(se,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:31,columnNumber:12},this):e.jsxDEV(ae,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:33,columnNumber:10},this)}function Fe(s){var t;const r=((t=s.split(".").pop())==null?void 0:t.toLowerCase())||"";return["png","jpg","jpeg","gif","svg","webp"].includes(r)}function Pe(s){const r=s.replace(/\/+$/,"");return r.split("/").pop()||r}function Ve(s){return s.split("/").pop()||s}function Ee({directories:s,files:r,onNavigate:t,onSelect:a,selectedFile:l}){return e.jsxDEV("table",{className:"w-full mt-2",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary",children:[e.jsxDEV("th",{className:"pb-2 pl-2 font-medium",children:"Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:63,columnNumber:11},this),e.jsxDEV("th",{className:"pb-2 font-medium w-24 text-right",children:"Size"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:64,columnNumber:11},this),e.jsxDEV("th",{className:"pb-2 pr-2 font-medium w-40 text-right",children:"Modified"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:65,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:62,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:61,columnNumber:7},this),e.jsxDEV("tbody",{children:[s.map(i=>e.jsxDEV("tr",{onClick:()=>t(i),className:"row-hover cursor-pointer group",children:[e.jsxDEV("td",{className:"py-2 pl-2",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[e.jsxDEV(Q,{className:"w-4 h-4 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:77,columnNumber:17},this),e.jsxDEV("span",{className:"text-sm text-text-primary group-hover:text-accent transition-colors",children:Pe(i)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:78,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:76,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:75,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:83,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:84,columnNumber:13},this)]},i,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:70,columnNumber:11},this)),r.map(i=>e.jsxDEV("tr",{onClick:()=>a(i.path),className:`row-hover cursor-pointer group ${l===i.path?"bg-surface-hover":""}`,children:[e.jsxDEV("td",{className:"py-2 pl-2",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[we(i.path),e.jsxDEV("span",{className:"text-sm text-text-primary truncate",children:Ve(i.path)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:98,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:96,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:95,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-secondary tabular-nums",children:ve(i.size)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:103,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-secondary",children:e.jsxDEV(M,{date:i.modified_at},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:107,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:106,columnNumber:13},this)]},i.path,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:88,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:68,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:60,columnNumber:5},this)}const je=[{label:"1 hour",value:3600},{label:"6 hours",value:21600},{label:"24 hours",value:86400},{label:"7 days",value:604800},{label:"30 days",value:2592e3}];function De({filePath:s,onClose:r,onDeleted:t}){var w,g;const{data:a,isLoading:l}=ue(s),i=de(),c=pe(),[v,f]=m.useState(!1),[N,P]=m.useState(!1),[x,d]=m.useState(!1),p=be(s),h=((w=a==null?void 0:a.content_type)==null?void 0:w.startsWith("image/"))||Fe(s),V=((g=a==null?void 0:a.content_type)==null?void 0:g.startsWith("text/"))||(a==null?void 0:a.content_type)==="application/json",u=(a==null?void 0:a.content_type)==="application/pdf";async function D(){try{const o=await i.mutateAsync({path:s,expiresIn:3600}),b=o.url.startsWith("http")?o.url:`${window.location.origin}${o.url}`;ge(b,F(s))}catch{}}async function y(o){f(!1);try{const b=await i.mutateAsync({path:s,expiresIn:o}),E=b.url.startsWith("http")?b.url:`${window.location.origin}${b.url}`;await navigator.clipboard.writeText(E),P(!0),setTimeout(()=>P(!1),2e3)}catch{}}return e.jsxDEV(e.Fragment,{children:e.jsxDEV("div",{className:"w-[380px] shrink-0 border-l border-surface-border bg-surface overflow-y-auto",children:[e.jsxDEV("div",{className:"sticky top-0 bg-surface z-10 px-5 pt-5 pb-3 border-b border-surface-border",children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-3",children:[e.jsxDEV("h3",{className:"text-sm font-medium text-text-primary truncate pr-2",title:F(s),children:F(s)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:77,columnNumber:13},this),e.jsxDEV("button",{onClick:r,className:"text-text-tertiary hover:text-text-primary shrink-0",children:e.jsxDEV(ie,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:81,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:80,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:76,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-center gap-1 flex-wrap",children:[e.jsxDEV("button",{onClick:D,className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Download",children:[e.jsxDEV(re,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:92,columnNumber:15},this),e.jsxDEV("span",{children:"Download"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:93,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:87,columnNumber:13},this),e.jsxDEV("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Open in new tab",children:[e.jsxDEV(te,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:103,columnNumber:15},this),e.jsxDEV("span",{children:"Open"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:104,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:96,columnNumber:13},this),e.jsxDEV("div",{className:"relative",children:[e.jsxDEV("button",{onClick:()=>f(o=>!o),className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Share with signed URL",children:[N?e.jsxDEV(U,{className:"w-3.5 h-3.5 text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:113,columnNumber:27},this):e.jsxDEV(le,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:113,columnNumber:83},this),e.jsxDEV("span",{children:N?"Copied":"Share"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:114,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:108,columnNumber:15},this),v&&e.jsxDEV("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg py-1 z-20 min-w-[120px]",children:je.map(o=>e.jsxDEV("button",{onClick:()=>y(o.value),className:"w-full text-left px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover hover:text-text-primary transition-colors",children:o.label},o.value,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:119,columnNumber:21},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:117,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:107,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>d(!0),className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs text-status-error/70 hover:text-status-error",title:"Delete file",children:[e.jsxDEV(ne,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:136,columnNumber:15},this),e.jsxDEV("span",{children:"Delete"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:137,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:131,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:86,columnNumber:11},this),x&&e.jsxDEV("div",{className:"mt-3 p-3 bg-status-error/5 border border-status-error/20 rounded-md",children:[e.jsxDEV("p",{className:"text-xs text-text-primary mb-2",children:["Permanently delete ",e.jsxDEV("span",{className:"font-medium",children:F(s)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:145,columnNumber:36},this),"? This cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:144,columnNumber:15},this),e.jsxDEV("div",{className:"flex gap-2",children:[e.jsxDEV("button",{onClick:()=>d(!1),className:"btn-secondary text-xs",disabled:c.isPending,children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:148,columnNumber:17},this),e.jsxDEV("button",{onClick:async()=>{try{await c.mutateAsync(s),d(!1),t==null||t()}catch{}},className:"btn-primary text-xs !bg-status-error hover:!bg-status-error/90",disabled:c.isPending,children:c.isPending?"Deleting...":"Delete"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:155,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:147,columnNumber:15},this),c.isError&&e.jsxDEV("p",{className:"text-xs text-status-error mt-2",children:c.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:172,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:143,columnNumber:13},this),i.isError&&e.jsxDEV("p",{className:"text-xs text-status-error mt-2",children:i.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:178,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:75,columnNumber:9},this),e.jsxDEV("div",{className:"p-5",children:l?e.jsxDEV("div",{className:"animate-pulse space-y-3",children:[e.jsxDEV("div",{className:"h-48 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:186,columnNumber:15},this),e.jsxDEV("div",{className:"h-4 bg-surface-sunken rounded w-2/3"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:187,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:185,columnNumber:13},this):e.jsxDEV(e.Fragment,{children:[h&&e.jsxDEV("div",{className:"mb-5 rounded-md border border-surface-border bg-surface-sunken overflow-hidden",style:{maxHeight:"400px"},children:e.jsxDEV("img",{src:p,alt:F(s),className:"w-full object-cover object-top",style:{maxHeight:"400px"}},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:196,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:192,columnNumber:17},this),V&&e.jsxDEV("div",{className:"mb-5",children:e.jsxDEV(Ne,{url:p},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:207,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:206,columnNumber:17},this),u&&e.jsxDEV("div",{className:"mb-5 p-4 bg-surface-sunken rounded-md text-center",children:e.jsxDEV("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:text-accent-hover text-sm font-medium",children:"Open PDF in new tab"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:213,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:212,columnNumber:17},this),a&&e.jsxDEV(xe,{metadata:a},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:225,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:190,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:183,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:73,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:69,columnNumber:5},this)}const ye=[25,50,100,200];function Re(){const[s,r]=me(),t=s.get("prefix")||"",[a,l]=m.useState(""),[i,c]=m.useState(""),[v,f]=m.useState(null),[N,P]=m.useState(100),[x,d]=m.useState([]),[p,h]=m.useState();m.useEffect(()=>{const n=setTimeout(()=>{c(a),h(void 0),d([])},300);return()=>clearTimeout(n)},[a]);const V=i?`${t}${i}`:t,{data:u,isLoading:D,isFetching:y,refetch:w}=ce(V,N,p),g=(u==null?void 0:u.directories)??[],o=(u==null?void 0:u.files)??[],b=u==null?void 0:u.nextToken,E=m.useCallback(n=>{l(""),c(""),f(null),h(void 0),d([]),r(n?{prefix:n}:{})},[r]);function R(){b&&(d(n=>[...n,p||""]),h(b))}function _(){if(x.length===0)return;const n=[...x],S=n.pop();d(n),h(S||void 0)}function I(n){P(n),h(void 0),d([])}const W=g.length===0&&o.length===0,z=x.length+1,k=!!b,C=x.length>0,O=`/file-browser/browse?prefix=${encodeURIComponent(V)}&pageSize=${N}${p?`&continuationToken=${encodeURIComponent(p)}`:""}`;return e.jsxDEV("div",{className:"flex gap-0",children:[e.jsxDEV("div",{className:"flex-1 min-w-0 overflow-hidden",children:[e.jsxDEV(q,{title:"Files"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:92,columnNumber:9},this),e.jsxDEV(fe,{prefix:t,onNavigate:E},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:94,columnNumber:9},this),e.jsxDEV(A,{actions:e.jsxDEV(H,{onRefresh:()=>w(),isFetching:y,apiPath:O},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:97,columnNumber:11},this),children:e.jsxDEV(G,{label:"Search",value:a,onChange:l,placeholder:"Filter by prefix..."},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:103,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:96,columnNumber:9},this),D?e.jsxDEV("div",{className:"animate-pulse space-y-2 mt-4",children:Array.from({length:6}).map((n,S)=>e.jsxDEV("div",{className:"h-10 bg-surface-sunken rounded"},S,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:114,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:112,columnNumber:11},this):W?e.jsxDEV(K,{title:a?"No matching files":"This directory is empty"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:118,columnNumber:11},this):e.jsxDEV(Ee,{directories:g,files:o,onNavigate:E,onSelect:f,selectedFile:v},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:120,columnNumber:11},this),(C||k||o.length>0)&&e.jsxDEV("div",{className:"flex items-center justify-between pt-4 pb-2",children:[e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:["Page ",z," · ",o.length+g.length," items"]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:133,columnNumber:15},this),e.jsxDEV("select",{value:N,onChange:n=>I(parseInt(n.target.value)),className:"select text-xs py-1",children:ye.map(n=>e.jsxDEV("option",{value:n,children:[n," / page"]},n,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:142,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:136,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:132,columnNumber:13},this),(C||k)&&e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("button",{onClick:_,disabled:!C,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1",children:[e.jsxDEV(oe,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:153,columnNumber:19},this),"Previous"]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:148,columnNumber:17},this),e.jsxDEV("button",{onClick:R,disabled:!k,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1",children:["Next",e.jsxDEV(B,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:162,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:156,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:147,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:131,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:91,columnNumber:7},this),v&&e.jsxDEV(De,{filePath:v,onClose:()=>f(null),onDeleted:()=>{f(null),w()}},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:172,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:89,columnNumber:5},this)}export{Re as FilesPage};
2
- //# sourceMappingURL=index-BIeYV5QK.js.map
1
+ import{b as j,j as e}from"./index-sNrqYt0Q.js";import{u as $,c as T,a as m}from"./vendor-query-DLp59M9_.js";import{P as q}from"./PageHeader-FJIemmrC.js";import{F as A,a as G}from"./FilterBar-BQNzsd3A.js";import{L as H}from"./ListToolbar-OWOn-HiC.js";import{E as K}from"./EmptyState-BygtU-Rh.js";import{F as X,k as B,D as U,H as J,i as Q,al as Y,am as Z,an as ee,ao as se,ap as ae,X as ie,aq as re,_ as te,ar as le,l as ne,j as oe}from"./vendor-icons-CWl44VA6.js";import{T as M}from"./TimeAgo-DJZq-e4R.js";import{f as me}from"./vendor-react-Co3Y8ikm.js";function ce(s,r=100,t){const a=new URLSearchParams;s&&a.set("prefix",s),a.set("pageSize",String(r)),t&&a.set("continuationToken",t);const l=a.toString();return $({queryKey:["fileBrowse",s,r,t],queryFn:()=>j(`/file-browser/browse?${l}`)})}function ue(s){return $({queryKey:["fileMetadata",s],queryFn:()=>j(`/file-browser/metadata/${s}`),enabled:!!s})}function de(){return T({mutationFn:s=>j("/file-browser/signed-url",{method:"POST",body:JSON.stringify(s)})})}function pe(){return T({mutationFn:s=>j(`/file-browser/delete/${s}`,{method:"DELETE"})})}function be(s){return`/api/files/${s.replace(/^\/+/,"")}`}function fe({prefix:s,onNavigate:r}){const t=s?s.replace(/\/+$/,"").split("/").filter(Boolean):[];return e.jsxDEV("nav",{className:"flex items-center gap-1 text-sm mb-6 min-h-[28px]",children:[e.jsxDEV("button",{onClick:()=>r(""),className:`flex items-center gap-1.5 px-1.5 py-0.5 rounded transition-colors ${t.length===0?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:[e.jsxDEV(X,{className:"w-4 h-4 text-accent/75",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:21,columnNumber:9},this),e.jsxDEV("span",{children:"Files"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:22,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:13,columnNumber:7},this),t.map((a,l)=>{const i=l===t.length-1,c=t.slice(0,l+1).join("/")+"/";return e.jsxDEV("span",{className:"flex items-center gap-1",children:[e.jsxDEV(B,{className:"w-3.5 h-3.5 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:30,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>r(c),className:`px-1.5 py-0.5 rounded transition-colors ${i?"text-text-primary font-medium":"text-text-secondary hover:text-text-primary hover:bg-surface-hover"}`,children:a},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:31,columnNumber:13},this)]},c,!0,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:29,columnNumber:11},this)})]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileBreadcrumbs.tsx",lineNumber:12,columnNumber:5},this)}function he(s){return s<1024?`${s} B`:s<1024*1024?`${(s/1024).toFixed(1)} KB`:s<1024*1024*1024?`${(s/(1024*1024)).toFixed(1)} MB`:`${(s/(1024*1024*1024)).toFixed(1)} GB`}function F(s){return s.split("/").pop()||s}function L({label:s,value:r,mono:t,children:a}){return e.jsxDEV("div",{children:[e.jsxDEV("dt",{className:"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5",children:s},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:31,columnNumber:7},this),e.jsxDEV("dd",{className:`text-sm text-text-secondary ${t?"font-mono text-xs break-all":""}`,children:a||r},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:32,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:30,columnNumber:5},this)}function Ne({url:s}){const[r,t]=m.useState(null),[a,l]=m.useState(!1);return r===null&&!a&&fetch(s).then(i=>{if(!i.ok)throw new Error;return i.text()}).then(i=>t(i.slice(0,1e5))).catch(()=>l(!0)),a?e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:"Could not load preview"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:53,columnNumber:21},this):r===null?e.jsxDEV("div",{className:"animate-pulse h-32 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:55,columnNumber:12},this):e.jsxDEV("pre",{className:"font-mono text-xs text-text-secondary bg-surface-sunken rounded-md p-3 overflow-x-auto max-h-[400px] overflow-y-auto whitespace-pre-wrap break-words",children:r},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:59,columnNumber:5},this)}function xe({metadata:s}){const[r,t]=m.useState(null);async function a(l,i){await navigator.clipboard.writeText(l),t(i),setTimeout(()=>t(null),2e3)}return e.jsxDEV("div",{className:"space-y-3",children:[e.jsxDEV("div",{children:[e.jsxDEV("dt",{className:"text-[10px] uppercase tracking-wider text-text-tertiary mb-0.5",children:"Path"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:79,columnNumber:9},this),e.jsxDEV("dd",{onClick:()=>a(s.path,"path"),className:"group flex items-center gap-1.5 text-xs font-mono text-text-secondary break-all cursor-pointer hover:text-text-primary transition-colors",title:"Click to copy",children:[e.jsxDEV("span",{className:"flex-1",children:s.path},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:85,columnNumber:11},this),r==="path"?e.jsxDEV(U,{className:"w-3.5 h-3.5 text-status-success shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:87,columnNumber:15},this):e.jsxDEV(J,{className:"w-3.5 h-3.5 opacity-0 group-hover:opacity-100 text-text-tertiary shrink-0 transition-opacity"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:88,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:80,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:78,columnNumber:7},this),e.jsxDEV(L,{label:"Type",value:s.content_type},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:91,columnNumber:7},this),e.jsxDEV(L,{label:"Size",value:he(s.size)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:92,columnNumber:7},this),e.jsxDEV(L,{label:"Modified",children:e.jsxDEV(M,{date:s.modified_at},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:94,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:93,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewContent.tsx",lineNumber:77,columnNumber:5},this)}async function ge(s,r){const a=await(await fetch(s)).blob(),l=URL.createObjectURL(a),i=document.createElement("a");i.href=l,i.download=r,i.style.display="none",document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(l)}function ve(s){return s<1024?`${s} B`:s<1024*1024?`${(s/1024).toFixed(1)} KB`:s<1024*1024*1024?`${(s/(1024*1024)).toFixed(1)} MB`:`${(s/(1024*1024*1024)).toFixed(1)} GB`}function we(s){var t;const r=((t=s.split(".").pop())==null?void 0:t.toLowerCase())||"";return["png","jpg","jpeg","gif","svg","webp"].includes(r)?e.jsxDEV(Y,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:22,columnNumber:12},this):["json"].includes(r)?e.jsxDEV(Z,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:25,columnNumber:12},this):["csv","xlsx","xls"].includes(r)?e.jsxDEV(ee,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:28,columnNumber:12},this):["txt","md","html","xml","yaml","yml","css","js","ts"].includes(r)?e.jsxDEV(se,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:31,columnNumber:12},this):e.jsxDEV(ae,{className:"w-4 h-4 text-accent/60",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:33,columnNumber:10},this)}function Fe(s){var t;const r=((t=s.split(".").pop())==null?void 0:t.toLowerCase())||"";return["png","jpg","jpeg","gif","svg","webp"].includes(r)}function Pe(s){const r=s.replace(/\/+$/,"");return r.split("/").pop()||r}function Ve(s){return s.split("/").pop()||s}function Ee({directories:s,files:r,onNavigate:t,onSelect:a,selectedFile:l}){return e.jsxDEV("table",{className:"w-full mt-2",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"text-left text-[10px] uppercase tracking-wider text-text-tertiary",children:[e.jsxDEV("th",{className:"pb-2 pl-2 font-medium",children:"Name"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:63,columnNumber:11},this),e.jsxDEV("th",{className:"pb-2 font-medium w-24 text-right",children:"Size"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:64,columnNumber:11},this),e.jsxDEV("th",{className:"pb-2 pr-2 font-medium w-40 text-right",children:"Modified"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:65,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:62,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:61,columnNumber:7},this),e.jsxDEV("tbody",{children:[s.map(i=>e.jsxDEV("tr",{onClick:()=>t(i),className:"row-hover cursor-pointer group",children:[e.jsxDEV("td",{className:"py-2 pl-2",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[e.jsxDEV(Q,{className:"w-4 h-4 text-accent/75 shrink-0",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:77,columnNumber:17},this),e.jsxDEV("span",{className:"text-sm text-text-primary group-hover:text-accent transition-colors",children:Pe(i)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:78,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:76,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:75,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:83,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-tertiary",children:"—"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:84,columnNumber:13},this)]},i,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:70,columnNumber:11},this)),r.map(i=>e.jsxDEV("tr",{onClick:()=>a(i.path),className:`row-hover cursor-pointer group ${l===i.path?"bg-surface-hover":""}`,children:[e.jsxDEV("td",{className:"py-2 pl-2",children:e.jsxDEV("span",{className:"flex items-center gap-2.5",children:[we(i.path),e.jsxDEV("span",{className:"text-sm text-text-primary truncate",children:Ve(i.path)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:98,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:96,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:95,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 text-right text-xs text-text-secondary tabular-nums",children:ve(i.size)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:103,columnNumber:13},this),e.jsxDEV("td",{className:"py-2 pr-2 text-right text-xs text-text-secondary",children:e.jsxDEV(M,{date:i.modified_at},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:107,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:106,columnNumber:13},this)]},i.path,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:88,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:68,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FileListViews.tsx",lineNumber:60,columnNumber:5},this)}const je=[{label:"1 hour",value:3600},{label:"6 hours",value:21600},{label:"24 hours",value:86400},{label:"7 days",value:604800},{label:"30 days",value:2592e3}];function De({filePath:s,onClose:r,onDeleted:t}){var w,g;const{data:a,isLoading:l}=ue(s),i=de(),c=pe(),[v,f]=m.useState(!1),[N,P]=m.useState(!1),[x,d]=m.useState(!1),p=be(s),h=((w=a==null?void 0:a.content_type)==null?void 0:w.startsWith("image/"))||Fe(s),V=((g=a==null?void 0:a.content_type)==null?void 0:g.startsWith("text/"))||(a==null?void 0:a.content_type)==="application/json",u=(a==null?void 0:a.content_type)==="application/pdf";async function D(){try{const o=await i.mutateAsync({path:s,expiresIn:3600}),b=o.url.startsWith("http")?o.url:`${window.location.origin}${o.url}`;ge(b,F(s))}catch{}}async function y(o){f(!1);try{const b=await i.mutateAsync({path:s,expiresIn:o}),E=b.url.startsWith("http")?b.url:`${window.location.origin}${b.url}`;await navigator.clipboard.writeText(E),P(!0),setTimeout(()=>P(!1),2e3)}catch{}}return e.jsxDEV(e.Fragment,{children:e.jsxDEV("div",{className:"w-[380px] shrink-0 border-l border-surface-border bg-surface overflow-y-auto",children:[e.jsxDEV("div",{className:"sticky top-0 bg-surface z-10 px-5 pt-5 pb-3 border-b border-surface-border",children:[e.jsxDEV("div",{className:"flex items-center justify-between mb-3",children:[e.jsxDEV("h3",{className:"text-sm font-medium text-text-primary truncate pr-2",title:F(s),children:F(s)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:77,columnNumber:13},this),e.jsxDEV("button",{onClick:r,className:"text-text-tertiary hover:text-text-primary shrink-0",children:e.jsxDEV(ie,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:81,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:80,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:76,columnNumber:11},this),e.jsxDEV("div",{className:"flex items-center gap-1 flex-wrap",children:[e.jsxDEV("button",{onClick:D,className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Download",children:[e.jsxDEV(re,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:92,columnNumber:15},this),e.jsxDEV("span",{children:"Download"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:93,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:87,columnNumber:13},this),e.jsxDEV("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Open in new tab",children:[e.jsxDEV(te,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:103,columnNumber:15},this),e.jsxDEV("span",{children:"Open"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:104,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:96,columnNumber:13},this),e.jsxDEV("div",{className:"relative",children:[e.jsxDEV("button",{onClick:()=>f(o=>!o),className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs",title:"Share with signed URL",children:[N?e.jsxDEV(U,{className:"w-3.5 h-3.5 text-status-success"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:113,columnNumber:27},this):e.jsxDEV(le,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:113,columnNumber:83},this),e.jsxDEV("span",{children:N?"Copied":"Share"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:114,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:108,columnNumber:15},this),v&&e.jsxDEV("div",{className:"absolute top-full left-0 mt-1 bg-surface-raised border border-surface-border rounded-md shadow-lg py-1 z-20 min-w-[120px]",children:je.map(o=>e.jsxDEV("button",{onClick:()=>y(o.value),className:"w-full text-left px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover hover:text-text-primary transition-colors",children:o.label},o.value,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:119,columnNumber:21},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:117,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:107,columnNumber:13},this),e.jsxDEV("button",{onClick:()=>d(!0),className:"btn-ghost flex items-center gap-1.5 !px-2.5 !py-1.5 text-xs text-status-error/70 hover:text-status-error",title:"Delete file",children:[e.jsxDEV(ne,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:136,columnNumber:15},this),e.jsxDEV("span",{children:"Delete"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:137,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:131,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:86,columnNumber:11},this),x&&e.jsxDEV("div",{className:"mt-3 p-3 bg-status-error/5 border border-status-error/20 rounded-md",children:[e.jsxDEV("p",{className:"text-xs text-text-primary mb-2",children:["Permanently delete ",e.jsxDEV("span",{className:"font-medium",children:F(s)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:145,columnNumber:36},this),"? This cannot be undone."]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:144,columnNumber:15},this),e.jsxDEV("div",{className:"flex gap-2",children:[e.jsxDEV("button",{onClick:()=>d(!1),className:"btn-secondary text-xs",disabled:c.isPending,children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:148,columnNumber:17},this),e.jsxDEV("button",{onClick:async()=>{try{await c.mutateAsync(s),d(!1),t==null||t()}catch{}},className:"btn-primary text-xs !bg-status-error hover:!bg-status-error/90",disabled:c.isPending,children:c.isPending?"Deleting...":"Delete"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:155,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:147,columnNumber:15},this),c.isError&&e.jsxDEV("p",{className:"text-xs text-status-error mt-2",children:c.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:172,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:143,columnNumber:13},this),i.isError&&e.jsxDEV("p",{className:"text-xs text-status-error mt-2",children:i.error.message},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:178,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:75,columnNumber:9},this),e.jsxDEV("div",{className:"p-5",children:l?e.jsxDEV("div",{className:"animate-pulse space-y-3",children:[e.jsxDEV("div",{className:"h-48 bg-surface-sunken rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:186,columnNumber:15},this),e.jsxDEV("div",{className:"h-4 bg-surface-sunken rounded w-2/3"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:187,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:185,columnNumber:13},this):e.jsxDEV(e.Fragment,{children:[h&&e.jsxDEV("div",{className:"mb-5 rounded-md border border-surface-border bg-surface-sunken overflow-hidden",style:{maxHeight:"400px"},children:e.jsxDEV("img",{src:p,alt:F(s),className:"w-full object-cover object-top",style:{maxHeight:"400px"}},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:196,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:192,columnNumber:17},this),V&&e.jsxDEV("div",{className:"mb-5",children:e.jsxDEV(Ne,{url:p},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:207,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:206,columnNumber:17},this),u&&e.jsxDEV("div",{className:"mb-5 p-4 bg-surface-sunken rounded-md text-center",children:e.jsxDEV("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:text-accent-hover text-sm font-medium",children:"Open PDF in new tab"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:213,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:212,columnNumber:17},this),a&&e.jsxDEV(xe,{metadata:a},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:225,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:190,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:183,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:73,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilePreviewPanel.tsx",lineNumber:69,columnNumber:5},this)}const ye=[25,50,100,200];function Re(){const[s,r]=me(),t=s.get("prefix")||"",[a,l]=m.useState(""),[i,c]=m.useState(""),[v,f]=m.useState(null),[N,P]=m.useState(100),[x,d]=m.useState([]),[p,h]=m.useState();m.useEffect(()=>{const n=setTimeout(()=>{c(a),h(void 0),d([])},300);return()=>clearTimeout(n)},[a]);const V=i?`${t}${i}`:t,{data:u,isLoading:D,isFetching:y,refetch:w}=ce(V,N,p),g=(u==null?void 0:u.directories)??[],o=(u==null?void 0:u.files)??[],b=u==null?void 0:u.nextToken,E=m.useCallback(n=>{l(""),c(""),f(null),h(void 0),d([]),r(n?{prefix:n}:{})},[r]);function R(){b&&(d(n=>[...n,p||""]),h(b))}function _(){if(x.length===0)return;const n=[...x],S=n.pop();d(n),h(S||void 0)}function I(n){P(n),h(void 0),d([])}const W=g.length===0&&o.length===0,z=x.length+1,k=!!b,C=x.length>0,O=`/file-browser/browse?prefix=${encodeURIComponent(V)}&pageSize=${N}${p?`&continuationToken=${encodeURIComponent(p)}`:""}`;return e.jsxDEV("div",{className:"flex gap-0",children:[e.jsxDEV("div",{className:"flex-1 min-w-0 overflow-hidden",children:[e.jsxDEV(q,{title:"Files"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:92,columnNumber:9},this),e.jsxDEV(fe,{prefix:t,onNavigate:E},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:94,columnNumber:9},this),e.jsxDEV(A,{actions:e.jsxDEV(H,{onRefresh:()=>w(),isFetching:y,apiPath:O},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:97,columnNumber:11},this),children:e.jsxDEV(G,{label:"Search",value:a,onChange:l,placeholder:"Filter by prefix..."},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:103,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:96,columnNumber:9},this),D?e.jsxDEV("div",{className:"animate-pulse space-y-2 mt-4",children:Array.from({length:6}).map((n,S)=>e.jsxDEV("div",{className:"h-10 bg-surface-sunken rounded"},S,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:114,columnNumber:15},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:112,columnNumber:11},this):W?e.jsxDEV(K,{title:a?"No matching files":"This directory is empty"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:118,columnNumber:11},this):e.jsxDEV(Ee,{directories:g,files:o,onNavigate:E,onSelect:f,selectedFile:v},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:120,columnNumber:11},this),(C||k||o.length>0)&&e.jsxDEV("div",{className:"flex items-center justify-between pt-4 pb-2",children:[e.jsxDEV("div",{className:"flex items-center gap-4",children:[e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:["Page ",z," · ",o.length+g.length," items"]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:133,columnNumber:15},this),e.jsxDEV("select",{value:N,onChange:n=>I(parseInt(n.target.value)),className:"select text-xs py-1",children:ye.map(n=>e.jsxDEV("option",{value:n,children:[n," / page"]},n,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:142,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:136,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:132,columnNumber:13},this),(C||k)&&e.jsxDEV("div",{className:"flex items-center gap-1",children:[e.jsxDEV("button",{onClick:_,disabled:!C,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1",children:[e.jsxDEV(oe,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:153,columnNumber:19},this),"Previous"]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:148,columnNumber:17},this),e.jsxDEV("button",{onClick:R,disabled:!k,className:"btn-ghost text-xs disabled:opacity-30 disabled:cursor-not-allowed flex items-center gap-1",children:["Next",e.jsxDEV(B,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:162,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:156,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:147,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:131,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:91,columnNumber:7},this),v&&e.jsxDEV(De,{filePath:v,onClose:()=>f(null),onDeleted:()=>{f(null),w()}},void 0,!1,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:172,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/files/FilesPage.tsx",lineNumber:89,columnNumber:5},this)}export{Re as FilesPage};
2
+ //# sourceMappingURL=index-B2CqPzLK.js.map