@hotmeshio/long-tail 0.5.9 → 0.5.11

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 (193) hide show
  1. package/build/api/controlplane.d.ts +1 -0
  2. package/build/api/controlplane.js +1 -0
  3. package/build/api/diagnostics.d.ts +3 -1
  4. package/build/api/diagnostics.js +1 -1
  5. package/build/api/escalations/metadata.js +17 -1
  6. package/build/api/settings.d.ts +3 -2
  7. package/build/api/settings.js +11 -2
  8. package/build/modules/version.d.ts +16 -0
  9. package/build/modules/version.js +34 -0
  10. package/build/routes/controlplane.js +1 -0
  11. package/build/routes/diagnostics.js +18 -10
  12. package/build/services/controlplane/index.js +3 -2
  13. package/build/services/controlplane/stream-messages-sql.d.ts +4 -3
  14. package/build/services/controlplane/stream-messages-sql.js +12 -7
  15. package/build/services/controlplane/types.d.ts +2 -0
  16. package/build/services/diagnostics/index.d.ts +15 -3
  17. package/build/services/diagnostics/index.js +71 -32
  18. package/build/services/diagnostics/patterns.d.ts +13 -3
  19. package/build/services/diagnostics/patterns.js +25 -14
  20. package/build/services/escalation/crud.d.ts +10 -3
  21. package/build/services/escalation/crud.js +6 -1
  22. package/build/services/escalation/sql.d.ts +16 -6
  23. package/build/services/escalation/sql.js +21 -6
  24. package/build/system/mcp-servers/admin/diagnostics.d.ts +9 -3
  25. package/build/system/mcp-servers/admin/diagnostics.js +31 -21
  26. package/build/system/mcp-servers/admin/schemas.d.ts +9 -3
  27. package/build/system/mcp-servers/admin/schemas.js +5 -3
  28. package/build/tsconfig.tsbuildinfo +1 -1
  29. package/build/types/auth.d.ts +1 -1
  30. package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js → AdminDashboard-DZpduYdW.js} +2 -2
  31. package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js.map → AdminDashboard-DZpduYdW.js.map} +1 -1
  32. package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.js → AgentConfigPage-SFnHMIP6.js} +2 -2
  33. package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.js.map → AgentConfigPage-SFnHMIP6.js.map} +1 -1
  34. package/dashboard/dist/assets/{AgentDetailPage-bnXR1ezD.js → AgentDetailPage-C-2iSaDs.js} +2 -2
  35. package/dashboard/dist/assets/{AgentDetailPage-bnXR1ezD.js.map → AgentDetailPage-C-2iSaDs.js.map} +1 -1
  36. package/dashboard/dist/assets/{AgentsPage-tJIlrnfM.js → AgentsPage-C3FztFd_.js} +2 -2
  37. package/dashboard/dist/assets/{AgentsPage-tJIlrnfM.js.map → AgentsPage-C3FztFd_.js.map} +1 -1
  38. package/dashboard/dist/assets/{AvailableEscalationsPage-B7gEfcw3.js → AvailableEscalationsPage-DIqdBCwe.js} +2 -2
  39. package/dashboard/dist/assets/{AvailableEscalationsPage-B7gEfcw3.js.map → AvailableEscalationsPage-DIqdBCwe.js.map} +1 -1
  40. package/dashboard/dist/assets/{BotPicker-fFE4GAaO.js → BotPicker-Dse2jW4b.js} +2 -2
  41. package/dashboard/dist/assets/{BotPicker-fFE4GAaO.js.map → BotPicker-Dse2jW4b.js.map} +1 -1
  42. package/dashboard/dist/assets/{CapabilitiesPage-DotZ7iQc.js → CapabilitiesPage-DTfKCzBQ.js} +2 -2
  43. package/dashboard/dist/assets/{CapabilitiesPage-DotZ7iQc.js.map → CapabilitiesPage-DTfKCzBQ.js.map} +1 -1
  44. package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js → CollapsibleSection-8vf38J6K.js} +2 -2
  45. package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js.map → CollapsibleSection-8vf38J6K.js.map} +1 -1
  46. package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js → CredentialsPage-7C4M-hrH.js} +2 -2
  47. package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js.map → CredentialsPage-7C4M-hrH.js.map} +1 -1
  48. package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js → CronLabel-DrGWtaSY.js} +2 -2
  49. package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js.map → CronLabel-DrGWtaSY.js.map} +1 -1
  50. package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.js → CustomDurationPicker-Vcmr4LiR.js} +2 -2
  51. package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.js.map → CustomDurationPicker-Vcmr4LiR.js.map} +1 -1
  52. package/dashboard/dist/assets/{ElapsedCell-DF4m0cv_.js → ElapsedCell-BNexhR5d.js} +2 -2
  53. package/dashboard/dist/assets/{ElapsedCell-DF4m0cv_.js.map → ElapsedCell-BNexhR5d.js.map} +1 -1
  54. package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js → EscalationsOverview-BI3DEwYP.js} +2 -2
  55. package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js.map → EscalationsOverview-BI3DEwYP.js.map} +1 -1
  56. package/dashboard/dist/assets/EventTable-CwvX_L9t.js +2 -0
  57. package/dashboard/dist/assets/EventTable-CwvX_L9t.js.map +1 -0
  58. package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js → GraphInvokePage-C-3b8WK0.js} +2 -2
  59. package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js.map → GraphInvokePage-C-3b8WK0.js.map} +1 -1
  60. package/dashboard/dist/assets/{HomePage-DvYgvCcO.js → HomePage-BS_-jcHr.js} +2 -2
  61. package/dashboard/dist/assets/{HomePage-DvYgvCcO.js.map → HomePage-BS_-jcHr.js.map} +1 -1
  62. package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js → ListToolbar-BH9rwQVE.js} +2 -2
  63. package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js.map → ListToolbar-BH9rwQVE.js.map} +1 -1
  64. package/dashboard/dist/assets/{McpOverview-BClbGYb8.js → McpOverview-C9iOdE7E.js} +2 -2
  65. package/dashboard/dist/assets/{McpOverview-BClbGYb8.js.map → McpOverview-C9iOdE7E.js.map} +1 -1
  66. package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.js → McpQueryDetailPage-DMN-yqvJ.js} +3 -3
  67. package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.js.map → McpQueryDetailPage-DMN-yqvJ.js.map} +1 -1
  68. package/dashboard/dist/assets/{McpQueryPage-qtEuMDrd.js → McpQueryPage-Db1LUKVs.js} +2 -2
  69. package/dashboard/dist/assets/{McpQueryPage-qtEuMDrd.js.map → McpQueryPage-Db1LUKVs.js.map} +1 -1
  70. package/dashboard/dist/assets/McpRunDetailPage-Wb47sRvo.js +2 -0
  71. package/dashboard/dist/assets/{McpRunDetailPage-DRbIZMU2.js.map → McpRunDetailPage-Wb47sRvo.js.map} +1 -1
  72. package/dashboard/dist/assets/{McpRunsPage-CMfwXQ4R.js → McpRunsPage--tgT5uo7.js} +2 -2
  73. package/dashboard/dist/assets/{McpRunsPage-CMfwXQ4R.js.map → McpRunsPage--tgT5uo7.js.map} +1 -1
  74. package/dashboard/dist/assets/{OperatorDashboard-Dq2pfV68.js → OperatorDashboard-BWVUbJkZ.js} +2 -2
  75. package/dashboard/dist/assets/{OperatorDashboard-Dq2pfV68.js.map → OperatorDashboard-BWVUbJkZ.js.map} +1 -1
  76. package/dashboard/dist/assets/{ProcessDetailPage-DjQuNERz.js → ProcessDetailPage-CvPx-h8y.js} +2 -2
  77. package/dashboard/dist/assets/{ProcessDetailPage-DjQuNERz.js.map → ProcessDetailPage-CvPx-h8y.js.map} +1 -1
  78. package/dashboard/dist/assets/{ProcessesListPage-vJimii8-.js → ProcessesListPage-CWiRM_h3.js} +2 -2
  79. package/dashboard/dist/assets/{ProcessesListPage-vJimii8-.js.map → ProcessesListPage-CWiRM_h3.js.map} +1 -1
  80. package/dashboard/dist/assets/{RolesPage-CFCN_mRF.js → RolesPage-W5ZjOHpg.js} +2 -2
  81. package/dashboard/dist/assets/{RolesPage-CFCN_mRF.js.map → RolesPage-W5ZjOHpg.js.map} +1 -1
  82. package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js → RunAsSelector-CvxGTNGT.js} +2 -2
  83. package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js.map → RunAsSelector-CvxGTNGT.js.map} +1 -1
  84. package/dashboard/dist/assets/StreamMessageDetail-BF0tM0cd.js +2 -0
  85. package/dashboard/dist/assets/StreamMessageDetail-BF0tM0cd.js.map +1 -0
  86. package/dashboard/dist/assets/SwimlaneTimeline-Bv-KHY9s.js +2 -0
  87. package/dashboard/dist/assets/SwimlaneTimeline-Bv-KHY9s.js.map +1 -0
  88. package/dashboard/dist/assets/{TaskDetailPage-CgFN5uWn.js → TaskDetailPage-Bzb_fuLy.js} +2 -2
  89. package/dashboard/dist/assets/{TaskDetailPage-CgFN5uWn.js.map → TaskDetailPage-Bzb_fuLy.js.map} +1 -1
  90. package/dashboard/dist/assets/{TasksListPage-qj25rRZL.js → TasksListPage-CBezWaZL.js} +2 -2
  91. package/dashboard/dist/assets/{TasksListPage-qj25rRZL.js.map → TasksListPage-CBezWaZL.js.map} +1 -1
  92. package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js → TimeAgo-CKHfTzat.js} +2 -2
  93. package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js.map → TimeAgo-CKHfTzat.js.map} +1 -1
  94. package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.js → TimestampCell-Dsje8GH-.js} +2 -2
  95. package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.js.map → TimestampCell-Dsje8GH-.js.map} +1 -1
  96. package/dashboard/dist/assets/{ToolTestPanel-DYGlB-QW.js → ToolTestPanel-3OcG18e5.js} +2 -2
  97. package/dashboard/dist/assets/{ToolTestPanel-DYGlB-QW.js.map → ToolTestPanel-3OcG18e5.js.map} +1 -1
  98. package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js → TopicDetailPage-DCtv91hH.js} +2 -2
  99. package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js.map → TopicDetailPage-DCtv91hH.js.map} +1 -1
  100. package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js → TopicsPage-DVGSNc_E.js} +2 -2
  101. package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js.map → TopicsPage-DVGSNc_E.js.map} +1 -1
  102. package/dashboard/dist/assets/{UserName-CgUZyiwm.js → UserName-xHAgkk8M.js} +2 -2
  103. package/dashboard/dist/assets/{UserName-CgUZyiwm.js.map → UserName-xHAgkk8M.js.map} +1 -1
  104. package/dashboard/dist/assets/WorkflowExecutionPage-CWNxsS8a.js +2 -0
  105. package/dashboard/dist/assets/{WorkflowExecutionPage-CDr5CTM2.js.map → WorkflowExecutionPage-CWNxsS8a.js.map} +1 -1
  106. package/dashboard/dist/assets/{WorkflowsDashboard-tCBP0i0Y.js → WorkflowsDashboard-M13lIaw7.js} +2 -2
  107. package/dashboard/dist/assets/{WorkflowsDashboard-tCBP0i0Y.js.map → WorkflowsDashboard-M13lIaw7.js.map} +1 -1
  108. package/dashboard/dist/assets/{WorkflowsOverview-CaMeZwde.js → WorkflowsOverview-e7jWSj_n.js} +2 -2
  109. package/dashboard/dist/assets/{WorkflowsOverview-CaMeZwde.js.map → WorkflowsOverview-e7jWSj_n.js.map} +1 -1
  110. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js → YamlWorkflowDetailPage-CdAeam76.js} +2 -2
  111. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js.map → YamlWorkflowDetailPage-CdAeam76.js.map} +1 -1
  112. package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js → YamlWorkflowsPage-S_gKs2Di.js} +2 -2
  113. package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js.map → YamlWorkflowsPage-S_gKs2Di.js.map} +1 -1
  114. package/dashboard/dist/assets/{agents-HMkTc425.js → agents-JE4aL07D.js} +2 -2
  115. package/dashboard/dist/assets/{agents-HMkTc425.js.map → agents-JE4aL07D.js.map} +1 -1
  116. package/dashboard/dist/assets/{bots-CDe2jXNx.js → bots-cAzKkDtQ.js} +2 -2
  117. package/dashboard/dist/assets/{bots-CDe2jXNx.js.map → bots-cAzKkDtQ.js.map} +1 -1
  118. package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js → capabilities-RBFXLAXF.js} +2 -2
  119. package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js.map → capabilities-RBFXLAXF.js.map} +1 -1
  120. package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js → controlplane-DGhv3rwI.js} +2 -2
  121. package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js.map → controlplane-DGhv3rwI.js.map} +1 -1
  122. package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js → escalation-columns-DqTkKbCv.js} +2 -2
  123. package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js.map → escalation-columns-DqTkKbCv.js.map} +1 -1
  124. package/dashboard/dist/assets/{escalation-Djk5XKmX.js → escalation-ne7dIaPa.js} +2 -2
  125. package/dashboard/dist/assets/{escalation-Djk5XKmX.js.map → escalation-ne7dIaPa.js.map} +1 -1
  126. package/dashboard/dist/assets/{index-DRIJM1L-.js → index-BTqhAT6p.js} +2 -2
  127. package/dashboard/dist/assets/{index-DRIJM1L-.js.map → index-BTqhAT6p.js.map} +1 -1
  128. package/dashboard/dist/assets/{index-BW-fIquS.js → index-BbJuC9kg.js} +2 -2
  129. package/dashboard/dist/assets/{index-BW-fIquS.js.map → index-BbJuC9kg.js.map} +1 -1
  130. package/dashboard/dist/assets/{index-mEQ6kCnt.js → index-C2l4GcZ7.js} +2 -2
  131. package/dashboard/dist/assets/{index-mEQ6kCnt.js.map → index-C2l4GcZ7.js.map} +1 -1
  132. package/dashboard/dist/assets/{index-BYpWOUEe.js → index-CByjpYlU.js} +2 -2
  133. package/dashboard/dist/assets/{index-BYpWOUEe.js.map → index-CByjpYlU.js.map} +1 -1
  134. package/dashboard/dist/assets/{index-rUST2YsO.js → index-CEpw_Fh8.js} +2 -2
  135. package/dashboard/dist/assets/{index-rUST2YsO.js.map → index-CEpw_Fh8.js.map} +1 -1
  136. package/dashboard/dist/assets/{index-CPIYW81T.js → index-CQDn-bLr.js} +2 -2
  137. package/dashboard/dist/assets/{index-CPIYW81T.js.map → index-CQDn-bLr.js.map} +1 -1
  138. package/dashboard/dist/assets/{index-DBi9Q9Hw.js → index-CgyucK0e.js} +2 -2
  139. package/dashboard/dist/assets/{index-DBi9Q9Hw.js.map → index-CgyucK0e.js.map} +1 -1
  140. package/dashboard/dist/assets/index-ClvYSNZd.css +1 -0
  141. package/dashboard/dist/assets/{index-E2hQ8DIi.js → index-CucXk58o.js} +2 -2
  142. package/dashboard/dist/assets/{index-E2hQ8DIi.js.map → index-CucXk58o.js.map} +1 -1
  143. package/dashboard/dist/assets/{index-BFQ2t-p1.js → index-DPJW96d2.js} +21 -21
  144. package/dashboard/dist/assets/index-DPJW96d2.js.map +1 -0
  145. package/dashboard/dist/assets/index-DeZhNCf5.js +2 -0
  146. package/dashboard/dist/assets/index-DeZhNCf5.js.map +1 -0
  147. package/dashboard/dist/assets/{index-BNkpns_E.js → index-DgzgRTNg.js} +2 -2
  148. package/dashboard/dist/assets/{index-BNkpns_E.js.map → index-DgzgRTNg.js.map} +1 -1
  149. package/dashboard/dist/assets/{index-Cydgj_Co.js → index-Do8Xp3pa.js} +2 -2
  150. package/dashboard/dist/assets/{index-Cydgj_Co.js.map → index-Do8Xp3pa.js.map} +1 -1
  151. package/dashboard/dist/assets/{index-Dhy2PVAw.js → index-QxAYCJ1S.js} +2 -2
  152. package/dashboard/dist/assets/{index-Dhy2PVAw.js.map → index-QxAYCJ1S.js.map} +1 -1
  153. package/dashboard/dist/assets/{knowledge-jQE3dBVi.js → knowledge-DzRpsm3D.js} +2 -2
  154. package/dashboard/dist/assets/{knowledge-jQE3dBVi.js.map → knowledge-DzRpsm3D.js.map} +1 -1
  155. package/dashboard/dist/assets/{mcp-DtEGfZiz.js → mcp-B1lc6nL4.js} +2 -2
  156. package/dashboard/dist/assets/{mcp-DtEGfZiz.js.map → mcp-B1lc6nL4.js.map} +1 -1
  157. package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js → mcp-query-CXuweaN3.js} +2 -2
  158. package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js.map → mcp-query-CXuweaN3.js.map} +1 -1
  159. package/dashboard/dist/assets/{pipelines-ClNdzuUK.js → pipelines-D4VLWDvu.js} +2 -2
  160. package/dashboard/dist/assets/{pipelines-ClNdzuUK.js.map → pipelines-D4VLWDvu.js.map} +1 -1
  161. package/dashboard/dist/assets/{roles-BmHbRaPT.js → roles-CSpHRRu8.js} +2 -2
  162. package/dashboard/dist/assets/{roles-BmHbRaPT.js.map → roles-CSpHRRu8.js.map} +1 -1
  163. package/dashboard/dist/assets/{tasks-BPONxLcq.js → tasks-CWUsKhM4.js} +2 -2
  164. package/dashboard/dist/assets/{tasks-BPONxLcq.js.map → tasks-CWUsKhM4.js.map} +1 -1
  165. package/dashboard/dist/assets/{topics-XREPRxwo.js → topics-BXwstrzB.js} +2 -2
  166. package/dashboard/dist/assets/{topics-XREPRxwo.js.map → topics-BXwstrzB.js.map} +1 -1
  167. package/dashboard/dist/assets/{useEventHooks-M7SaEfel.js → useEventHooks-CjygrbYy.js} +2 -2
  168. package/dashboard/dist/assets/{useEventHooks-M7SaEfel.js.map → useEventHooks-CjygrbYy.js.map} +1 -1
  169. package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js → useNamespace-CsepDyR5.js} +2 -2
  170. package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js.map → useNamespace-CsepDyR5.js.map} +1 -1
  171. package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js → useYamlActivityEvents-gWIG6akB.js} +2 -2
  172. package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js.map → useYamlActivityEvents-gWIG6akB.js.map} +1 -1
  173. package/dashboard/dist/assets/{users-BpjSNhQe.js → users-DvhHbR0R.js} +2 -2
  174. package/dashboard/dist/assets/{users-BpjSNhQe.js.map → users-DvhHbR0R.js.map} +1 -1
  175. package/dashboard/dist/assets/{workflows-k4jE0ECC.js → workflows-C7Cam2Ok.js} +2 -2
  176. package/dashboard/dist/assets/{workflows-k4jE0ECC.js.map → workflows-C7Cam2Ok.js.map} +1 -1
  177. package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js → yaml-workflows-ChUOE22W.js} +2 -2
  178. package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js.map → yaml-workflows-ChUOE22W.js.map} +1 -1
  179. package/dashboard/dist/index.html +2 -2
  180. package/docs/api/mcp/admin.md +94 -1
  181. package/docs/hitl-guide.md +48 -0
  182. package/docs/mcp.md +102 -0
  183. package/package.json +1 -1
  184. package/dashboard/dist/assets/EventTable-DzrMH-ux.js +0 -2
  185. package/dashboard/dist/assets/EventTable-DzrMH-ux.js.map +0 -1
  186. package/dashboard/dist/assets/McpRunDetailPage-DRbIZMU2.js +0 -2
  187. package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js +0 -2
  188. package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js.map +0 -1
  189. package/dashboard/dist/assets/WorkflowExecutionPage-CDr5CTM2.js +0 -2
  190. package/dashboard/dist/assets/index-BFQ2t-p1.js.map +0 -1
  191. package/dashboard/dist/assets/index-DSki_Ub6.css +0 -1
  192. package/dashboard/dist/assets/index-u08vQUaw.js +0 -2
  193. package/dashboard/dist/assets/index-u08vQUaw.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AgentDetailPage-bnXR1ezD.js","sources":["../../src/pages/agents/AgentDetailPage.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Bot, Play, Pause, Trash2, ArrowRight, Pencil, BookOpen,\n Radio, Clock, Brain, Compass,\n} from 'lucide-react';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\nimport { useAgentSubscriptions } from '../../api/agent-subscriptions';\nimport { useAgentEvents } from '../../hooks/useEventHooks';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { EventTopicPill } from '../../components/common/display/EventTopicPill';\nimport { CronLabel } from '../../components/common/display/CronLabel';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction formatTime(iso: string): string {\n return new Date(iso).toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\nfunction SectionHeader({ icon: Icon, color, children, actions }: { icon: React.ElementType; color: string; children: React.ReactNode; actions?: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between mb-3 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"text-xs font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n </div>\n {actions}\n </div>\n );\n}\n\nfunction EmptyHint({ text }: { text: string }) {\n return <p className=\"text-[11px] text-text-quaternary py-2\">{text}</p>;\n}\n\n// ── Live feed ───────────────────────────────────────────────────────────────\n\ninterface FeedEvent { id: number; type: string; timestamp: string; label: string; }\nlet feedCounter = 0;\n\nfunction useAgentFeed(agentName?: string) {\n const [events, setEvents] = useState<FeedEvent[]>([]);\n const [pulse, setPulse] = useState(false);\n const handler = useCallback((event: any) => {\n if (event.type?.startsWith('mesh.')) return;\n const label = event.activityName || event.data?.domain || event.workflowId?.slice(0, 16) || '';\n setEvents((prev) => [{ id: ++feedCounter, type: event.type, timestamp: event.timestamp, label }, ...prev].slice(0, 10));\n setPulse(true);\n setTimeout(() => setPulse(false), 2000);\n }, []);\n useEventSubscription(\n agentName ? `${NATS_SUBJECT_PREFIX}.system.agent.${agentName}.>` : '',\n handler,\n );\n return { events, pulse };\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function AgentDetailPage() {\n const { id } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiEnabled = !!settings?.ai?.enabled;\n const label = aiEnabled ? 'Agent' : 'Automation';\n const { data: agent, isLoading } = useAgent(id ?? null);\n const { data: subsData } = useAgentSubscriptions(id ?? null);\n const updateMutation = useUpdateAgent();\n const deleteMutation = useDeleteAgent();\n const { events: liveEvents, pulse } = useAgentFeed(id);\n useAgentEvents();\n\n if (isLoading) {\n return <div className=\"animate-pulse space-y-4\"><div className=\"h-8 bg-surface-sunken rounded w-48\" /><div className=\"h-40 bg-surface-sunken rounded\" /></div>;\n }\n\n if (!agent) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Bot className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">{label} not found</h2>\n <button onClick={() => navigate('/agents')} className=\"text-sm text-accent hover:text-accent-hover transition-colors\">Back to {label.toLowerCase()}s</button>\n </div>\n );\n }\n\n const statusDot = agent.status === 'active' ? 'bg-emerald-400' : agent.status === 'paused' ? 'bg-amber-400' : agent.status === 'error' ? 'bg-red-400' : 'bg-zinc-500';\n const subs = subsData?.subscriptions ?? [];\n const statusLabel = agent.status === 'active' ? 'Active' : agent.status === 'paused' ? 'Paused' : agent.status === 'error' ? 'Error' : 'Inactive';\n const schedules = (agent.behaviors as any)?.schedules as any[] | undefined;\n const legacyCron = agent.behaviors?.cron;\n const schedCount = schedules?.length || (legacyCron ? 1 : 0);\n\n const handlePause = () => {\n const msg = [\n `Pause \"${agent.id}\"?`,\n '',\n 'This will:',\n subs.length > 0 ? `• Stop ${subs.length} event subscription${subs.length !== 1 ? 's' : ''}` : null,\n schedCount > 0 ? `• Stop ${schedCount} schedule${schedCount !== 1 ? 's' : ''}` : null,\n '',\n 'Knowledge and workflow history are preserved. You can reactivate anytime.',\n ].filter(Boolean).join('\\n');\n if (confirm(msg)) updateMutation.mutate({ id: agent.id, status: 'paused' as any });\n };\n\n const handleDelete = () => {\n const msg = [\n `Delete \"${agent.id}\"?`,\n '',\n 'This permanently removes:',\n '• The agent configuration',\n subs.length > 0 ? `• ${subs.length} event subscription${subs.length !== 1 ? 's' : ''}` : null,\n schedCount > 0 ? `• ${schedCount} schedule${schedCount !== 1 ? 's' : ''}` : null,\n '',\n 'Knowledge entries and workflow history are preserved.',\n ].filter(Boolean).join('\\n');\n if (confirm(msg)) deleteMutation.mutate(agent.id, { onSuccess: () => navigate('/agents') });\n };\n\n return (\n <div>\n {/* ── Hero ──────────────────────────────────────────────────────────── */}\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-3xl font-light text-text-primary\">{label}: {agent.id}</h1>\n <button onClick={() => { window.location.hash = '#docs:agents.md'; }} className=\"text-text-quaternary hover:text-accent transition-colors mt-1\" title=\"Docs\">\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1.5 mr-2\">\n <span className={`w-2 h-2 rounded-full ${statusDot}`} />\n <span className=\"text-xs text-text-secondary capitalize\">{statusLabel}</span>\n </div>\n <button onClick={() => navigate(`/agents/${agent.id}/edit`)} className=\"flex items-center gap-1.5 px-4 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Pencil className=\"w-3 h-3\" /> Edit\n </button>\n {agent.status !== 'active' && (\n <button onClick={() => updateMutation.mutate({ id: agent.id, status: 'active' as any })} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-emerald-400 hover:bg-emerald-600/10 transition-colors\">\n <Play className=\"w-3 h-3\" /> Activate\n </button>\n )}\n {agent.status === 'active' && (\n <button onClick={handlePause} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors\">\n <Pause className=\"w-3 h-3\" /> Pause\n </button>\n )}\n <button onClick={handleDelete} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors\">\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n </div>\n </div>\n\n {/* Description callout */}\n {agent.description && (\n <div className=\"border-l-2 border-accent/30 pl-4 py-1 mb-10\">\n <p className=\"text-[13px] text-text-secondary italic leading-relaxed\">{agent.description}</p>\n </div>\n )}\n\n {/* Motivation */}\n {(agent.goals || agent.rules) && (\n <div className=\"mb-10\">\n <SectionHeader icon={Compass} color=\"text-rose-400\">Motivation</SectionHeader>\n <div className=\"grid grid-cols-2 gap-x-14 bg-surface-sunken/20 rounded-lg px-5 py-4\">\n {agent.goals && (\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5\">Goals</p>\n <p className=\"text-[13px] text-text-primary leading-relaxed\">{agent.goals}</p>\n </div>\n )}\n {agent.rules && (\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5\">Rules</p>\n <p className=\"text-[13px] text-text-primary leading-relaxed\">{agent.rules}</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* ── 3-column grid ─────────────────────────────────────────────────── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-10\">\n\n {/* Col 1: Subscriptions */}\n <div>\n <SectionHeader icon={Radio} color=\"text-cyan-400\">\n Subscriptions ({subs.length})\n </SectionHeader>\n {subs.length === 0 ? (\n <EmptyHint text=\"No event subscriptions\" />\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {subs.map((sub: any) => (\n <div key={sub.id} className=\"flex items-center py-2\">\n <div className=\"flex-1 min-w-0\"><EventTopicPill topic={sub.topic} /></div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n <span className=\"text-text-quaternary text-[10px]\">→</span>\n <WorkflowPill\n type={sub.reaction_type === 'capability' ? sub.tool_name : sub.workflow_type || sub.reaction_type}\n variant={sub.reaction_type === 'pipeline' ? 'pipeline' : sub.reaction_type === 'capability' ? 'capability' : 'durable'}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: Schedules */}\n <div>\n <SectionHeader icon={Clock} color=\"text-amber-400\">Schedules ({schedCount})</SectionHeader>\n {schedules?.length ? (\n <div className=\"divide-y divide-surface-border/30\">\n {schedules.map((s: any, i: number) => (\n <div key={i} className=\"flex items-center py-2\">\n <div className=\"flex-1 min-w-0\"><CronLabel cron={s.cron} /></div>\n <div className=\"flex items-center gap-1.5 shrink-0\"><span className=\"text-text-quaternary text-[10px]\">→</span><WorkflowPill type={s.workflow_type || 'workflow'} /></div>\n </div>\n ))}\n </div>\n ) : legacyCron ? (\n <div className=\"flex items-center py-1\">\n <div className=\"flex-1 min-w-0\"><CronLabel cron={legacyCron} /></div>\n {agent.workflow_type && <div className=\"flex items-center gap-1.5 shrink-0\"><span className=\"text-text-quaternary text-[10px]\">→</span><WorkflowPill type={agent.workflow_type} /></div>}\n </div>\n ) : (\n <EmptyHint text=\"No schedules configured\" />\n )}\n </div>\n\n {/* Col 3: Knowledge + Activity */}\n <div className=\"space-y-10\">\n <div>\n <SectionHeader icon={Brain} color=\"text-emerald-400\">Knowledge</SectionHeader>\n {agent.knowledge_domain ? (\n <button onClick={() => navigate(`/knowledge?domain=${agent.knowledge_domain}`)} className=\"group text-left flex items-center gap-3\">\n <span className=\"text-sm font-mono text-text-primary group-hover:text-accent transition-colors\">{agent.knowledge_domain}</span>\n <span className=\"text-[10px] text-text-quaternary\">{agent.stats?.knowledge_count?.toLocaleString() ?? 0} entries</span>\n <ArrowRight className=\"w-3 h-3 text-accent opacity-0 group-hover:opacity-100 transition-opacity\" />\n </button>\n ) : (\n <EmptyHint text=\"No knowledge domain\" />\n )}\n </div>\n\n <div>\n <SectionHeader icon={Radio} color=\"text-cyan-400\"\n actions={\n <div className=\"flex items-center gap-1.5\">\n <span className={`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${pulse ? 'bg-emerald-400' : 'bg-zinc-600'}`} />\n <span className=\"text-[10px] text-text-quaternary\">live</span>\n </div>\n }\n >\n Activity\n </SectionHeader>\n {liveEvents.length === 0 ? (\n <EmptyHint text=\"Events appear here as the agent runs\" />\n ) : (\n <div className=\"space-y-1.5\">\n {liveEvents.map((ev) => (\n <div key={ev.id}>\n <div className=\"flex items-center justify-between mb-0.5\">\n <span className=\"text-[11px] text-text-primary font-mono truncate flex-1\">{ev.label || '—'}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-2\">{formatTime(ev.timestamp)}</span>\n </div>\n <EventTopicPill topic={ev.type} />\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["formatTime","iso","SectionHeader","Icon","color","children","actions","jsxs","jsx","EmptyHint","text","feedCounter","useAgentFeed","agentName","events","setEvents","useState","pulse","setPulse","handler","useCallback","event","_a","label","_b","_c","prev","useEventSubscription","NATS_SUBJECT_PREFIX","AgentDetailPage","id","useParams","navigate","useNavigate","settings","useSettings","agent","isLoading","useAgent","subsData","useAgentSubscriptions","updateMutation","useUpdateAgent","deleteMutation","useDeleteAgent","liveEvents","useAgentEvents","Bot","statusDot","subs","statusLabel","schedules","legacyCron","schedCount","handlePause","msg","handleDelete","BookOpen","Pencil","Play","Pause","Trash2","Compass","Radio","sub","EventTopicPill","WorkflowPill","Clock","i","CronLabel","Brain","_e","_d","ArrowRight","ev"],"mappings":"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"}
1
+ {"version":3,"file":"AgentDetailPage-C-2iSaDs.js","sources":["../../src/pages/agents/AgentDetailPage.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Bot, Play, Pause, Trash2, ArrowRight, Pencil, BookOpen,\n Radio, Clock, Brain, Compass,\n} from 'lucide-react';\nimport { useAgent, useUpdateAgent, useDeleteAgent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\nimport { useAgentSubscriptions } from '../../api/agent-subscriptions';\nimport { useAgentEvents } from '../../hooks/useEventHooks';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { EventTopicPill } from '../../components/common/display/EventTopicPill';\nimport { CronLabel } from '../../components/common/display/CronLabel';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction formatTime(iso: string): string {\n return new Date(iso).toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });\n}\n\nfunction SectionHeader({ icon: Icon, color, children, actions }: { icon: React.ElementType; color: string; children: React.ReactNode; actions?: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between mb-3 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"text-xs font-semibold uppercase tracking-widest text-accent/80\">{children}</h2>\n </div>\n {actions}\n </div>\n );\n}\n\nfunction EmptyHint({ text }: { text: string }) {\n return <p className=\"text-[11px] text-text-quaternary py-2\">{text}</p>;\n}\n\n// ── Live feed ───────────────────────────────────────────────────────────────\n\ninterface FeedEvent { id: number; type: string; timestamp: string; label: string; }\nlet feedCounter = 0;\n\nfunction useAgentFeed(agentName?: string) {\n const [events, setEvents] = useState<FeedEvent[]>([]);\n const [pulse, setPulse] = useState(false);\n const handler = useCallback((event: any) => {\n if (event.type?.startsWith('mesh.')) return;\n const label = event.activityName || event.data?.domain || event.workflowId?.slice(0, 16) || '';\n setEvents((prev) => [{ id: ++feedCounter, type: event.type, timestamp: event.timestamp, label }, ...prev].slice(0, 10));\n setPulse(true);\n setTimeout(() => setPulse(false), 2000);\n }, []);\n useEventSubscription(\n agentName ? `${NATS_SUBJECT_PREFIX}.system.agent.${agentName}.>` : '',\n handler,\n );\n return { events, pulse };\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function AgentDetailPage() {\n const { id } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiEnabled = !!settings?.ai?.enabled;\n const label = aiEnabled ? 'Agent' : 'Automation';\n const { data: agent, isLoading } = useAgent(id ?? null);\n const { data: subsData } = useAgentSubscriptions(id ?? null);\n const updateMutation = useUpdateAgent();\n const deleteMutation = useDeleteAgent();\n const { events: liveEvents, pulse } = useAgentFeed(id);\n useAgentEvents();\n\n if (isLoading) {\n return <div className=\"animate-pulse space-y-4\"><div className=\"h-8 bg-surface-sunken rounded w-48\" /><div className=\"h-40 bg-surface-sunken rounded\" /></div>;\n }\n\n if (!agent) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Bot className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">{label} not found</h2>\n <button onClick={() => navigate('/agents')} className=\"text-sm text-accent hover:text-accent-hover transition-colors\">Back to {label.toLowerCase()}s</button>\n </div>\n );\n }\n\n const statusDot = agent.status === 'active' ? 'bg-emerald-400' : agent.status === 'paused' ? 'bg-amber-400' : agent.status === 'error' ? 'bg-red-400' : 'bg-zinc-500';\n const subs = subsData?.subscriptions ?? [];\n const statusLabel = agent.status === 'active' ? 'Active' : agent.status === 'paused' ? 'Paused' : agent.status === 'error' ? 'Error' : 'Inactive';\n const schedules = (agent.behaviors as any)?.schedules as any[] | undefined;\n const legacyCron = agent.behaviors?.cron;\n const schedCount = schedules?.length || (legacyCron ? 1 : 0);\n\n const handlePause = () => {\n const msg = [\n `Pause \"${agent.id}\"?`,\n '',\n 'This will:',\n subs.length > 0 ? `• Stop ${subs.length} event subscription${subs.length !== 1 ? 's' : ''}` : null,\n schedCount > 0 ? `• Stop ${schedCount} schedule${schedCount !== 1 ? 's' : ''}` : null,\n '',\n 'Knowledge and workflow history are preserved. You can reactivate anytime.',\n ].filter(Boolean).join('\\n');\n if (confirm(msg)) updateMutation.mutate({ id: agent.id, status: 'paused' as any });\n };\n\n const handleDelete = () => {\n const msg = [\n `Delete \"${agent.id}\"?`,\n '',\n 'This permanently removes:',\n '• The agent configuration',\n subs.length > 0 ? `• ${subs.length} event subscription${subs.length !== 1 ? 's' : ''}` : null,\n schedCount > 0 ? `• ${schedCount} schedule${schedCount !== 1 ? 's' : ''}` : null,\n '',\n 'Knowledge entries and workflow history are preserved.',\n ].filter(Boolean).join('\\n');\n if (confirm(msg)) deleteMutation.mutate(agent.id, { onSuccess: () => navigate('/agents') });\n };\n\n return (\n <div>\n {/* ── Hero ──────────────────────────────────────────────────────────── */}\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-3xl font-light text-text-primary\">{label}: {agent.id}</h1>\n <button onClick={() => { window.location.hash = '#docs:agents.md'; }} className=\"text-text-quaternary hover:text-accent transition-colors mt-1\" title=\"Docs\">\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1.5 mr-2\">\n <span className={`w-2 h-2 rounded-full ${statusDot}`} />\n <span className=\"text-xs text-text-secondary capitalize\">{statusLabel}</span>\n </div>\n <button onClick={() => navigate(`/agents/${agent.id}/edit`)} className=\"flex items-center gap-1.5 px-4 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\">\n <Pencil className=\"w-3 h-3\" /> Edit\n </button>\n {agent.status !== 'active' && (\n <button onClick={() => updateMutation.mutate({ id: agent.id, status: 'active' as any })} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-emerald-400 hover:bg-emerald-600/10 transition-colors\">\n <Play className=\"w-3 h-3\" /> Activate\n </button>\n )}\n {agent.status === 'active' && (\n <button onClick={handlePause} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-text-tertiary hover:text-text-primary hover:bg-surface-hover transition-colors\">\n <Pause className=\"w-3 h-3\" /> Pause\n </button>\n )}\n <button onClick={handleDelete} className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md text-red-400/60 hover:text-red-400 hover:bg-red-600/10 transition-colors\">\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n </div>\n </div>\n\n {/* Description callout */}\n {agent.description && (\n <div className=\"border-l-2 border-accent/30 pl-4 py-1 mb-10\">\n <p className=\"text-[13px] text-text-secondary italic leading-relaxed\">{agent.description}</p>\n </div>\n )}\n\n {/* Motivation */}\n {(agent.goals || agent.rules) && (\n <div className=\"mb-10\">\n <SectionHeader icon={Compass} color=\"text-rose-400\">Motivation</SectionHeader>\n <div className=\"grid grid-cols-2 gap-x-14 bg-surface-sunken/20 rounded-lg px-5 py-4\">\n {agent.goals && (\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5\">Goals</p>\n <p className=\"text-[13px] text-text-primary leading-relaxed\">{agent.goals}</p>\n </div>\n )}\n {agent.rules && (\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5\">Rules</p>\n <p className=\"text-[13px] text-text-primary leading-relaxed\">{agent.rules}</p>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* ── 3-column grid ─────────────────────────────────────────────────── */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-10\">\n\n {/* Col 1: Subscriptions */}\n <div>\n <SectionHeader icon={Radio} color=\"text-cyan-400\">\n Subscriptions ({subs.length})\n </SectionHeader>\n {subs.length === 0 ? (\n <EmptyHint text=\"No event subscriptions\" />\n ) : (\n <div className=\"divide-y divide-surface-border/30\">\n {subs.map((sub: any) => (\n <div key={sub.id} className=\"flex items-center py-2\">\n <div className=\"flex-1 min-w-0\"><EventTopicPill topic={sub.topic} /></div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n <span className=\"text-text-quaternary text-[10px]\">→</span>\n <WorkflowPill\n type={sub.reaction_type === 'capability' ? sub.tool_name : sub.workflow_type || sub.reaction_type}\n variant={sub.reaction_type === 'pipeline' ? 'pipeline' : sub.reaction_type === 'capability' ? 'capability' : 'durable'}\n />\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Col 2: Schedules */}\n <div>\n <SectionHeader icon={Clock} color=\"text-amber-400\">Schedules ({schedCount})</SectionHeader>\n {schedules?.length ? (\n <div className=\"divide-y divide-surface-border/30\">\n {schedules.map((s: any, i: number) => (\n <div key={i} className=\"flex items-center py-2\">\n <div className=\"flex-1 min-w-0\"><CronLabel cron={s.cron} /></div>\n <div className=\"flex items-center gap-1.5 shrink-0\"><span className=\"text-text-quaternary text-[10px]\">→</span><WorkflowPill type={s.workflow_type || 'workflow'} /></div>\n </div>\n ))}\n </div>\n ) : legacyCron ? (\n <div className=\"flex items-center py-1\">\n <div className=\"flex-1 min-w-0\"><CronLabel cron={legacyCron} /></div>\n {agent.workflow_type && <div className=\"flex items-center gap-1.5 shrink-0\"><span className=\"text-text-quaternary text-[10px]\">→</span><WorkflowPill type={agent.workflow_type} /></div>}\n </div>\n ) : (\n <EmptyHint text=\"No schedules configured\" />\n )}\n </div>\n\n {/* Col 3: Knowledge + Activity */}\n <div className=\"space-y-10\">\n <div>\n <SectionHeader icon={Brain} color=\"text-emerald-400\">Knowledge</SectionHeader>\n {agent.knowledge_domain ? (\n <button onClick={() => navigate(`/knowledge?domain=${agent.knowledge_domain}`)} className=\"group text-left flex items-center gap-3\">\n <span className=\"text-sm font-mono text-text-primary group-hover:text-accent transition-colors\">{agent.knowledge_domain}</span>\n <span className=\"text-[10px] text-text-quaternary\">{agent.stats?.knowledge_count?.toLocaleString() ?? 0} entries</span>\n <ArrowRight className=\"w-3 h-3 text-accent opacity-0 group-hover:opacity-100 transition-opacity\" />\n </button>\n ) : (\n <EmptyHint text=\"No knowledge domain\" />\n )}\n </div>\n\n <div>\n <SectionHeader icon={Radio} color=\"text-cyan-400\"\n actions={\n <div className=\"flex items-center gap-1.5\">\n <span className={`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${pulse ? 'bg-emerald-400' : 'bg-zinc-600'}`} />\n <span className=\"text-[10px] text-text-quaternary\">live</span>\n </div>\n }\n >\n Activity\n </SectionHeader>\n {liveEvents.length === 0 ? (\n <EmptyHint text=\"Events appear here as the agent runs\" />\n ) : (\n <div className=\"space-y-1.5\">\n {liveEvents.map((ev) => (\n <div key={ev.id}>\n <div className=\"flex items-center justify-between mb-0.5\">\n <span className=\"text-[11px] text-text-primary font-mono truncate flex-1\">{ev.label || '—'}</span>\n <span className=\"text-[10px] text-text-quaternary shrink-0 ml-2\">{formatTime(ev.timestamp)}</span>\n </div>\n <EventTopicPill topic={ev.type} />\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["formatTime","iso","SectionHeader","Icon","color","children","actions","jsxs","jsx","EmptyHint","text","feedCounter","useAgentFeed","agentName","events","setEvents","useState","pulse","setPulse","handler","useCallback","event","_a","label","_b","_c","prev","useEventSubscription","NATS_SUBJECT_PREFIX","AgentDetailPage","id","useParams","navigate","useNavigate","settings","useSettings","agent","isLoading","useAgent","subsData","useAgentSubscriptions","updateMutation","useUpdateAgent","deleteMutation","useDeleteAgent","liveEvents","useAgentEvents","Bot","statusDot","subs","statusLabel","schedules","legacyCron","schedCount","handlePause","msg","handleDelete","BookOpen","Pencil","Play","Pause","Trash2","Compass","Radio","sub","EventTopicPill","WorkflowPill","Clock","i","CronLabel","Brain","_e","_d","ArrowRight","ev"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-query-B2UbickB.js";import{u as h}from"./agents-HMkTc425.js";import{u as f,c as b}from"./index-BFQ2t-p1.js";import{i as j}from"./useEventHooks-M7SaEfel.js";import{u as v}from"./useFilterParams-x-Dg0Vgz.js";import{D as N}from"./DataTable-D9yuBv0w.js";import{S as y}from"./StickyPagination-BWhFSr2d.js";import{F as P,b as S}from"./FilterBar-Ck4K4rzu.js";import{P as k}from"./PageHeader-Bnt2iQQa.js";import{L as w}from"./ListToolbar-D6tQ3ZG2.js";import{m as _}from"./vendor-icons-Dj2F0Jrb.js";import{c as A}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";const $=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"paused",label:"Paused"},{value:"error",label:"Error"}],z=[{key:"name",label:"Agent",render:t=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${t.status==="active"?"bg-emerald-400":t.status==="paused"?"bg-amber-400":t.status==="error"?"bg-red-400":"bg-zinc-500"}`}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"text-xs font-medium text-text-primary block",children:t.id}),t.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary truncate",children:t.description})]})]})},{key:"knowledge_domain",label:"Knowledge",render:t=>t.knowledge_domain?e.jsx("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:t.knowledge_domain}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-28"},{key:"schedules",label:"Schedules",render:t=>{var o,r;const s=(o=t.behaviors)==null?void 0:o.schedules,a=s!=null&&s.length?s.map(i=>i.cron):(r=t.behaviors)!=null&&r.cron?[t.behaviors.cron]:[];return a.length?e.jsxs("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:[a[0],a.length>1?` +${a.length-1}`:""]}):e.jsx("span",{className:"text-text-quaternary",children:"—"})},className:"w-28"},{key:"subscriptions",label:"Subscriptions",render:t=>{var r;const s=t.subscription_count??0,a=t.sub_topics??[];if(!s)return e.jsx("span",{className:"text-text-quaternary",children:"—"});const o=((r=a[0])==null?void 0:r.replace(/^lt\.events\./,""))??"";return e.jsxs("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:[o,s>1?` +${s-1}`:""]})},className:"w-36"},{key:"last_run_at",label:"Last Run",render:t=>t.last_run_at?e.jsx("span",{className:"whitespace-nowrap",children:e.jsx(b,{date:t.last_run_at})}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-32"}];function M(){var u;const t=A(),{data:s}=f(),a=!!((u=s==null?void 0:s.ai)!=null&&u.enabled),o=a?"Agent":"Automation",r=a?"Agents":"Automations";j();const{filters:i,setFilter:p,pagination:n}=v({filters:{status:""}}),{data:l,isLoading:d,refetch:x,isFetching:g}=h({status:i.status||void 0,limit:n.pageSize,offset:n.offset}),m=(l==null?void 0:l.total)??0;return e.jsxs("div",{children:[e.jsx(k,{title:r,docsHash:"#docs:agents.md",actions:e.jsxs("button",{onClick:()=>t("/agents/new"),className:"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(_,{className:"w-4 h-4"})," Create ",o]})}),e.jsx(P,{actions:e.jsx(w,{onRefresh:()=>x(),isFetching:g,apiPath:`/agents?limit=${n.pageSize}&offset=${n.offset}${i.status?`&status=${i.status}`:""}`}),children:e.jsx(S,{label:"Status",value:i.status,onChange:c=>p("status",c),options:$})}),e.jsx(N,{columns:z,data:(l==null?void 0:l.agents)??[],keyFn:c=>c.id,onRowClick:c=>t(`/agents/${c.id}`),isLoading:d,emptyMessage:`No ${r.toLowerCase()} found`}),e.jsx(y,{page:n.page,totalPages:n.totalPages(m),onPageChange:n.setPage,total:m,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{M as AgentsPage};
2
- //# sourceMappingURL=AgentsPage-tJIlrnfM.js.map
1
+ import{j as e}from"./vendor-query-B2UbickB.js";import{u as h}from"./agents-JE4aL07D.js";import{u as f,c as b}from"./index-DPJW96d2.js";import{i as j}from"./useEventHooks-CjygrbYy.js";import{u as v}from"./useFilterParams-x-Dg0Vgz.js";import{D as N}from"./DataTable-D9yuBv0w.js";import{S as y}from"./StickyPagination-BWhFSr2d.js";import{F as P,b as S}from"./FilterBar-Ck4K4rzu.js";import{P as k}from"./PageHeader-Bnt2iQQa.js";import{L as w}from"./ListToolbar-BH9rwQVE.js";import{m as _}from"./vendor-icons-Dj2F0Jrb.js";import{c as A}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";const $=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"paused",label:"Paused"},{value:"error",label:"Error"}],z=[{key:"name",label:"Agent",render:t=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${t.status==="active"?"bg-emerald-400":t.status==="paused"?"bg-amber-400":t.status==="error"?"bg-red-400":"bg-zinc-500"}`}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"text-xs font-medium text-text-primary block",children:t.id}),t.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary truncate",children:t.description})]})]})},{key:"knowledge_domain",label:"Knowledge",render:t=>t.knowledge_domain?e.jsx("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:t.knowledge_domain}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-28"},{key:"schedules",label:"Schedules",render:t=>{var o,r;const s=(o=t.behaviors)==null?void 0:o.schedules,a=s!=null&&s.length?s.map(i=>i.cron):(r=t.behaviors)!=null&&r.cron?[t.behaviors.cron]:[];return a.length?e.jsxs("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:[a[0],a.length>1?` +${a.length-1}`:""]}):e.jsx("span",{className:"text-text-quaternary",children:"—"})},className:"w-28"},{key:"subscriptions",label:"Subscriptions",render:t=>{var r;const s=t.subscription_count??0,a=t.sub_topics??[];if(!s)return e.jsx("span",{className:"text-text-quaternary",children:"—"});const o=((r=a[0])==null?void 0:r.replace(/^lt\.events\./,""))??"";return e.jsxs("span",{className:"text-[10px] font-mono text-text-secondary whitespace-nowrap",children:[o,s>1?` +${s-1}`:""]})},className:"w-36"},{key:"last_run_at",label:"Last Run",render:t=>t.last_run_at?e.jsx("span",{className:"whitespace-nowrap",children:e.jsx(b,{date:t.last_run_at})}):e.jsx("span",{className:"text-text-quaternary",children:"—"}),className:"w-32"}];function M(){var u;const t=A(),{data:s}=f(),a=!!((u=s==null?void 0:s.ai)!=null&&u.enabled),o=a?"Agent":"Automation",r=a?"Agents":"Automations";j();const{filters:i,setFilter:p,pagination:n}=v({filters:{status:""}}),{data:l,isLoading:d,refetch:x,isFetching:g}=h({status:i.status||void 0,limit:n.pageSize,offset:n.offset}),m=(l==null?void 0:l.total)??0;return e.jsxs("div",{children:[e.jsx(k,{title:r,docsHash:"#docs:agents.md",actions:e.jsxs("button",{onClick:()=>t("/agents/new"),className:"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors",children:[e.jsx(_,{className:"w-4 h-4"})," Create ",o]})}),e.jsx(P,{actions:e.jsx(w,{onRefresh:()=>x(),isFetching:g,apiPath:`/agents?limit=${n.pageSize}&offset=${n.offset}${i.status?`&status=${i.status}`:""}`}),children:e.jsx(S,{label:"Status",value:i.status,onChange:c=>p("status",c),options:$})}),e.jsx(N,{columns:z,data:(l==null?void 0:l.agents)??[],keyFn:c=>c.id,onRowClick:c=>t(`/agents/${c.id}`),isLoading:d,emptyMessage:`No ${r.toLowerCase()} found`}),e.jsx(y,{page:n.page,totalPages:n.totalPages(m),onPageChange:n.setPage,total:m,pageSize:n.pageSize,onPageSizeChange:n.setPageSize})]})}export{M as AgentsPage};
2
+ //# sourceMappingURL=AgentsPage-C3FztFd_.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentsPage-tJIlrnfM.js","sources":["../../src/pages/agents/AgentsPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Plus } from 'lucide-react';\nimport { useAgents, type Agent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\nimport { useAgentEvents } from '../../hooks/useEventHooks';\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 { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { DateValue } from '../../components/common/display/DateValue';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'paused', label: 'Paused' },\n { value: 'error', label: 'Error' },\n];\n\nconst columns: Column<Agent>[] = [\n {\n key: 'name',\n label: 'Agent',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${row.status === 'active' ? 'bg-emerald-400' : row.status === 'paused' ? 'bg-amber-400' : row.status === 'error' ? 'bg-red-400' : 'bg-zinc-500'}`} />\n <div className=\"min-w-0\">\n <span className=\"text-xs font-medium text-text-primary block\">{row.id}</span>\n {row.description && <p className=\"text-[10px] text-text-tertiary truncate\">{row.description}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'knowledge_domain',\n label: 'Knowledge',\n render: (row) => row.knowledge_domain\n ? <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{row.knowledge_domain}</span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-28',\n },\n {\n key: 'schedules',\n label: 'Schedules',\n render: (row) => {\n const scheds = (row.behaviors as any)?.schedules as any[] | undefined;\n const crons = scheds?.length ? scheds.map((s: any) => s.cron) : row.behaviors?.cron ? [row.behaviors.cron] : [];\n if (!crons.length) return <span className=\"text-text-quaternary\">—</span>;\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{crons[0]}{crons.length > 1 ? ` +${crons.length - 1}` : ''}</span>;\n },\n className: 'w-28',\n },\n {\n key: 'subscriptions',\n label: 'Subscriptions',\n render: (row) => {\n const count = row.subscription_count ?? 0;\n const topics = row.sub_topics ?? [];\n if (!count) return <span className=\"text-text-quaternary\">—</span>;\n const first = topics[0]?.replace(/^lt\\.events\\./, '') ?? '';\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{first}{count > 1 ? ` +${count - 1}` : ''}</span>;\n },\n className: 'w-36',\n },\n {\n key: 'last_run_at',\n label: 'Last Run',\n render: (row) => row.last_run_at\n ? <span className=\"whitespace-nowrap\"><DateValue date={row.last_run_at} /></span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-32',\n },\n];\n\nexport function AgentsPage() {\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiEnabled = !!settings?.ai?.enabled;\n const label = aiEnabled ? 'Agent' : 'Automation';\n const labelPlural = aiEnabled ? 'Agents' : 'Automations';\n useAgentEvents();\n\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n\n const { data, isLoading, refetch, isFetching } = useAgents({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader\n title={labelPlural}\n docsHash=\"#docs:agents.md\"\n actions={\n <button\n onClick={() => navigate('/agents/new')}\n className=\"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\"\n >\n <Plus className=\"w-4 h-4\" /> Create {label}\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/agents?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.status ? `&status=${filters.status}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.agents ?? []}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/agents/${row.id}`)}\n isLoading={isLoading}\n emptyMessage={`No ${labelPlural.toLowerCase()} found`}\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}\n"],"names":["STATUS_OPTIONS","columns","row","jsxs","jsx","scheds","_a","crons","s","_b","count","topics","first","DateValue","AgentsPage","navigate","useNavigate","settings","useSettings","aiEnabled","label","labelPlural","useAgentEvents","filters","setFilter","pagination","useFilterParams","data","isLoading","refetch","isFetching","useAgents","total","PageHeader","Plus","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
1
+ {"version":3,"file":"AgentsPage-C3FztFd_.js","sources":["../../src/pages/agents/AgentsPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Plus } from 'lucide-react';\nimport { useAgents, type Agent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\nimport { useAgentEvents } from '../../hooks/useEventHooks';\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 { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { DateValue } from '../../components/common/display/DateValue';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'paused', label: 'Paused' },\n { value: 'error', label: 'Error' },\n];\n\nconst columns: Column<Agent>[] = [\n {\n key: 'name',\n label: 'Agent',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${row.status === 'active' ? 'bg-emerald-400' : row.status === 'paused' ? 'bg-amber-400' : row.status === 'error' ? 'bg-red-400' : 'bg-zinc-500'}`} />\n <div className=\"min-w-0\">\n <span className=\"text-xs font-medium text-text-primary block\">{row.id}</span>\n {row.description && <p className=\"text-[10px] text-text-tertiary truncate\">{row.description}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'knowledge_domain',\n label: 'Knowledge',\n render: (row) => row.knowledge_domain\n ? <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{row.knowledge_domain}</span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-28',\n },\n {\n key: 'schedules',\n label: 'Schedules',\n render: (row) => {\n const scheds = (row.behaviors as any)?.schedules as any[] | undefined;\n const crons = scheds?.length ? scheds.map((s: any) => s.cron) : row.behaviors?.cron ? [row.behaviors.cron] : [];\n if (!crons.length) return <span className=\"text-text-quaternary\">—</span>;\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{crons[0]}{crons.length > 1 ? ` +${crons.length - 1}` : ''}</span>;\n },\n className: 'w-28',\n },\n {\n key: 'subscriptions',\n label: 'Subscriptions',\n render: (row) => {\n const count = row.subscription_count ?? 0;\n const topics = row.sub_topics ?? [];\n if (!count) return <span className=\"text-text-quaternary\">—</span>;\n const first = topics[0]?.replace(/^lt\\.events\\./, '') ?? '';\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{first}{count > 1 ? ` +${count - 1}` : ''}</span>;\n },\n className: 'w-36',\n },\n {\n key: 'last_run_at',\n label: 'Last Run',\n render: (row) => row.last_run_at\n ? <span className=\"whitespace-nowrap\"><DateValue date={row.last_run_at} /></span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-32',\n },\n];\n\nexport function AgentsPage() {\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiEnabled = !!settings?.ai?.enabled;\n const label = aiEnabled ? 'Agent' : 'Automation';\n const labelPlural = aiEnabled ? 'Agents' : 'Automations';\n useAgentEvents();\n\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n\n const { data, isLoading, refetch, isFetching } = useAgents({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader\n title={labelPlural}\n docsHash=\"#docs:agents.md\"\n actions={\n <button\n onClick={() => navigate('/agents/new')}\n className=\"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\"\n >\n <Plus className=\"w-4 h-4\" /> Create {label}\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/agents?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.status ? `&status=${filters.status}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.agents ?? []}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/agents/${row.id}`)}\n isLoading={isLoading}\n emptyMessage={`No ${labelPlural.toLowerCase()} found`}\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}\n"],"names":["STATUS_OPTIONS","columns","row","jsxs","jsx","scheds","_a","crons","s","_b","count","topics","first","DateValue","AgentsPage","navigate","useNavigate","settings","useSettings","aiEnabled","label","labelPlural","useAgentEvents","filters","setFilter","pagination","useFilterParams","data","isLoading","refetch","isFetching","useAgents","total","PageHeader","Plus","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e,a as o}from"./vendor-query-B2UbickB.js";import{j as pe,g as Ce,k as fe,l as be,m as ye,n as je,o as ve,p as ke,q as Se,r as Ne,s as Pe,t as Ae}from"./index-BFQ2t-p1.js";import{f as we}from"./useEventHooks-M7SaEfel.js";import{u as q,C as K,a as Ee}from"./CustomDurationPicker-C3zGsESx.js";import{u as Be}from"./roles-BmHbRaPT.js";import{u as Me}from"./useFilterParams-x-Dg0Vgz.js";import{D as Te}from"./DataTable-D9yuBv0w.js";import{S as Le}from"./StickyPagination-BWhFSr2d.js";import{P as ze}from"./PageHeader-Bnt2iQQa.js";import{P as Fe}from"./constants-BHkpVaqx.js";import{M as D}from"./Modal-CSrxpXeM.js";import{u as Ie}from"./users-BpjSNhQe.js";import{E as Oe,a as $e}from"./escalation-columns-BKqSywVA.js";import{R as Re,a as _e}from"./RowActions-Dg-Fsm5O.js";import{L as Ue}from"./ListToolbar-D6tQ3ZG2.js";import{a4 as He}from"./vendor-icons-Dj2F0Jrb.js";import{c as qe}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-DQTT1s9v.js";import"./WorkflowPill-F1oKUzmc.js";import"./TimestampCell-CrCtoBlo.js";import"./escalation-Djk5XKmX.js";const De=t=>t.isPriorityPending||t.isClaimPending||t.isAssignPending||t.isEscalatePending||t.isTriagePending||t.isCancelPending;function Qe(t){const a=De(t),c=q();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4",children:[e.jsxs("span",{className:"text-xs font-medium text-accent",children:[t.selectedCount," selected"]}),e.jsx("div",{className:"w-px h-5 bg-surface-border"}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onSetPriority(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Priority..."}),Fe.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onClaim(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Claim for..."}),c.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsx("button",{onClick:t.onAssign,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isAssignPending?"Assigning...":"Assign to..."}),t.availableRoles.length>0&&e.jsxs("select",{onChange:s=>{s.target.value&&(t.onEscalate(s.target.value),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Escalate to..."}),t.availableRoles.map(s=>e.jsx("option",{value:s,children:s},s))]}),e.jsx("button",{onClick:t.onTriage,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isTriagePending?"Triaging...":"Triage"}),e.jsx("button",{onClick:t.onCancel,disabled:a,className:"text-xs py-1.5 px-3 rounded-md border border-status-error/40 text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50",children:t.isCancelPending?"Cancelling...":"Cancel"}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:t.onClearSelection,className:"text-xs text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"}),a&&e.jsx("span",{className:"text-xs text-text-tertiary animate-pulse",children:"Processing..."})]})}function Ve({open:t,onClose:a,selectedCount:c,selectedRoles:s,onSubmit:m,isPending:x}){const{isSuperAdmin:C}=pe(),u=q(),[i,g]=o.useState("user"),[y,E]=o.useState(null),[j,F]=o.useState(""),[r,h]=o.useState("30"),[R,v]=o.useState(0),_=o.useCallback(l=>v(l),[]),B=!C&&s.length===1?s[0]:void 0,{data:f,isLoading:N}=Ie({role:B,status:"active",limit:200}),M=o.useMemo(()=>{const l=(f==null?void 0:f.users)??[];if(!j.trim())return l;const k=j.toLowerCase();return l.filter(p=>{var P,S;return((P=p.display_name)==null?void 0:P.toLowerCase().includes(k))||((S=p.email)==null?void 0:S.toLowerCase().includes(k))})},[f==null?void 0:f.users,j]),T=()=>{g("user"),E(null),F(""),h("30"),v(0),a()},I=l=>{E(l),g("duration")},L=()=>{g("user")},O=()=>{if(!y)return;const l=r==="custom"?R:parseInt(r);!l||l<=0||m(y.id,l)};return e.jsx(D,{open:t,onClose:T,title:"Assign Escalations",children:e.jsxs("div",{className:"space-y-4",children:[i==="user"&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Select a user to assign"," ",e.jsx("span",{className:"font-medium text-text-primary",children:c})," ","escalation(s) to:"]}),e.jsx("input",{type:"text",value:j,onChange:l=>F(l.target.value),placeholder:"Search by name or email...",className:"input text-xs w-full",autoFocus:!0}),e.jsxs("div",{className:"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border",children:[N&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"Loading users..."}),!N&&M.length===0&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"No users found"}),M.map(l=>e.jsxs("button",{onClick:()=>I(l),className:"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary",children:l.display_name||l.external_id}),l.email&&e.jsx("p",{className:"text-[10px] text-text-tertiary",children:l.email})]},l.id))]}),e.jsx("div",{className:"flex justify-end pt-2",children:e.jsx("button",{onClick:T,className:"btn-secondary text-xs",children:"Cancel"})})]}),i==="duration"&&y&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Assign to"," ",e.jsx("span",{className:"font-medium text-text-primary",children:y.display_name||y.external_id})," ","for:"]}),e.jsxs("select",{value:r,onChange:l=>{h(l.target.value),v(0)},className:"select w-full text-sm",children:[u.map(l=>e.jsx("option",{value:l.value,children:l.label},l.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),r==="custom"&&e.jsx(K,{onChange:_,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:L,className:"btn-secondary text-xs",children:"Back"}),e.jsx("button",{onClick:O,disabled:x,className:"btn-primary text-xs",children:x?"Assigning...":"Assign"})]})]})]})})}function Ge({open:t,onClose:a,selectedCount:c,onSubmit:s,isPending:m}){const[x,C]=o.useState(""),u=()=>{s(x||void 0)};return e.jsx(D,{open:t,onClose:a,title:"Submit for AI Triage",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Submit ",e.jsx("span",{className:"font-medium text-text-primary",children:c})," escalation(s) for AI triage? The triage orchestrator will take over resolution."]}),e.jsxs("div",{children:[e.jsxs("label",{className:"text-xs font-medium text-text-secondary block mb-1",children:["Triage hint ",e.jsx("span",{className:"text-text-tertiary",children:"(optional)"})]}),e.jsx("input",{type:"text",value:x,onChange:i=>C(i.target.value),placeholder:"e.g., image_orientation",className:"input text-xs font-mono w-full"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Guides the triage workflow on what remediation to apply"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:u,disabled:m,className:"btn-primary text-xs",children:m?"Submitting...":"Submit for Triage"})]})]})})}function w(t,a,c){return s=>{t.mutate(s,{onSuccess:()=>{a(),c==null||c()}})}}function Ye(t){const a=()=>[...t.selectedIds];return{handleSetPriority:i=>{w(t.setPriority,t.clearSelection)({ids:a(),priority:i})},handleBulkClaim:i=>{w(t.bulkClaim,t.clearSelection)({ids:a(),durationMinutes:i})},handleBulkEscalate:i=>{w(t.bulkEscalate,t.clearSelection)({ids:a(),targetRole:i})},handleBulkTriage:i=>{w(t.bulkTriage,t.clearSelection,t.closeTriageModal)({ids:a(),hint:i})},handleBulkAssign:(i,g)=>{w(t.bulkAssign,t.clearSelection,t.closeAssignModal)({ids:a(),targetUserId:i,durationMinutes:g})},handleBulkCancel:()=>{w(t.bulkCancel,t.clearSelection,t.closeCancelModal)({ids:a()})}}}function Je({claimTarget:t,onClose:a,claimDuration:c,onDurationChange:s,claimDurations:m,onCustomClaimChange:x,onClaim:C,isPending:u}){return e.jsx(D,{open:!!t,onClose:a,title:"Claim Escalation",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claim ",e.jsx("span",{className:"font-medium text-text-primary",children:t==null?void 0:t.type})," for:"]}),e.jsxs("select",{value:c,onChange:i=>{s(i.target.value)},className:"select w-full text-sm",children:[m.map(i=>e.jsx("option",{value:i.value,children:i.label},i.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),c==="custom"&&e.jsx(K,{onChange:x,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:C,className:"btn-primary text-xs",disabled:u,children:u?"Claiming...":"Claim"})]})]})})}function yt(){we();const t=qe(),{filters:a,setFilter:c,pagination:s,sort:m,setSort:x}=Me({filters:{role:"",type:"",priority:"",status:"available",search:""}}),C=q(),[u,i]=o.useState(null),[g,y]=o.useState("30"),[E,j]=o.useState(0),F=o.useCallback(n=>j(n),[]),[r,h]=o.useState(new Set),[R,v]=o.useState(!1),[_,B]=o.useState(!1),[f,N]=o.useState(!1),M=Ce(),T=fe(),I=be(),L=ye(),O=je(),l=ve(),k=ke(),{data:p}=Be(),{data:P}=Se();o.useEffect(()=>{h(new Set)},[a.role,a.type,a.priority,a.status,s.page,s.pageSize]);const S=a.status||"",z=S==="available",Q=S==="claimed",U=Q?"pending":S==="resolved"?"resolved":S==="cancelled"?"cancelled":void 0,V={role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,limit:s.pageSize,offset:s.offset,sort_by:m.sort_by||"created_at",order:m.order||"desc"},W=Ne({...V,enabled:z}),X=Pe({status:U,claimed:Q||void 0,...V,enabled:!z}),Z=z?W:X,{data:A,isLoading:ee,error:$,refetch:te,isFetching:se}=Z,G=(A==null?void 0:A.escalations)??[],H=(a.search??"").toLowerCase(),b=H?G.filter(n=>{const d=[n.id,n.type,n.subtype,n.description,n.workflow_id,n.origin_id,n.role];return n.metadata&&d.push(...Object.values(n.metadata).map(String)),d.some(J=>J&&String(J).toLowerCase().includes(H))}):G,Y=H?b.length:(A==null?void 0:A.total)??0,{canBulk:ae}=Ae(),ne=o.useMemo(()=>{const n=new Set;for(const d of b)r.has(d.id)&&n.add(d.role);return[...n]},[b,r]),le=o.useCallback(()=>h(new Set),[]),ie=()=>{if(!u)return;const n=g==="custom"?E:parseInt(g);!n||n<=0||M.mutate({id:u.id,durationMinutes:n},{onSuccess:()=>{i(null),t(`/escalations/detail/${u.id}`)}})},{handleSetPriority:oe,handleBulkClaim:re,handleBulkEscalate:ce,handleBulkTriage:de,handleBulkAssign:ue,handleBulkCancel:me}=Ye({selectedIds:r,clearSelection:le,setPriority:T,bulkClaim:I,bulkEscalate:O,bulkTriage:l,bulkAssign:L,bulkCancel:k,closeTriageModal:()=>v(!1),closeAssignModal:()=>B(!1),closeCancelModal:()=>N(!1)}),xe=n=>{const d=new Set(r);d.has(n)?d.delete(n):d.add(n),h(d)},ge=()=>{r.size===b.length?h(new Set):h(new Set(b.map(n=>n.id)))},he=[ae?{key:"select",label:e.jsx("input",{type:"checkbox",checked:b.length>0&&r.size===b.length,onChange:ge,className:"rounded"}),render:n=>e.jsx("input",{type:"checkbox",checked:r.has(n.id),onChange:d=>{d.stopPropagation(),xe(n.id)},onClick:d=>d.stopPropagation(),className:"rounded"}),className:"w-10"}:{key:"spacer",label:"",render:()=>null,className:"w-10"},...Oe,{key:"actions",label:"",render:n=>e.jsx(Re,{children:e.jsx(_e,{icon:He,title:"Claim escalation",onClick:()=>i(n)})}),className:"w-16 text-right"}];return e.jsxs("div",{children:[e.jsx(ze,{title:"Available Escalations",docsHash:"#docs:dashboard.md:all-escalations"}),e.jsx($e,{filters:a,setFilter:c,roles:(p==null?void 0:p.roles)??[],types:(P==null?void 0:P.types)??[],showStatus:!0,actions:e.jsx(Ue,{onRefresh:()=>te(),isFetching:se,apiPath:`/escalations${z?"/available":""}?limit=${s.pageSize}&offset=${s.offset}${U?`&status=${U}`:""}${a.role?`&role=${a.role}`:""}${a.type?`&type=${a.type}`:""}${a.priority?`&priority=${a.priority}`:""}`})}),r.size>0&&e.jsx(Qe,{selectedCount:r.size,onClearSelection:()=>h(new Set),onSetPriority:oe,onClaim:re,onAssign:()=>B(!0),onEscalate:ce,onTriage:()=>v(!0),onCancel:()=>N(!0),isPriorityPending:T.isPending,isClaimPending:I.isPending,isAssignPending:L.isPending,isEscalatePending:O.isPending,isTriagePending:l.isPending,isCancelPending:k.isPending,availableRoles:(p==null?void 0:p.roles)??[]}),$&&e.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:$.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${$.message}`}),e.jsx(Te,{columns:he,data:b,keyFn:n=>n.id,onRowClick:n=>t(`/escalations/detail/${n.id}`,{state:{from:"/escalations/available"}}),isLoading:ee,emptyMessage:$?"Unable to load data":"No available escalations",sort:m,onSort:x}),e.jsx(Le,{page:s.page,totalPages:s.totalPages(Y),onPageChange:s.setPage,total:Y,pageSize:s.pageSize,onPageSizeChange:s.setPageSize}),e.jsx(Je,{claimTarget:u,onClose:()=>i(null),claimDuration:g,onDurationChange:n=>{y(n),j(0)},claimDurations:C,customClaimMinutes:E,onCustomClaimChange:F,onClaim:ie,isPending:M.isPending}),e.jsx(Ge,{open:R,onClose:()=>v(!1),selectedCount:r.size,onSubmit:de,isPending:l.isPending}),e.jsx(Ve,{open:_,onClose:()=>B(!1),selectedCount:r.size,selectedRoles:ne,onSubmit:ue,isPending:L.isPending}),e.jsx(Ee,{open:f,onClose:()=>N(!1),onConfirm:me,selectedCount:r.size,isPending:k.isPending,error:k.error})]})}export{yt as AvailableEscalationsPage};
2
- //# sourceMappingURL=AvailableEscalationsPage-B7gEfcw3.js.map
1
+ import{j as e,a as o}from"./vendor-query-B2UbickB.js";import{j as pe,g as Ce,k as fe,l as be,m as ye,n as je,o as ve,p as ke,q as Se,r as Ne,s as Pe,t as Ae}from"./index-DPJW96d2.js";import{f as we}from"./useEventHooks-CjygrbYy.js";import{u as q,C as K,a as Ee}from"./CustomDurationPicker-Vcmr4LiR.js";import{u as Be}from"./roles-CSpHRRu8.js";import{u as Me}from"./useFilterParams-x-Dg0Vgz.js";import{D as Te}from"./DataTable-D9yuBv0w.js";import{S as Le}from"./StickyPagination-BWhFSr2d.js";import{P as ze}from"./PageHeader-Bnt2iQQa.js";import{P as Fe}from"./constants-BHkpVaqx.js";import{M as D}from"./Modal-CSrxpXeM.js";import{u as Ie}from"./users-DvhHbR0R.js";import{E as Oe,a as $e}from"./escalation-columns-DqTkKbCv.js";import{R as Re,a as _e}from"./RowActions-Dg-Fsm5O.js";import{L as Ue}from"./ListToolbar-BH9rwQVE.js";import{a4 as He}from"./vendor-icons-Dj2F0Jrb.js";import{c as qe}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-DQTT1s9v.js";import"./WorkflowPill-F1oKUzmc.js";import"./TimestampCell-Dsje8GH-.js";import"./escalation-ne7dIaPa.js";const De=t=>t.isPriorityPending||t.isClaimPending||t.isAssignPending||t.isEscalatePending||t.isTriagePending||t.isCancelPending;function Qe(t){const a=De(t),c=q();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4",children:[e.jsxs("span",{className:"text-xs font-medium text-accent",children:[t.selectedCount," selected"]}),e.jsx("div",{className:"w-px h-5 bg-surface-border"}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onSetPriority(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Priority..."}),Fe.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onClaim(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Claim for..."}),c.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsx("button",{onClick:t.onAssign,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isAssignPending?"Assigning...":"Assign to..."}),t.availableRoles.length>0&&e.jsxs("select",{onChange:s=>{s.target.value&&(t.onEscalate(s.target.value),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Escalate to..."}),t.availableRoles.map(s=>e.jsx("option",{value:s,children:s},s))]}),e.jsx("button",{onClick:t.onTriage,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isTriagePending?"Triaging...":"Triage"}),e.jsx("button",{onClick:t.onCancel,disabled:a,className:"text-xs py-1.5 px-3 rounded-md border border-status-error/40 text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50",children:t.isCancelPending?"Cancelling...":"Cancel"}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:t.onClearSelection,className:"text-xs text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"}),a&&e.jsx("span",{className:"text-xs text-text-tertiary animate-pulse",children:"Processing..."})]})}function Ve({open:t,onClose:a,selectedCount:c,selectedRoles:s,onSubmit:m,isPending:x}){const{isSuperAdmin:C}=pe(),u=q(),[i,g]=o.useState("user"),[y,E]=o.useState(null),[j,F]=o.useState(""),[r,h]=o.useState("30"),[R,v]=o.useState(0),_=o.useCallback(l=>v(l),[]),B=!C&&s.length===1?s[0]:void 0,{data:f,isLoading:N}=Ie({role:B,status:"active",limit:200}),M=o.useMemo(()=>{const l=(f==null?void 0:f.users)??[];if(!j.trim())return l;const k=j.toLowerCase();return l.filter(p=>{var P,S;return((P=p.display_name)==null?void 0:P.toLowerCase().includes(k))||((S=p.email)==null?void 0:S.toLowerCase().includes(k))})},[f==null?void 0:f.users,j]),T=()=>{g("user"),E(null),F(""),h("30"),v(0),a()},I=l=>{E(l),g("duration")},L=()=>{g("user")},O=()=>{if(!y)return;const l=r==="custom"?R:parseInt(r);!l||l<=0||m(y.id,l)};return e.jsx(D,{open:t,onClose:T,title:"Assign Escalations",children:e.jsxs("div",{className:"space-y-4",children:[i==="user"&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Select a user to assign"," ",e.jsx("span",{className:"font-medium text-text-primary",children:c})," ","escalation(s) to:"]}),e.jsx("input",{type:"text",value:j,onChange:l=>F(l.target.value),placeholder:"Search by name or email...",className:"input text-xs w-full",autoFocus:!0}),e.jsxs("div",{className:"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border",children:[N&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"Loading users..."}),!N&&M.length===0&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"No users found"}),M.map(l=>e.jsxs("button",{onClick:()=>I(l),className:"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary",children:l.display_name||l.external_id}),l.email&&e.jsx("p",{className:"text-[10px] text-text-tertiary",children:l.email})]},l.id))]}),e.jsx("div",{className:"flex justify-end pt-2",children:e.jsx("button",{onClick:T,className:"btn-secondary text-xs",children:"Cancel"})})]}),i==="duration"&&y&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Assign to"," ",e.jsx("span",{className:"font-medium text-text-primary",children:y.display_name||y.external_id})," ","for:"]}),e.jsxs("select",{value:r,onChange:l=>{h(l.target.value),v(0)},className:"select w-full text-sm",children:[u.map(l=>e.jsx("option",{value:l.value,children:l.label},l.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),r==="custom"&&e.jsx(K,{onChange:_,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:L,className:"btn-secondary text-xs",children:"Back"}),e.jsx("button",{onClick:O,disabled:x,className:"btn-primary text-xs",children:x?"Assigning...":"Assign"})]})]})]})})}function Ge({open:t,onClose:a,selectedCount:c,onSubmit:s,isPending:m}){const[x,C]=o.useState(""),u=()=>{s(x||void 0)};return e.jsx(D,{open:t,onClose:a,title:"Submit for AI Triage",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Submit ",e.jsx("span",{className:"font-medium text-text-primary",children:c})," escalation(s) for AI triage? The triage orchestrator will take over resolution."]}),e.jsxs("div",{children:[e.jsxs("label",{className:"text-xs font-medium text-text-secondary block mb-1",children:["Triage hint ",e.jsx("span",{className:"text-text-tertiary",children:"(optional)"})]}),e.jsx("input",{type:"text",value:x,onChange:i=>C(i.target.value),placeholder:"e.g., image_orientation",className:"input text-xs font-mono w-full"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Guides the triage workflow on what remediation to apply"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:u,disabled:m,className:"btn-primary text-xs",children:m?"Submitting...":"Submit for Triage"})]})]})})}function w(t,a,c){return s=>{t.mutate(s,{onSuccess:()=>{a(),c==null||c()}})}}function Ye(t){const a=()=>[...t.selectedIds];return{handleSetPriority:i=>{w(t.setPriority,t.clearSelection)({ids:a(),priority:i})},handleBulkClaim:i=>{w(t.bulkClaim,t.clearSelection)({ids:a(),durationMinutes:i})},handleBulkEscalate:i=>{w(t.bulkEscalate,t.clearSelection)({ids:a(),targetRole:i})},handleBulkTriage:i=>{w(t.bulkTriage,t.clearSelection,t.closeTriageModal)({ids:a(),hint:i})},handleBulkAssign:(i,g)=>{w(t.bulkAssign,t.clearSelection,t.closeAssignModal)({ids:a(),targetUserId:i,durationMinutes:g})},handleBulkCancel:()=>{w(t.bulkCancel,t.clearSelection,t.closeCancelModal)({ids:a()})}}}function Je({claimTarget:t,onClose:a,claimDuration:c,onDurationChange:s,claimDurations:m,onCustomClaimChange:x,onClaim:C,isPending:u}){return e.jsx(D,{open:!!t,onClose:a,title:"Claim Escalation",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claim ",e.jsx("span",{className:"font-medium text-text-primary",children:t==null?void 0:t.type})," for:"]}),e.jsxs("select",{value:c,onChange:i=>{s(i.target.value)},className:"select w-full text-sm",children:[m.map(i=>e.jsx("option",{value:i.value,children:i.label},i.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),c==="custom"&&e.jsx(K,{onChange:x,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:C,className:"btn-primary text-xs",disabled:u,children:u?"Claiming...":"Claim"})]})]})})}function yt(){we();const t=qe(),{filters:a,setFilter:c,pagination:s,sort:m,setSort:x}=Me({filters:{role:"",type:"",priority:"",status:"available",search:""}}),C=q(),[u,i]=o.useState(null),[g,y]=o.useState("30"),[E,j]=o.useState(0),F=o.useCallback(n=>j(n),[]),[r,h]=o.useState(new Set),[R,v]=o.useState(!1),[_,B]=o.useState(!1),[f,N]=o.useState(!1),M=Ce(),T=fe(),I=be(),L=ye(),O=je(),l=ve(),k=ke(),{data:p}=Be(),{data:P}=Se();o.useEffect(()=>{h(new Set)},[a.role,a.type,a.priority,a.status,s.page,s.pageSize]);const S=a.status||"",z=S==="available",Q=S==="claimed",U=Q?"pending":S==="resolved"?"resolved":S==="cancelled"?"cancelled":void 0,V={role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,limit:s.pageSize,offset:s.offset,sort_by:m.sort_by||"created_at",order:m.order||"desc"},W=Ne({...V,enabled:z}),X=Pe({status:U,claimed:Q||void 0,...V,enabled:!z}),Z=z?W:X,{data:A,isLoading:ee,error:$,refetch:te,isFetching:se}=Z,G=(A==null?void 0:A.escalations)??[],H=(a.search??"").toLowerCase(),b=H?G.filter(n=>{const d=[n.id,n.type,n.subtype,n.description,n.workflow_id,n.origin_id,n.role];return n.metadata&&d.push(...Object.values(n.metadata).map(String)),d.some(J=>J&&String(J).toLowerCase().includes(H))}):G,Y=H?b.length:(A==null?void 0:A.total)??0,{canBulk:ae}=Ae(),ne=o.useMemo(()=>{const n=new Set;for(const d of b)r.has(d.id)&&n.add(d.role);return[...n]},[b,r]),le=o.useCallback(()=>h(new Set),[]),ie=()=>{if(!u)return;const n=g==="custom"?E:parseInt(g);!n||n<=0||M.mutate({id:u.id,durationMinutes:n},{onSuccess:()=>{i(null),t(`/escalations/detail/${u.id}`)}})},{handleSetPriority:oe,handleBulkClaim:re,handleBulkEscalate:ce,handleBulkTriage:de,handleBulkAssign:ue,handleBulkCancel:me}=Ye({selectedIds:r,clearSelection:le,setPriority:T,bulkClaim:I,bulkEscalate:O,bulkTriage:l,bulkAssign:L,bulkCancel:k,closeTriageModal:()=>v(!1),closeAssignModal:()=>B(!1),closeCancelModal:()=>N(!1)}),xe=n=>{const d=new Set(r);d.has(n)?d.delete(n):d.add(n),h(d)},ge=()=>{r.size===b.length?h(new Set):h(new Set(b.map(n=>n.id)))},he=[ae?{key:"select",label:e.jsx("input",{type:"checkbox",checked:b.length>0&&r.size===b.length,onChange:ge,className:"rounded"}),render:n=>e.jsx("input",{type:"checkbox",checked:r.has(n.id),onChange:d=>{d.stopPropagation(),xe(n.id)},onClick:d=>d.stopPropagation(),className:"rounded"}),className:"w-10"}:{key:"spacer",label:"",render:()=>null,className:"w-10"},...Oe,{key:"actions",label:"",render:n=>e.jsx(Re,{children:e.jsx(_e,{icon:He,title:"Claim escalation",onClick:()=>i(n)})}),className:"w-16 text-right"}];return e.jsxs("div",{children:[e.jsx(ze,{title:"Available Escalations",docsHash:"#docs:dashboard.md:all-escalations"}),e.jsx($e,{filters:a,setFilter:c,roles:(p==null?void 0:p.roles)??[],types:(P==null?void 0:P.types)??[],showStatus:!0,actions:e.jsx(Ue,{onRefresh:()=>te(),isFetching:se,apiPath:`/escalations${z?"/available":""}?limit=${s.pageSize}&offset=${s.offset}${U?`&status=${U}`:""}${a.role?`&role=${a.role}`:""}${a.type?`&type=${a.type}`:""}${a.priority?`&priority=${a.priority}`:""}`})}),r.size>0&&e.jsx(Qe,{selectedCount:r.size,onClearSelection:()=>h(new Set),onSetPriority:oe,onClaim:re,onAssign:()=>B(!0),onEscalate:ce,onTriage:()=>v(!0),onCancel:()=>N(!0),isPriorityPending:T.isPending,isClaimPending:I.isPending,isAssignPending:L.isPending,isEscalatePending:O.isPending,isTriagePending:l.isPending,isCancelPending:k.isPending,availableRoles:(p==null?void 0:p.roles)??[]}),$&&e.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:$.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${$.message}`}),e.jsx(Te,{columns:he,data:b,keyFn:n=>n.id,onRowClick:n=>t(`/escalations/detail/${n.id}`,{state:{from:"/escalations/available"}}),isLoading:ee,emptyMessage:$?"Unable to load data":"No available escalations",sort:m,onSort:x}),e.jsx(Le,{page:s.page,totalPages:s.totalPages(Y),onPageChange:s.setPage,total:Y,pageSize:s.pageSize,onPageSizeChange:s.setPageSize}),e.jsx(Je,{claimTarget:u,onClose:()=>i(null),claimDuration:g,onDurationChange:n=>{y(n),j(0)},claimDurations:C,customClaimMinutes:E,onCustomClaimChange:F,onClaim:ie,isPending:M.isPending}),e.jsx(Ge,{open:R,onClose:()=>v(!1),selectedCount:r.size,onSubmit:de,isPending:l.isPending}),e.jsx(Ve,{open:_,onClose:()=>B(!1),selectedCount:r.size,selectedRoles:ne,onSubmit:ue,isPending:L.isPending}),e.jsx(Ee,{open:f,onClose:()=>N(!1),onConfirm:me,selectedCount:r.size,isPending:k.isPending,error:k.error})]})}export{yt as AvailableEscalationsPage};
2
+ //# sourceMappingURL=AvailableEscalationsPage-DIqdBCwe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AvailableEscalationsPage-B7gEfcw3.js","sources":["../../src/components/common/modal/BulkActionBar.tsx","../../src/components/common/modal/BulkAssignModal.tsx","../../src/components/common/modal/BulkTriageModal.tsx","../../src/pages/operator/helpers.ts","../../src/pages/operator/ClaimModal.tsx","../../src/pages/operator/AvailableEscalationsPage.tsx"],"sourcesContent":["import { PRIORITY_OPTIONS } from '../../../lib/constants';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\ninterface BulkActionBarProps {\n selectedCount: number;\n onClearSelection: () => void;\n onSetPriority: (priority: 1 | 2 | 3 | 4) => void;\n onClaim: (durationMinutes: number) => void;\n onAssign: () => void;\n onEscalate: (targetRole: string) => void;\n onTriage: () => void;\n onCancel: () => void;\n isPriorityPending: boolean;\n isClaimPending: boolean;\n isAssignPending: boolean;\n isEscalatePending: boolean;\n isTriagePending: boolean;\n isCancelPending: boolean;\n availableRoles: string[];\n}\n\nconst anyPending = (props: BulkActionBarProps) =>\n props.isPriorityPending || props.isClaimPending || props.isAssignPending || props.isEscalatePending || props.isTriagePending || props.isCancelPending;\n\nexport function BulkActionBar(props: BulkActionBarProps) {\n const disabled = anyPending(props);\n const claimDurations = useClaimDurations();\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4\">\n <span className=\"text-xs font-medium text-accent\">\n {props.selectedCount} selected\n </span>\n\n <div className=\"w-px h-5 bg-surface-border\" />\n\n {/* Priority */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onSetPriority(parseInt(e.target.value) as 1 | 2 | 3 | 4);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Priority...</option>\n {PRIORITY_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Claim */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onClaim(parseInt(e.target.value));\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Claim for...</option>\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Assign */}\n <button\n onClick={props.onAssign}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isAssignPending ? 'Assigning...' : 'Assign to...'}\n </button>\n\n {/* Escalate */}\n {props.availableRoles.length > 0 && (\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onEscalate(e.target.value);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Escalate to...</option>\n {props.availableRoles.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n )}\n\n {/* Triage */}\n <button\n onClick={props.onTriage}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isTriagePending ? 'Triaging...' : 'Triage'}\n </button>\n\n {/* Cancel */}\n <button\n onClick={props.onCancel}\n disabled={disabled}\n className=\"text-xs py-1.5 px-3 rounded-md border border-status-error/40 text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50\"\n >\n {props.isCancelPending ? 'Cancelling...' : 'Cancel'}\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Clear */}\n <button\n onClick={props.onClearSelection}\n className=\"text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Clear\n </button>\n\n {disabled && (\n <span className=\"text-xs text-text-tertiary animate-pulse\">Processing...</span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Modal } from './Modal';\nimport { CustomDurationPicker } from '../form/CustomDurationPicker';\nimport { useUsers } from '../../../api/users';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\nimport type { LTUserRecord } from '../../../api/types';\n\ninterface BulkAssignModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n /** Distinct roles of the selected escalations; scopes user list for admins */\n selectedRoles: string[];\n onSubmit: (targetUserId: string, durationMinutes: number) => void;\n isPending: boolean;\n}\n\nexport function BulkAssignModal({\n open,\n onClose,\n selectedCount,\n selectedRoles,\n onSubmit,\n isPending,\n}: BulkAssignModalProps) {\n const { isSuperAdmin } = useAuth();\n const claimDurations = useClaimDurations();\n const [step, setStep] = useState<'user' | 'duration'>('user');\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [search, setSearch] = useState('');\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n // Admins with a single role: scope to that role. Otherwise show all active users.\n const roleFilter =\n !isSuperAdmin && selectedRoles.length === 1 ? selectedRoles[0] : undefined;\n\n const { data: usersData, isLoading: usersLoading } = useUsers({\n role: roleFilter,\n status: 'active',\n limit: 200,\n });\n\n const filteredUsers = useMemo(() => {\n const users = usersData?.users ?? [];\n if (!search.trim()) return users;\n const q = search.toLowerCase();\n return users.filter(\n (u) =>\n u.display_name?.toLowerCase().includes(q) ||\n u.email?.toLowerCase().includes(q),\n );\n }, [usersData?.users, search]);\n\n const handleClose = () => {\n setStep('user');\n setSelectedUser(null);\n setSearch('');\n setDuration('30');\n setCustomMinutes(0);\n onClose();\n };\n\n const handleSelectUser = (user: LTUserRecord) => {\n setSelectedUser(user);\n setStep('duration');\n };\n\n const handleBack = () => {\n setStep('user');\n };\n\n const handleSubmit = () => {\n if (!selectedUser) return;\n const minutes = duration === 'custom' ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onSubmit(selectedUser.id, minutes);\n };\n\n return (\n <Modal open={open} onClose={handleClose} title=\"Assign Escalations\">\n <div className=\"space-y-4\">\n {step === 'user' && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Select a user to assign{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedCount}\n </span>{' '}\n escalation(s) to:\n </p>\n\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search by name or email...\"\n className=\"input text-xs w-full\"\n autoFocus\n />\n\n <div className=\"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border\">\n {usersLoading && (\n <p className=\"text-xs text-text-tertiary p-3\">\n Loading users...\n </p>\n )}\n {!usersLoading && filteredUsers.length === 0 && (\n <p className=\"text-xs text-text-tertiary p-3\">\n No users found\n </p>\n )}\n {filteredUsers.map((user) => (\n <button\n key={user.id}\n onClick={() => handleSelectUser(user)}\n className=\"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors\"\n >\n <p className=\"text-xs font-medium text-text-primary\">\n {user.display_name || user.external_id}\n </p>\n {user.email && (\n <p className=\"text-[10px] text-text-tertiary\">\n {user.email}\n </p>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"flex justify-end pt-2\">\n <button onClick={handleClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n </div>\n </>\n )}\n\n {step === 'duration' && selectedUser && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Assign to{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedUser.display_name || selectedUser.external_id}\n </span>{' '}\n for:\n </p>\n\n <select\n value={duration}\n onChange={(e) => { setDuration(e.target.value); setCustomMinutes(0); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {duration === 'custom' && (\n <CustomDurationPicker onChange={onCustomChange} autoFocus />\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={handleBack} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Assigning...' : 'Assign'}\n </button>\n </div>\n </>\n )}\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Modal } from './Modal';\n\ninterface BulkTriageModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n onSubmit: (hint?: string) => void;\n isPending: boolean;\n}\n\nexport function BulkTriageModal({\n open,\n onClose,\n selectedCount,\n onSubmit,\n isPending,\n}: BulkTriageModalProps) {\n const [hint, setHint] = useState('');\n\n const handleSubmit = () => {\n onSubmit(hint || undefined);\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Submit for AI Triage\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Submit <span className=\"font-medium text-text-primary\">{selectedCount}</span> escalation(s)\n for AI triage? The triage orchestrator will take over resolution.\n </p>\n\n <div>\n <label className=\"text-xs font-medium text-text-secondary block mb-1\">\n Triage hint <span className=\"text-text-tertiary\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={hint}\n onChange={(e) => setHint(e.target.value)}\n placeholder=\"e.g., image_orientation\"\n className=\"input text-xs font-mono w-full\"\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Guides the triage workflow on what remediation to apply\n </p>\n </div>\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={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Submitting...' : 'Submit for Triage'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\n\n/**\n * Create a bulk-action handler that calls a mutation and clears selection on success.\n */\nfunction bulkHandler<TData, TVariables>(\n mutation: UseMutationResult<TData, Error, TVariables>,\n clearSelection: () => void,\n afterSuccess?: () => void,\n) {\n return (variables: TVariables) => {\n mutation.mutate(variables, {\n onSuccess: () => {\n clearSelection();\n afterSuccess?.();\n },\n });\n };\n}\n\nexport function createBulkHandlers(deps: {\n selectedIds: Set<string>;\n clearSelection: () => void;\n setPriority: UseMutationResult<{ updated: number }, Error, { ids: string[]; priority: 1 | 2 | 3 | 4 }>;\n bulkClaim: UseMutationResult<{ claimed: number; skipped: number }, Error, { ids: string[]; durationMinutes: number }>;\n bulkEscalate: UseMutationResult<{ updated: number }, Error, { ids: string[]; targetRole: string }>;\n bulkTriage: UseMutationResult<{ triaged: number }, Error, { ids: string[]; hint?: string }>;\n bulkAssign: UseMutationResult<{ assigned: number; skipped: number }, Error, { ids: string[]; targetUserId: string; durationMinutes: number }>;\n bulkCancel: UseMutationResult<{ cancelled: number; skipped: number }, Error, { ids: string[] }>;\n closeTriageModal: () => void;\n closeAssignModal: () => void;\n closeCancelModal: () => void;\n}) {\n const ids = () => [...deps.selectedIds];\n\n const handleSetPriority = (priority: 1 | 2 | 3 | 4) => {\n bulkHandler(\n deps.setPriority,\n deps.clearSelection,\n )({ ids: ids(), priority });\n };\n\n const handleBulkClaim = (durationMinutes: number) => {\n bulkHandler(\n deps.bulkClaim,\n deps.clearSelection,\n )({ ids: ids(), durationMinutes });\n };\n\n const handleBulkEscalate = (targetRole: string) => {\n bulkHandler(\n deps.bulkEscalate,\n deps.clearSelection,\n )({ ids: ids(), targetRole });\n };\n\n const handleBulkTriage = (hint?: string) => {\n bulkHandler(\n deps.bulkTriage,\n deps.clearSelection,\n deps.closeTriageModal,\n )({ ids: ids(), hint });\n };\n\n const handleBulkAssign = (targetUserId: string, durationMinutes: number) => {\n bulkHandler(\n deps.bulkAssign,\n deps.clearSelection,\n deps.closeAssignModal,\n )({ ids: ids(), targetUserId, durationMinutes });\n };\n\n const handleBulkCancel = () => {\n bulkHandler(\n deps.bulkCancel,\n deps.clearSelection,\n deps.closeCancelModal,\n )({ ids: ids() });\n };\n\n return { handleSetPriority, handleBulkClaim, handleBulkEscalate, handleBulkTriage, handleBulkAssign, handleBulkCancel };\n}\n","import { Modal } from '../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport type { LTEscalationRecord } from '../../api/types';\n\ninterface ClaimModalProps {\n claimTarget: LTEscalationRecord | null;\n onClose: () => void;\n claimDuration: string;\n onDurationChange: (value: string) => void;\n claimDurations: Array<{ value: string; label: string }>;\n customClaimMinutes: number;\n onCustomClaimChange: (minutes: number) => void;\n onClaim: () => void;\n isPending: boolean;\n}\n\nexport function ClaimModal({\n claimTarget,\n onClose,\n claimDuration,\n onDurationChange,\n claimDurations,\n onCustomClaimChange,\n onClaim,\n isPending,\n}: ClaimModalProps) {\n return (\n <Modal\n open={!!claimTarget}\n onClose={onClose}\n title=\"Claim Escalation\"\n >\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Claim <span className=\"font-medium text-text-primary\">{claimTarget?.type}</span> for:\n </p>\n <select\n value={claimDuration}\n onChange={(e) => { onDurationChange(e.target.value); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {claimDuration === 'custom' && (\n <CustomDurationPicker onChange={onCustomClaimChange} autoFocus />\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={onClaim}\n className=\"btn-primary text-xs\"\n disabled={isPending}\n >\n {isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAccess } from '../../hooks/useAccess';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport {\n useEscalations,\n useAvailableEscalations,\n useEscalationTypes,\n useClaimEscalation,\n useSetEscalationPriority,\n useBulkClaimEscalations,\n useBulkAssignEscalations,\n useBulkEscalateToRole,\n useBulkTriageEscalations,\n useBulkCancelEscalations,\n} from '../../api/escalations';\nimport { ConfirmCancelModal } from '../../components/common/modal/ConfirmCancelModal';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { BulkActionBar } from '../../components/common/modal/BulkActionBar';\nimport { BulkAssignModal } from '../../components/common/modal/BulkAssignModal';\nimport { BulkTriageModal } from '../../components/common/modal/BulkTriageModal';\nimport { useClaimDurations } from '../../hooks/useClaimDurations';\nimport { Lock } from 'lucide-react';\nimport { ESCALATION_COLUMNS, EscalationFilterBar } from './escalation-columns';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { createBulkHandlers } from './helpers';\nimport { ClaimModal } from './ClaimModal';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function AvailableEscalationsPage() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', status: 'available', search: '' },\n });\n const claimDurations = useClaimDurations();\n const [claimTarget, setClaimTarget] = useState<LTEscalationRecord | null>(null);\n const [claimDuration, setClaimDuration] = useState('30');\n const [customClaimMinutes, setCustomClaimMinutes] = useState(0);\n const onCustomClaimChange = useCallback((m: number) => setCustomClaimMinutes(m), []);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [triageModalOpen, setTriageModalOpen] = useState(false);\n const [assignModalOpen, setAssignModalOpen] = useState(false);\n const [cancelModalOpen, setCancelModalOpen] = useState(false);\n\n const claim = useClaimEscalation();\n const setPriority = useSetEscalationPriority();\n const bulkClaim = useBulkClaimEscalations();\n const bulkAssign = useBulkAssignEscalations();\n const bulkEscalate = useBulkEscalateToRole();\n const bulkTriage = useBulkTriageEscalations();\n const bulkCancel = useBulkCancelEscalations();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n // Clear selections on filter/page changes\n useEffect(() => {\n setSelectedIds(new Set());\n }, [filters.role, filters.type, filters.priority, filters.status, pagination.page, pagination.pageSize]);\n\n const statusFilter = filters.status || '';\n const isAvailable = statusFilter === 'available';\n const isClaimed = statusFilter === 'claimed';\n const apiStatus = isClaimed ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : statusFilter === 'cancelled' ? 'cancelled'\n : isAvailable ? undefined\n : undefined;\n\n const sharedFilters = {\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n };\n\n const availableQuery = useAvailableEscalations({\n ...sharedFilters,\n enabled: isAvailable,\n });\n\n const escalationsQuery = useEscalations({\n status: apiStatus,\n claimed: isClaimed || undefined,\n ...sharedFilters,\n enabled: !isAvailable,\n });\n\n const activeQuery = isAvailable ? availableQuery : escalationsQuery;\n const { data, isLoading, error: queryError, refetch, isFetching } = activeQuery;\n\n const rawEscalations = data?.escalations ?? [];\n\n // Client-side search across visible fields + metadata values\n const searchTerm = (filters.search ?? '').toLowerCase();\n const escalations = searchTerm\n ? rawEscalations.filter((e) => {\n const fields = [e.id, e.type, e.subtype, e.description, e.workflow_id, e.origin_id, e.role];\n if (e.metadata) fields.push(...Object.values(e.metadata).map(String));\n return fields.some((f) => f && String(f).toLowerCase().includes(searchTerm));\n })\n : rawEscalations;\n\n const total = searchTerm\n ? escalations.length\n : data?.total ?? 0;\n const { canBulk: canBulkManage } = useAccess();\n\n const selectedRoles = useMemo(() => {\n const roles = new Set<string>();\n for (const esc of escalations) {\n if (selectedIds.has(esc.id)) roles.add(esc.role);\n }\n return [...roles];\n }, [escalations, selectedIds]);\n\n const clearSelection = useCallback(() => setSelectedIds(new Set()), []);\n\n const handleClaim = () => {\n if (!claimTarget) return;\n const minutes = claimDuration === 'custom' ? customClaimMinutes : parseInt(claimDuration);\n if (!minutes || minutes <= 0) return;\n claim.mutate(\n { id: claimTarget.id, durationMinutes: minutes },\n {\n onSuccess: () => {\n setClaimTarget(null);\n navigate(`/escalations/detail/${claimTarget.id}`);\n },\n },\n );\n };\n\n const {\n handleSetPriority,\n handleBulkClaim,\n handleBulkEscalate,\n handleBulkTriage,\n handleBulkAssign,\n handleBulkCancel,\n } = createBulkHandlers({\n selectedIds,\n clearSelection,\n setPriority,\n bulkClaim,\n bulkEscalate,\n bulkTriage,\n bulkAssign,\n bulkCancel,\n closeTriageModal: () => setTriageModalOpen(false),\n closeAssignModal: () => setAssignModalOpen(false),\n closeCancelModal: () => setCancelModalOpen(false),\n });\n\n const toggleSelect = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n\n const toggleAll = () => {\n if (selectedIds.size === escalations.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(escalations.map((e) => e.id)));\n }\n };\n\n const columns: Column<LTEscalationRecord>[] = [\n canBulkManage ? {\n key: 'select',\n label: (\n <input\n type=\"checkbox\"\n checked={escalations.length > 0 && selectedIds.size === escalations.length}\n onChange={toggleAll}\n className=\"rounded\"\n />\n ) as any,\n render: (row: LTEscalationRecord) => (\n <input\n type=\"checkbox\"\n checked={selectedIds.has(row.id)}\n onChange={(e) => {\n e.stopPropagation();\n toggleSelect(row.id);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-10',\n } : {\n key: 'spacer',\n label: '',\n render: () => null,\n className: 'w-10',\n },\n ...ESCALATION_COLUMNS,\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Lock}\n title=\"Claim escalation\"\n onClick={() => setClaimTarget(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Available Escalations\" docsHash=\"#docs:dashboard.md:all-escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations${isAvailable ? '/available' : ''}?limit=${pagination.pageSize}&offset=${pagination.offset}${apiStatus ? `&status=${apiStatus}` : ''}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {selectedIds.size > 0 && (\n <BulkActionBar\n selectedCount={selectedIds.size}\n onClearSelection={() => setSelectedIds(new Set())}\n onSetPriority={handleSetPriority}\n onClaim={handleBulkClaim}\n onAssign={() => setAssignModalOpen(true)}\n onEscalate={handleBulkEscalate}\n onTriage={() => setTriageModalOpen(true)}\n onCancel={() => setCancelModalOpen(true)}\n isPriorityPending={setPriority.isPending}\n isClaimPending={bulkClaim.isPending}\n isAssignPending={bulkAssign.isPending}\n isEscalatePending={bulkEscalate.isPending}\n isTriagePending={bulkTriage.isPending}\n isCancelPending={bulkCancel.isPending}\n availableRoles={rolesData?.roles ?? []}\n />\n )}\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={escalations}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/available' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No available escalations'}\n sort={sort}\n onSort={setSort}\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\n <ClaimModal\n claimTarget={claimTarget}\n onClose={() => setClaimTarget(null)}\n claimDuration={claimDuration}\n onDurationChange={(v) => { setClaimDuration(v); setCustomClaimMinutes(0); }}\n claimDurations={claimDurations}\n customClaimMinutes={customClaimMinutes}\n onCustomClaimChange={onCustomClaimChange}\n onClaim={handleClaim}\n isPending={claim.isPending}\n />\n\n <BulkTriageModal\n open={triageModalOpen}\n onClose={() => setTriageModalOpen(false)}\n selectedCount={selectedIds.size}\n onSubmit={handleBulkTriage}\n isPending={bulkTriage.isPending}\n />\n\n <BulkAssignModal\n open={assignModalOpen}\n onClose={() => setAssignModalOpen(false)}\n selectedCount={selectedIds.size}\n selectedRoles={selectedRoles}\n onSubmit={handleBulkAssign}\n isPending={bulkAssign.isPending}\n />\n\n <ConfirmCancelModal\n open={cancelModalOpen}\n onClose={() => setCancelModalOpen(false)}\n onConfirm={handleBulkCancel}\n selectedCount={selectedIds.size}\n isPending={bulkCancel.isPending}\n error={bulkCancel.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["anyPending","props","BulkActionBar","disabled","claimDurations","useClaimDurations","jsxs","jsx","e","PRIORITY_OPTIONS","opt","role","BulkAssignModal","open","onClose","selectedCount","selectedRoles","onSubmit","isPending","isSuperAdmin","useAuth","step","setStep","useState","selectedUser","setSelectedUser","search","setSearch","duration","setDuration","customMinutes","setCustomMinutes","onCustomChange","useCallback","m","roleFilter","usersData","usersLoading","useUsers","filteredUsers","useMemo","users","q","u","_a","_b","handleClose","handleSelectUser","user","handleBack","handleSubmit","minutes","Modal","Fragment","CustomDurationPicker","BulkTriageModal","hint","setHint","bulkHandler","mutation","clearSelection","afterSuccess","variables","createBulkHandlers","deps","ids","priority","durationMinutes","targetRole","targetUserId","ClaimModal","claimTarget","claimDuration","onDurationChange","onCustomClaimChange","onClaim","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","setClaimTarget","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","cancelModalOpen","setCancelModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","bulkCancel","useBulkCancelEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","isAvailable","isClaimed","apiStatus","sharedFilters","availableQuery","useAvailableEscalations","escalationsQuery","useEscalations","activeQuery","data","isLoading","queryError","refetch","isFetching","rawEscalations","searchTerm","escalations","fields","f","total","canBulkManage","useAccess","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","handleBulkCancel","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination","v","ConfirmCancelModal"],"mappings":"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"}
1
+ {"version":3,"file":"AvailableEscalationsPage-DIqdBCwe.js","sources":["../../src/components/common/modal/BulkActionBar.tsx","../../src/components/common/modal/BulkAssignModal.tsx","../../src/components/common/modal/BulkTriageModal.tsx","../../src/pages/operator/helpers.ts","../../src/pages/operator/ClaimModal.tsx","../../src/pages/operator/AvailableEscalationsPage.tsx"],"sourcesContent":["import { PRIORITY_OPTIONS } from '../../../lib/constants';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\ninterface BulkActionBarProps {\n selectedCount: number;\n onClearSelection: () => void;\n onSetPriority: (priority: 1 | 2 | 3 | 4) => void;\n onClaim: (durationMinutes: number) => void;\n onAssign: () => void;\n onEscalate: (targetRole: string) => void;\n onTriage: () => void;\n onCancel: () => void;\n isPriorityPending: boolean;\n isClaimPending: boolean;\n isAssignPending: boolean;\n isEscalatePending: boolean;\n isTriagePending: boolean;\n isCancelPending: boolean;\n availableRoles: string[];\n}\n\nconst anyPending = (props: BulkActionBarProps) =>\n props.isPriorityPending || props.isClaimPending || props.isAssignPending || props.isEscalatePending || props.isTriagePending || props.isCancelPending;\n\nexport function BulkActionBar(props: BulkActionBarProps) {\n const disabled = anyPending(props);\n const claimDurations = useClaimDurations();\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4\">\n <span className=\"text-xs font-medium text-accent\">\n {props.selectedCount} selected\n </span>\n\n <div className=\"w-px h-5 bg-surface-border\" />\n\n {/* Priority */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onSetPriority(parseInt(e.target.value) as 1 | 2 | 3 | 4);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Priority...</option>\n {PRIORITY_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Claim */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onClaim(parseInt(e.target.value));\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Claim for...</option>\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Assign */}\n <button\n onClick={props.onAssign}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isAssignPending ? 'Assigning...' : 'Assign to...'}\n </button>\n\n {/* Escalate */}\n {props.availableRoles.length > 0 && (\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onEscalate(e.target.value);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Escalate to...</option>\n {props.availableRoles.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n )}\n\n {/* Triage */}\n <button\n onClick={props.onTriage}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isTriagePending ? 'Triaging...' : 'Triage'}\n </button>\n\n {/* Cancel */}\n <button\n onClick={props.onCancel}\n disabled={disabled}\n className=\"text-xs py-1.5 px-3 rounded-md border border-status-error/40 text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50\"\n >\n {props.isCancelPending ? 'Cancelling...' : 'Cancel'}\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Clear */}\n <button\n onClick={props.onClearSelection}\n className=\"text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Clear\n </button>\n\n {disabled && (\n <span className=\"text-xs text-text-tertiary animate-pulse\">Processing...</span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Modal } from './Modal';\nimport { CustomDurationPicker } from '../form/CustomDurationPicker';\nimport { useUsers } from '../../../api/users';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\nimport type { LTUserRecord } from '../../../api/types';\n\ninterface BulkAssignModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n /** Distinct roles of the selected escalations; scopes user list for admins */\n selectedRoles: string[];\n onSubmit: (targetUserId: string, durationMinutes: number) => void;\n isPending: boolean;\n}\n\nexport function BulkAssignModal({\n open,\n onClose,\n selectedCount,\n selectedRoles,\n onSubmit,\n isPending,\n}: BulkAssignModalProps) {\n const { isSuperAdmin } = useAuth();\n const claimDurations = useClaimDurations();\n const [step, setStep] = useState<'user' | 'duration'>('user');\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [search, setSearch] = useState('');\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n // Admins with a single role: scope to that role. Otherwise show all active users.\n const roleFilter =\n !isSuperAdmin && selectedRoles.length === 1 ? selectedRoles[0] : undefined;\n\n const { data: usersData, isLoading: usersLoading } = useUsers({\n role: roleFilter,\n status: 'active',\n limit: 200,\n });\n\n const filteredUsers = useMemo(() => {\n const users = usersData?.users ?? [];\n if (!search.trim()) return users;\n const q = search.toLowerCase();\n return users.filter(\n (u) =>\n u.display_name?.toLowerCase().includes(q) ||\n u.email?.toLowerCase().includes(q),\n );\n }, [usersData?.users, search]);\n\n const handleClose = () => {\n setStep('user');\n setSelectedUser(null);\n setSearch('');\n setDuration('30');\n setCustomMinutes(0);\n onClose();\n };\n\n const handleSelectUser = (user: LTUserRecord) => {\n setSelectedUser(user);\n setStep('duration');\n };\n\n const handleBack = () => {\n setStep('user');\n };\n\n const handleSubmit = () => {\n if (!selectedUser) return;\n const minutes = duration === 'custom' ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onSubmit(selectedUser.id, minutes);\n };\n\n return (\n <Modal open={open} onClose={handleClose} title=\"Assign Escalations\">\n <div className=\"space-y-4\">\n {step === 'user' && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Select a user to assign{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedCount}\n </span>{' '}\n escalation(s) to:\n </p>\n\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search by name or email...\"\n className=\"input text-xs w-full\"\n autoFocus\n />\n\n <div className=\"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border\">\n {usersLoading && (\n <p className=\"text-xs text-text-tertiary p-3\">\n Loading users...\n </p>\n )}\n {!usersLoading && filteredUsers.length === 0 && (\n <p className=\"text-xs text-text-tertiary p-3\">\n No users found\n </p>\n )}\n {filteredUsers.map((user) => (\n <button\n key={user.id}\n onClick={() => handleSelectUser(user)}\n className=\"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors\"\n >\n <p className=\"text-xs font-medium text-text-primary\">\n {user.display_name || user.external_id}\n </p>\n {user.email && (\n <p className=\"text-[10px] text-text-tertiary\">\n {user.email}\n </p>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"flex justify-end pt-2\">\n <button onClick={handleClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n </div>\n </>\n )}\n\n {step === 'duration' && selectedUser && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Assign to{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedUser.display_name || selectedUser.external_id}\n </span>{' '}\n for:\n </p>\n\n <select\n value={duration}\n onChange={(e) => { setDuration(e.target.value); setCustomMinutes(0); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {duration === 'custom' && (\n <CustomDurationPicker onChange={onCustomChange} autoFocus />\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={handleBack} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Assigning...' : 'Assign'}\n </button>\n </div>\n </>\n )}\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Modal } from './Modal';\n\ninterface BulkTriageModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n onSubmit: (hint?: string) => void;\n isPending: boolean;\n}\n\nexport function BulkTriageModal({\n open,\n onClose,\n selectedCount,\n onSubmit,\n isPending,\n}: BulkTriageModalProps) {\n const [hint, setHint] = useState('');\n\n const handleSubmit = () => {\n onSubmit(hint || undefined);\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Submit for AI Triage\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Submit <span className=\"font-medium text-text-primary\">{selectedCount}</span> escalation(s)\n for AI triage? The triage orchestrator will take over resolution.\n </p>\n\n <div>\n <label className=\"text-xs font-medium text-text-secondary block mb-1\">\n Triage hint <span className=\"text-text-tertiary\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={hint}\n onChange={(e) => setHint(e.target.value)}\n placeholder=\"e.g., image_orientation\"\n className=\"input text-xs font-mono w-full\"\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Guides the triage workflow on what remediation to apply\n </p>\n </div>\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={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Submitting...' : 'Submit for Triage'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\n\n/**\n * Create a bulk-action handler that calls a mutation and clears selection on success.\n */\nfunction bulkHandler<TData, TVariables>(\n mutation: UseMutationResult<TData, Error, TVariables>,\n clearSelection: () => void,\n afterSuccess?: () => void,\n) {\n return (variables: TVariables) => {\n mutation.mutate(variables, {\n onSuccess: () => {\n clearSelection();\n afterSuccess?.();\n },\n });\n };\n}\n\nexport function createBulkHandlers(deps: {\n selectedIds: Set<string>;\n clearSelection: () => void;\n setPriority: UseMutationResult<{ updated: number }, Error, { ids: string[]; priority: 1 | 2 | 3 | 4 }>;\n bulkClaim: UseMutationResult<{ claimed: number; skipped: number }, Error, { ids: string[]; durationMinutes: number }>;\n bulkEscalate: UseMutationResult<{ updated: number }, Error, { ids: string[]; targetRole: string }>;\n bulkTriage: UseMutationResult<{ triaged: number }, Error, { ids: string[]; hint?: string }>;\n bulkAssign: UseMutationResult<{ assigned: number; skipped: number }, Error, { ids: string[]; targetUserId: string; durationMinutes: number }>;\n bulkCancel: UseMutationResult<{ cancelled: number; skipped: number }, Error, { ids: string[] }>;\n closeTriageModal: () => void;\n closeAssignModal: () => void;\n closeCancelModal: () => void;\n}) {\n const ids = () => [...deps.selectedIds];\n\n const handleSetPriority = (priority: 1 | 2 | 3 | 4) => {\n bulkHandler(\n deps.setPriority,\n deps.clearSelection,\n )({ ids: ids(), priority });\n };\n\n const handleBulkClaim = (durationMinutes: number) => {\n bulkHandler(\n deps.bulkClaim,\n deps.clearSelection,\n )({ ids: ids(), durationMinutes });\n };\n\n const handleBulkEscalate = (targetRole: string) => {\n bulkHandler(\n deps.bulkEscalate,\n deps.clearSelection,\n )({ ids: ids(), targetRole });\n };\n\n const handleBulkTriage = (hint?: string) => {\n bulkHandler(\n deps.bulkTriage,\n deps.clearSelection,\n deps.closeTriageModal,\n )({ ids: ids(), hint });\n };\n\n const handleBulkAssign = (targetUserId: string, durationMinutes: number) => {\n bulkHandler(\n deps.bulkAssign,\n deps.clearSelection,\n deps.closeAssignModal,\n )({ ids: ids(), targetUserId, durationMinutes });\n };\n\n const handleBulkCancel = () => {\n bulkHandler(\n deps.bulkCancel,\n deps.clearSelection,\n deps.closeCancelModal,\n )({ ids: ids() });\n };\n\n return { handleSetPriority, handleBulkClaim, handleBulkEscalate, handleBulkTriage, handleBulkAssign, handleBulkCancel };\n}\n","import { Modal } from '../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport type { LTEscalationRecord } from '../../api/types';\n\ninterface ClaimModalProps {\n claimTarget: LTEscalationRecord | null;\n onClose: () => void;\n claimDuration: string;\n onDurationChange: (value: string) => void;\n claimDurations: Array<{ value: string; label: string }>;\n customClaimMinutes: number;\n onCustomClaimChange: (minutes: number) => void;\n onClaim: () => void;\n isPending: boolean;\n}\n\nexport function ClaimModal({\n claimTarget,\n onClose,\n claimDuration,\n onDurationChange,\n claimDurations,\n onCustomClaimChange,\n onClaim,\n isPending,\n}: ClaimModalProps) {\n return (\n <Modal\n open={!!claimTarget}\n onClose={onClose}\n title=\"Claim Escalation\"\n >\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Claim <span className=\"font-medium text-text-primary\">{claimTarget?.type}</span> for:\n </p>\n <select\n value={claimDuration}\n onChange={(e) => { onDurationChange(e.target.value); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {claimDuration === 'custom' && (\n <CustomDurationPicker onChange={onCustomClaimChange} autoFocus />\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={onClaim}\n className=\"btn-primary text-xs\"\n disabled={isPending}\n >\n {isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAccess } from '../../hooks/useAccess';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport {\n useEscalations,\n useAvailableEscalations,\n useEscalationTypes,\n useClaimEscalation,\n useSetEscalationPriority,\n useBulkClaimEscalations,\n useBulkAssignEscalations,\n useBulkEscalateToRole,\n useBulkTriageEscalations,\n useBulkCancelEscalations,\n} from '../../api/escalations';\nimport { ConfirmCancelModal } from '../../components/common/modal/ConfirmCancelModal';\nimport { useRoles } from '../../api/roles';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { BulkActionBar } from '../../components/common/modal/BulkActionBar';\nimport { BulkAssignModal } from '../../components/common/modal/BulkAssignModal';\nimport { BulkTriageModal } from '../../components/common/modal/BulkTriageModal';\nimport { useClaimDurations } from '../../hooks/useClaimDurations';\nimport { Lock } from 'lucide-react';\nimport { ESCALATION_COLUMNS, EscalationFilterBar } from './escalation-columns';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { createBulkHandlers } from './helpers';\nimport { ClaimModal } from './ClaimModal';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function AvailableEscalationsPage() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', status: 'available', search: '' },\n });\n const claimDurations = useClaimDurations();\n const [claimTarget, setClaimTarget] = useState<LTEscalationRecord | null>(null);\n const [claimDuration, setClaimDuration] = useState('30');\n const [customClaimMinutes, setCustomClaimMinutes] = useState(0);\n const onCustomClaimChange = useCallback((m: number) => setCustomClaimMinutes(m), []);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [triageModalOpen, setTriageModalOpen] = useState(false);\n const [assignModalOpen, setAssignModalOpen] = useState(false);\n const [cancelModalOpen, setCancelModalOpen] = useState(false);\n\n const claim = useClaimEscalation();\n const setPriority = useSetEscalationPriority();\n const bulkClaim = useBulkClaimEscalations();\n const bulkAssign = useBulkAssignEscalations();\n const bulkEscalate = useBulkEscalateToRole();\n const bulkTriage = useBulkTriageEscalations();\n const bulkCancel = useBulkCancelEscalations();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n // Clear selections on filter/page changes\n useEffect(() => {\n setSelectedIds(new Set());\n }, [filters.role, filters.type, filters.priority, filters.status, pagination.page, pagination.pageSize]);\n\n const statusFilter = filters.status || '';\n const isAvailable = statusFilter === 'available';\n const isClaimed = statusFilter === 'claimed';\n const apiStatus = isClaimed ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : statusFilter === 'cancelled' ? 'cancelled'\n : isAvailable ? undefined\n : undefined;\n\n const sharedFilters = {\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n };\n\n const availableQuery = useAvailableEscalations({\n ...sharedFilters,\n enabled: isAvailable,\n });\n\n const escalationsQuery = useEscalations({\n status: apiStatus,\n claimed: isClaimed || undefined,\n ...sharedFilters,\n enabled: !isAvailable,\n });\n\n const activeQuery = isAvailable ? availableQuery : escalationsQuery;\n const { data, isLoading, error: queryError, refetch, isFetching } = activeQuery;\n\n const rawEscalations = data?.escalations ?? [];\n\n // Client-side search across visible fields + metadata values\n const searchTerm = (filters.search ?? '').toLowerCase();\n const escalations = searchTerm\n ? rawEscalations.filter((e) => {\n const fields = [e.id, e.type, e.subtype, e.description, e.workflow_id, e.origin_id, e.role];\n if (e.metadata) fields.push(...Object.values(e.metadata).map(String));\n return fields.some((f) => f && String(f).toLowerCase().includes(searchTerm));\n })\n : rawEscalations;\n\n const total = searchTerm\n ? escalations.length\n : data?.total ?? 0;\n const { canBulk: canBulkManage } = useAccess();\n\n const selectedRoles = useMemo(() => {\n const roles = new Set<string>();\n for (const esc of escalations) {\n if (selectedIds.has(esc.id)) roles.add(esc.role);\n }\n return [...roles];\n }, [escalations, selectedIds]);\n\n const clearSelection = useCallback(() => setSelectedIds(new Set()), []);\n\n const handleClaim = () => {\n if (!claimTarget) return;\n const minutes = claimDuration === 'custom' ? customClaimMinutes : parseInt(claimDuration);\n if (!minutes || minutes <= 0) return;\n claim.mutate(\n { id: claimTarget.id, durationMinutes: minutes },\n {\n onSuccess: () => {\n setClaimTarget(null);\n navigate(`/escalations/detail/${claimTarget.id}`);\n },\n },\n );\n };\n\n const {\n handleSetPriority,\n handleBulkClaim,\n handleBulkEscalate,\n handleBulkTriage,\n handleBulkAssign,\n handleBulkCancel,\n } = createBulkHandlers({\n selectedIds,\n clearSelection,\n setPriority,\n bulkClaim,\n bulkEscalate,\n bulkTriage,\n bulkAssign,\n bulkCancel,\n closeTriageModal: () => setTriageModalOpen(false),\n closeAssignModal: () => setAssignModalOpen(false),\n closeCancelModal: () => setCancelModalOpen(false),\n });\n\n const toggleSelect = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n\n const toggleAll = () => {\n if (selectedIds.size === escalations.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(escalations.map((e) => e.id)));\n }\n };\n\n const columns: Column<LTEscalationRecord>[] = [\n canBulkManage ? {\n key: 'select',\n label: (\n <input\n type=\"checkbox\"\n checked={escalations.length > 0 && selectedIds.size === escalations.length}\n onChange={toggleAll}\n className=\"rounded\"\n />\n ) as any,\n render: (row: LTEscalationRecord) => (\n <input\n type=\"checkbox\"\n checked={selectedIds.has(row.id)}\n onChange={(e) => {\n e.stopPropagation();\n toggleSelect(row.id);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-10',\n } : {\n key: 'spacer',\n label: '',\n render: () => null,\n className: 'w-10',\n },\n ...ESCALATION_COLUMNS,\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Lock}\n title=\"Claim escalation\"\n onClick={() => setClaimTarget(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Available Escalations\" docsHash=\"#docs:dashboard.md:all-escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations${isAvailable ? '/available' : ''}?limit=${pagination.pageSize}&offset=${pagination.offset}${apiStatus ? `&status=${apiStatus}` : ''}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\n />\n\n {selectedIds.size > 0 && (\n <BulkActionBar\n selectedCount={selectedIds.size}\n onClearSelection={() => setSelectedIds(new Set())}\n onSetPriority={handleSetPriority}\n onClaim={handleBulkClaim}\n onAssign={() => setAssignModalOpen(true)}\n onEscalate={handleBulkEscalate}\n onTriage={() => setTriageModalOpen(true)}\n onCancel={() => setCancelModalOpen(true)}\n isPriorityPending={setPriority.isPending}\n isClaimPending={bulkClaim.isPending}\n isAssignPending={bulkAssign.isPending}\n isEscalatePending={bulkEscalate.isPending}\n isTriagePending={bulkTriage.isPending}\n isCancelPending={bulkCancel.isPending}\n availableRoles={rolesData?.roles ?? []}\n />\n )}\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={escalations}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/available' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No available escalations'}\n sort={sort}\n onSort={setSort}\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\n <ClaimModal\n claimTarget={claimTarget}\n onClose={() => setClaimTarget(null)}\n claimDuration={claimDuration}\n onDurationChange={(v) => { setClaimDuration(v); setCustomClaimMinutes(0); }}\n claimDurations={claimDurations}\n customClaimMinutes={customClaimMinutes}\n onCustomClaimChange={onCustomClaimChange}\n onClaim={handleClaim}\n isPending={claim.isPending}\n />\n\n <BulkTriageModal\n open={triageModalOpen}\n onClose={() => setTriageModalOpen(false)}\n selectedCount={selectedIds.size}\n onSubmit={handleBulkTriage}\n isPending={bulkTriage.isPending}\n />\n\n <BulkAssignModal\n open={assignModalOpen}\n onClose={() => setAssignModalOpen(false)}\n selectedCount={selectedIds.size}\n selectedRoles={selectedRoles}\n onSubmit={handleBulkAssign}\n isPending={bulkAssign.isPending}\n />\n\n <ConfirmCancelModal\n open={cancelModalOpen}\n onClose={() => setCancelModalOpen(false)}\n onConfirm={handleBulkCancel}\n selectedCount={selectedIds.size}\n isPending={bulkCancel.isPending}\n error={bulkCancel.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["anyPending","props","BulkActionBar","disabled","claimDurations","useClaimDurations","jsxs","jsx","e","PRIORITY_OPTIONS","opt","role","BulkAssignModal","open","onClose","selectedCount","selectedRoles","onSubmit","isPending","isSuperAdmin","useAuth","step","setStep","useState","selectedUser","setSelectedUser","search","setSearch","duration","setDuration","customMinutes","setCustomMinutes","onCustomChange","useCallback","m","roleFilter","usersData","usersLoading","useUsers","filteredUsers","useMemo","users","q","u","_a","_b","handleClose","handleSelectUser","user","handleBack","handleSubmit","minutes","Modal","Fragment","CustomDurationPicker","BulkTriageModal","hint","setHint","bulkHandler","mutation","clearSelection","afterSuccess","variables","createBulkHandlers","deps","ids","priority","durationMinutes","targetRole","targetUserId","ClaimModal","claimTarget","claimDuration","onDurationChange","onCustomClaimChange","onClaim","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","setClaimTarget","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","cancelModalOpen","setCancelModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","bulkCancel","useBulkCancelEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","isAvailable","isClaimed","apiStatus","sharedFilters","availableQuery","useAvailableEscalations","escalationsQuery","useEscalations","activeQuery","data","isLoading","queryError","refetch","isFetching","rawEscalations","searchTerm","escalations","fields","f","total","canBulkManage","useAccess","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","handleBulkCancel","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination","v","ConfirmCancelModal"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as j}from"./bots-CDe2jXNx.js";import{a as d,X as y,ac as u,j as N,V as p}from"./vendor-icons-Dj2F0Jrb.js";function k({selected:s,onChange:n,placeholder:f}){const{data:c}=j({limit:100}),l=((c==null?void 0:c.bots)??[]).filter(t=>t.status==="active"),[o,r]=m.useState(!1),i=m.useRef(null);m.useEffect(()=>{const t=a=>{i.current&&!i.current.contains(a.target)&&r(!1)};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[]);const x=l.find(t=>t.external_id===s),h=f??"Invoking user (default)";return e.jsxs("div",{ref:i,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>r(!o),className:"flex items-center gap-1.5 w-full px-1 py-1.5 bg-transparent border-b border-surface-border/60 text-left cursor-pointer hover:border-accent/50 transition-colors focus:outline-none focus:border-accent/50",children:[s&&x?e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(d,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),x.display_name||x.external_id,e.jsx("span",{role:"button",onClick:t=>{t.stopPropagation(),n("")},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(y,{className:"w-2.5 h-2.5"})})]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs text-text-tertiary",children:[e.jsx(u,{className:"w-3 h-3 shrink-0"}),h]}),e.jsx(N,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${o?"rotate-180":""}`})]}),o&&e.jsxs("div",{className:"absolute z-20 mt-1 w-full bg-surface-raised border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:[e.jsxs("button",{type:"button",onClick:()=>{n(""),r(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${s?"text-text-primary hover:bg-surface-sunken":"bg-accent/[0.06] text-accent"}`,children:[e.jsx(u,{className:"w-3 h-3 shrink-0 text-text-tertiary"}),e.jsx("span",{className:"flex-1",children:"Invoking user"}),!s&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]}),l.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No bot accounts"}):l.map(t=>{const a=s===t.external_id;return e.jsxs("button",{type:"button",onClick:()=>{n(t.external_id),r(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${a?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(d,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{children:t.display_name||t.external_id}),t.display_name&&t.display_name!==t.external_id&&e.jsx("span",{className:"ml-1 text-text-tertiary font-mono",children:t.external_id})]}),a&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]},t.id)})]})]})}export{k as B};
2
- //# sourceMappingURL=BotPicker-fFE4GAaO.js.map
1
+ import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as j}from"./bots-cAzKkDtQ.js";import{a as d,X as y,ac as u,j as N,V as p}from"./vendor-icons-Dj2F0Jrb.js";function k({selected:s,onChange:n,placeholder:f}){const{data:c}=j({limit:100}),l=((c==null?void 0:c.bots)??[]).filter(t=>t.status==="active"),[o,r]=m.useState(!1),i=m.useRef(null);m.useEffect(()=>{const t=a=>{i.current&&!i.current.contains(a.target)&&r(!1)};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[]);const x=l.find(t=>t.external_id===s),h=f??"Invoking user (default)";return e.jsxs("div",{ref:i,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>r(!o),className:"flex items-center gap-1.5 w-full px-1 py-1.5 bg-transparent border-b border-surface-border/60 text-left cursor-pointer hover:border-accent/50 transition-colors focus:outline-none focus:border-accent/50",children:[s&&x?e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(d,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),x.display_name||x.external_id,e.jsx("span",{role:"button",onClick:t=>{t.stopPropagation(),n("")},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(y,{className:"w-2.5 h-2.5"})})]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs text-text-tertiary",children:[e.jsx(u,{className:"w-3 h-3 shrink-0"}),h]}),e.jsx(N,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${o?"rotate-180":""}`})]}),o&&e.jsxs("div",{className:"absolute z-20 mt-1 w-full bg-surface-raised border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:[e.jsxs("button",{type:"button",onClick:()=>{n(""),r(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${s?"text-text-primary hover:bg-surface-sunken":"bg-accent/[0.06] text-accent"}`,children:[e.jsx(u,{className:"w-3 h-3 shrink-0 text-text-tertiary"}),e.jsx("span",{className:"flex-1",children:"Invoking user"}),!s&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]}),l.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No bot accounts"}):l.map(t=>{const a=s===t.external_id;return e.jsxs("button",{type:"button",onClick:()=>{n(t.external_id),r(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${a?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(d,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{children:t.display_name||t.external_id}),t.display_name&&t.display_name!==t.external_id&&e.jsx("span",{className:"ml-1 text-text-tertiary font-mono",children:t.external_id})]}),a&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]},t.id)})]})]})}export{k as B};
2
+ //# sourceMappingURL=BotPicker-Dse2jW4b.js.map