@hotmeshio/long-tail 0.5.10 → 0.5.12

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 (257) 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 +8 -1
  4. package/build/api/diagnostics.js +5 -1
  5. package/build/api/escalations/list.d.ts +2 -0
  6. package/build/api/escalations/list.js +2 -0
  7. package/build/api/settings.d.ts +3 -2
  8. package/build/api/settings.js +13 -2
  9. package/build/api/workflows/invocation.d.ts +6 -0
  10. package/build/api/workflows/invocation.js +6 -2
  11. package/build/modules/features.d.ts +19 -0
  12. package/build/modules/features.js +16 -0
  13. package/build/modules/version.d.ts +16 -0
  14. package/build/modules/version.js +34 -0
  15. package/build/routes/controlplane.js +1 -0
  16. package/build/routes/diagnostics.js +32 -11
  17. package/build/routes/escalations/list.js +2 -0
  18. package/build/routes/workflows/invocation.js +12 -4
  19. package/build/sdk/index.d.ts +2 -0
  20. package/build/services/controlplane/index.js +3 -2
  21. package/build/services/controlplane/stream-messages-sql.d.ts +4 -3
  22. package/build/services/controlplane/stream-messages-sql.js +12 -7
  23. package/build/services/controlplane/types.d.ts +2 -0
  24. package/build/services/diagnostics/index.d.ts +53 -7
  25. package/build/services/diagnostics/index.js +124 -36
  26. package/build/services/diagnostics/patterns.d.ts +13 -3
  27. package/build/services/diagnostics/patterns.js +25 -14
  28. package/build/services/escalation/queries.d.ts +2 -0
  29. package/build/services/escalation/queries.js +84 -2
  30. package/build/services/escalation/sql.d.ts +7 -0
  31. package/build/services/escalation/sql.js +50 -1
  32. package/build/services/task/resolve.d.ts +5 -3
  33. package/build/services/task/resolve.js +9 -6
  34. package/build/services/task/sql.d.ts +6 -1
  35. package/build/services/task/sql.js +7 -1
  36. package/build/start/adapters.js +3 -0
  37. package/build/system/mcp-servers/admin/diagnostics.d.ts +11 -4
  38. package/build/system/mcp-servers/admin/diagnostics.js +34 -22
  39. package/build/system/mcp-servers/admin/escalations.d.ts +6 -0
  40. package/build/system/mcp-servers/admin/escalations.js +182 -54
  41. package/build/system/mcp-servers/admin/index.js +3 -3
  42. package/build/system/mcp-servers/admin/schemas.d.ts +101 -6
  43. package/build/system/mcp-servers/admin/schemas.js +43 -6
  44. package/build/system/mcp-servers/admin/workflows.js +23 -12
  45. package/build/system/seed/tool-manifests-admin.d.ts +1324 -562
  46. package/build/system/seed/tool-manifests-admin.js +10 -2
  47. package/build/tsconfig.tsbuildinfo +1 -1
  48. package/build/types/auth.d.ts +1 -1
  49. package/build/types/startup.d.ts +9 -0
  50. package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js → AdminDashboard-LTiYLuzq.js} +2 -2
  51. package/dashboard/dist/assets/{AdminDashboard-0LSslIQ7.js.map → AdminDashboard-LTiYLuzq.js.map} +1 -1
  52. package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.js → AgentConfigPage-nlOudfpZ.js} +7 -7
  53. package/dashboard/dist/assets/{AgentConfigPage-hqBr1540.js.map → AgentConfigPage-nlOudfpZ.js.map} +1 -1
  54. package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js +4 -0
  55. package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js.map +1 -0
  56. package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js +2 -0
  57. package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js.map +1 -0
  58. package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js +2 -0
  59. package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js.map +1 -0
  60. package/dashboard/dist/assets/{BotPicker-fFE4GAaO.js → BotPicker-BhKmq7M7.js} +2 -2
  61. package/dashboard/dist/assets/{BotPicker-fFE4GAaO.js.map → BotPicker-BhKmq7M7.js.map} +1 -1
  62. package/dashboard/dist/assets/CapabilitiesPage-DLIleX2L.js +2 -0
  63. package/dashboard/dist/assets/{CapabilitiesPage-DotZ7iQc.js.map → CapabilitiesPage-DLIleX2L.js.map} +1 -1
  64. package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js → CollapsibleSection-D7SVwNVk.js} +2 -2
  65. package/dashboard/dist/assets/{CollapsibleSection-D97SYypF.js.map → CollapsibleSection-D7SVwNVk.js.map} +1 -1
  66. package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js → CredentialsPage-fat5Z2U9.js} +2 -2
  67. package/dashboard/dist/assets/{CredentialsPage-C08U6dlv.js.map → CredentialsPage-fat5Z2U9.js.map} +1 -1
  68. package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js → CronLabel-OOP4P2mJ.js} +2 -2
  69. package/dashboard/dist/assets/{CronLabel-C2TuCl4h.js.map → CronLabel-OOP4P2mJ.js.map} +1 -1
  70. package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.js → CustomDurationPicker-COacSAXO.js} +2 -2
  71. package/dashboard/dist/assets/{CustomDurationPicker-C3zGsESx.js.map → CustomDurationPicker-COacSAXO.js.map} +1 -1
  72. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js → DropZone-Bfw2YLVS.js} +2 -2
  73. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js.map → DropZone-Bfw2YLVS.js.map} +1 -1
  74. package/dashboard/dist/assets/{ElapsedCell-DF4m0cv_.js → ElapsedCell-CkfCD-m7.js} +2 -2
  75. package/dashboard/dist/assets/{ElapsedCell-DF4m0cv_.js.map → ElapsedCell-CkfCD-m7.js.map} +1 -1
  76. package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js → EscalationsOverview-BmI8jxlh.js} +2 -2
  77. package/dashboard/dist/assets/{EscalationsOverview-blGOYKtJ.js.map → EscalationsOverview-BmI8jxlh.js.map} +1 -1
  78. package/dashboard/dist/assets/EventTable-CeKfFk3m.js +2 -0
  79. package/dashboard/dist/assets/EventTable-CeKfFk3m.js.map +1 -0
  80. package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js → GraphInvokePage-BZBPBCSq.js} +2 -2
  81. package/dashboard/dist/assets/{GraphInvokePage-QVAUHmjI.js.map → GraphInvokePage-BZBPBCSq.js.map} +1 -1
  82. package/dashboard/dist/assets/{HomePage-DvYgvCcO.js → HomePage-dM7U2tl6.js} +2 -2
  83. package/dashboard/dist/assets/{HomePage-DvYgvCcO.js.map → HomePage-dM7U2tl6.js.map} +1 -1
  84. package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js → ListToolbar-BJaCzAXS.js} +2 -2
  85. package/dashboard/dist/assets/{ListToolbar-D6tQ3ZG2.js.map → ListToolbar-BJaCzAXS.js.map} +1 -1
  86. package/dashboard/dist/assets/{McpOverview-BClbGYb8.js → McpOverview-CvnDG5OB.js} +2 -2
  87. package/dashboard/dist/assets/{McpOverview-BClbGYb8.js.map → McpOverview-CvnDG5OB.js.map} +1 -1
  88. package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.js → McpQueryDetailPage-DwmSIcIL.js} +3 -3
  89. package/dashboard/dist/assets/{McpQueryDetailPage-DHjfDRdm.js.map → McpQueryDetailPage-DwmSIcIL.js.map} +1 -1
  90. package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js +2 -0
  91. package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js.map +1 -0
  92. package/dashboard/dist/assets/McpRunDetailPage-8a6lsehv.js +2 -0
  93. package/dashboard/dist/assets/{McpRunDetailPage-DRbIZMU2.js.map → McpRunDetailPage-8a6lsehv.js.map} +1 -1
  94. package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js +2 -0
  95. package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js.map +1 -0
  96. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js → NamespacePill-D6btr6e8.js} +2 -2
  97. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js.map → NamespacePill-D6btr6e8.js.map} +1 -1
  98. package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js +2 -0
  99. package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js.map +1 -0
  100. package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js → PageHeader-Dk2Pe44Q.js} +2 -2
  101. package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js.map → PageHeader-Dk2Pe44Q.js.map} +1 -1
  102. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js → PageHeaderWithStats-DJQCZ0FR.js} +2 -2
  103. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js.map → PageHeaderWithStats-DJQCZ0FR.js.map} +1 -1
  104. package/dashboard/dist/assets/{ProcessDetailPage-DjQuNERz.js → ProcessDetailPage-ByyWCs2A.js} +2 -2
  105. package/dashboard/dist/assets/{ProcessDetailPage-DjQuNERz.js.map → ProcessDetailPage-ByyWCs2A.js.map} +1 -1
  106. package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js +2 -0
  107. package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js.map +1 -0
  108. package/dashboard/dist/assets/{RolePill-DQTT1s9v.js → RolePill-Du-aNnjR.js} +2 -2
  109. package/dashboard/dist/assets/{RolePill-DQTT1s9v.js.map → RolePill-Du-aNnjR.js.map} +1 -1
  110. package/dashboard/dist/assets/{RolesPage-CFCN_mRF.js → RolesPage-B2Kdf-L9.js} +2 -2
  111. package/dashboard/dist/assets/{RolesPage-CFCN_mRF.js.map → RolesPage-B2Kdf-L9.js.map} +1 -1
  112. package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js → RunAsSelector-BzkZXpSX.js} +2 -2
  113. package/dashboard/dist/assets/{RunAsSelector-sBxAvlRf.js.map → RunAsSelector-BzkZXpSX.js.map} +1 -1
  114. package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js +2 -0
  115. package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js.map +1 -0
  116. package/dashboard/dist/assets/SwimlaneTimeline-CjvfUkls.js +2 -0
  117. package/dashboard/dist/assets/SwimlaneTimeline-CjvfUkls.js.map +1 -0
  118. package/dashboard/dist/assets/{TagInput-B00uqhjX.js → TagInput-CZSeyesi.js} +2 -2
  119. package/dashboard/dist/assets/{TagInput-B00uqhjX.js.map → TagInput-CZSeyesi.js.map} +1 -1
  120. package/dashboard/dist/assets/{TaskDetailPage-CgFN5uWn.js → TaskDetailPage-BjHU6opi.js} +2 -2
  121. package/dashboard/dist/assets/{TaskDetailPage-CgFN5uWn.js.map → TaskDetailPage-BjHU6opi.js.map} +1 -1
  122. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js → TaskQueuePill-CQrXrSxk.js} +2 -2
  123. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js.map → TaskQueuePill-CQrXrSxk.js.map} +1 -1
  124. package/dashboard/dist/assets/{TasksListPage-qj25rRZL.js → TasksListPage-Bem44zd0.js} +2 -2
  125. package/dashboard/dist/assets/{TasksListPage-qj25rRZL.js.map → TasksListPage-Bem44zd0.js.map} +1 -1
  126. package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js → TimeAgo-CUIYqSt_.js} +2 -2
  127. package/dashboard/dist/assets/{TimeAgo-C7LylVjP.js.map → TimeAgo-CUIYqSt_.js.map} +1 -1
  128. package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.js → TimestampCell--tnreI1i.js} +2 -2
  129. package/dashboard/dist/assets/{TimestampCell-CrCtoBlo.js.map → TimestampCell--tnreI1i.js.map} +1 -1
  130. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js → ToolPill-O09jsTQM.js} +2 -2
  131. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js.map → ToolPill-O09jsTQM.js.map} +1 -1
  132. package/dashboard/dist/assets/{ToolTestPanel-DYGlB-QW.js → ToolTestPanel-OD99H7Pk.js} +2 -2
  133. package/dashboard/dist/assets/{ToolTestPanel-DYGlB-QW.js.map → ToolTestPanel-OD99H7Pk.js.map} +1 -1
  134. package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js → TopicDetailPage-rh_dsTJI.js} +3 -3
  135. package/dashboard/dist/assets/{TopicDetailPage-DLY6X_R6.js.map → TopicDetailPage-rh_dsTJI.js.map} +1 -1
  136. package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js → TopicsPage-CD_40_v-.js} +2 -2
  137. package/dashboard/dist/assets/{TopicsPage-C5nOLsLx.js.map → TopicsPage-CD_40_v-.js.map} +1 -1
  138. package/dashboard/dist/assets/{UserName-CgUZyiwm.js → UserName-C__c8BN0.js} +2 -2
  139. package/dashboard/dist/assets/{UserName-CgUZyiwm.js.map → UserName-C__c8BN0.js.map} +1 -1
  140. package/dashboard/dist/assets/WorkflowExecutionPage-Bw6QdtUO.js +2 -0
  141. package/dashboard/dist/assets/{WorkflowExecutionPage-CDr5CTM2.js.map → WorkflowExecutionPage-Bw6QdtUO.js.map} +1 -1
  142. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js → WorkflowPill-CS-IsR0U.js} +2 -2
  143. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js.map → WorkflowPill-CS-IsR0U.js.map} +1 -1
  144. package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js +2 -0
  145. package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js.map +1 -0
  146. package/dashboard/dist/assets/{WorkflowsOverview-CaMeZwde.js → WorkflowsOverview-BRc0QbA7.js} +2 -2
  147. package/dashboard/dist/assets/{WorkflowsOverview-CaMeZwde.js.map → WorkflowsOverview-BRc0QbA7.js.map} +1 -1
  148. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js → YamlWorkflowDetailPage-DdzspNQR.js} +2 -2
  149. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3uyCiIX.js.map → YamlWorkflowDetailPage-DdzspNQR.js.map} +1 -1
  150. package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js → YamlWorkflowsPage-Djw5ZbgQ.js} +2 -2
  151. package/dashboard/dist/assets/{YamlWorkflowsPage-DRnYgsvA.js.map → YamlWorkflowsPage-Djw5ZbgQ.js.map} +1 -1
  152. package/dashboard/dist/assets/{agents-HMkTc425.js → agents-xstNkF6c.js} +2 -2
  153. package/dashboard/dist/assets/{agents-HMkTc425.js.map → agents-xstNkF6c.js.map} +1 -1
  154. package/dashboard/dist/assets/api-path-u2Jf9QXS.js +2 -0
  155. package/dashboard/dist/assets/api-path-u2Jf9QXS.js.map +1 -0
  156. package/dashboard/dist/assets/{bots-CDe2jXNx.js → bots-BztAI0s_.js} +2 -2
  157. package/dashboard/dist/assets/{bots-CDe2jXNx.js.map → bots-BztAI0s_.js.map} +1 -1
  158. package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js → capabilities-CEDwtxNL.js} +2 -2
  159. package/dashboard/dist/assets/{capabilities-DhnM7Ztb.js.map → capabilities-CEDwtxNL.js.map} +1 -1
  160. package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js → controlplane-BlGEsRKe.js} +2 -2
  161. package/dashboard/dist/assets/{controlplane-BwIJ9ZC_.js.map → controlplane-BlGEsRKe.js.map} +1 -1
  162. package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js → escalation-columns-nVYVt7Gl.js} +2 -2
  163. package/dashboard/dist/assets/{escalation-columns-BKqSywVA.js.map → escalation-columns-nVYVt7Gl.js.map} +1 -1
  164. package/dashboard/dist/assets/{escalation-Djk5XKmX.js → escalation-iI4QKlP-.js} +2 -2
  165. package/dashboard/dist/assets/{escalation-Djk5XKmX.js.map → escalation-iI4QKlP-.js.map} +1 -1
  166. package/dashboard/dist/assets/{index-BW-fIquS.js → index-B5qsp8lb.js} +2 -2
  167. package/dashboard/dist/assets/{index-BW-fIquS.js.map → index-B5qsp8lb.js.map} +1 -1
  168. package/dashboard/dist/assets/{index-DBi9Q9Hw.js → index-B7VC0vjf.js} +2 -2
  169. package/dashboard/dist/assets/{index-DBi9Q9Hw.js.map → index-B7VC0vjf.js.map} +1 -1
  170. package/dashboard/dist/assets/{index-CPIYW81T.js → index-BUmnJ4eT.js} +2 -2
  171. package/dashboard/dist/assets/{index-CPIYW81T.js.map → index-BUmnJ4eT.js.map} +1 -1
  172. package/dashboard/dist/assets/{index-BNkpns_E.js → index-CAqEy2Db.js} +2 -2
  173. package/dashboard/dist/assets/{index-BNkpns_E.js.map → index-CAqEy2Db.js.map} +1 -1
  174. package/dashboard/dist/assets/{index-BYpWOUEe.js → index-CMviPjXQ.js} +2 -2
  175. package/dashboard/dist/assets/{index-BYpWOUEe.js.map → index-CMviPjXQ.js.map} +1 -1
  176. package/dashboard/dist/assets/index-CP0JEQhZ.js +6 -0
  177. package/dashboard/dist/assets/{index-E2hQ8DIi.js.map → index-CP0JEQhZ.js.map} +1 -1
  178. package/dashboard/dist/assets/index-CUfgt3mV.js +2 -0
  179. package/dashboard/dist/assets/index-CUfgt3mV.js.map +1 -0
  180. package/dashboard/dist/assets/index-ClvYSNZd.css +1 -0
  181. package/dashboard/dist/assets/{index-BFQ2t-p1.js → index-D1xVY4JR.js} +27 -27
  182. package/dashboard/dist/assets/index-D1xVY4JR.js.map +1 -0
  183. package/dashboard/dist/assets/{index-rUST2YsO.js → index-DPLy-jwO.js} +2 -2
  184. package/dashboard/dist/assets/{index-rUST2YsO.js.map → index-DPLy-jwO.js.map} +1 -1
  185. package/dashboard/dist/assets/{index-DRIJM1L-.js → index-DjJ6VCuc.js} +2 -2
  186. package/dashboard/dist/assets/{index-DRIJM1L-.js.map → index-DjJ6VCuc.js.map} +1 -1
  187. package/dashboard/dist/assets/{index-Dhy2PVAw.js → index-Dsi5o7dx.js} +2 -2
  188. package/dashboard/dist/assets/{index-Dhy2PVAw.js.map → index-Dsi5o7dx.js.map} +1 -1
  189. package/dashboard/dist/assets/{index-mEQ6kCnt.js → index-DzVYjoex.js} +3 -3
  190. package/dashboard/dist/assets/{index-mEQ6kCnt.js.map → index-DzVYjoex.js.map} +1 -1
  191. package/dashboard/dist/assets/index-FuhiJuHL.js +2 -0
  192. package/dashboard/dist/assets/index-FuhiJuHL.js.map +1 -0
  193. package/dashboard/dist/assets/{knowledge-jQE3dBVi.js → knowledge-BKg0cr39.js} +2 -2
  194. package/dashboard/dist/assets/{knowledge-jQE3dBVi.js.map → knowledge-BKg0cr39.js.map} +1 -1
  195. package/dashboard/dist/assets/{mcp-DtEGfZiz.js → mcp-CVdHpKlz.js} +2 -2
  196. package/dashboard/dist/assets/{mcp-DtEGfZiz.js.map → mcp-CVdHpKlz.js.map} +1 -1
  197. package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js → mcp-query-CYxZcbwQ.js} +2 -2
  198. package/dashboard/dist/assets/{mcp-query-CiTLVuDC.js.map → mcp-query-CYxZcbwQ.js.map} +1 -1
  199. package/dashboard/dist/assets/{pipelines-ClNdzuUK.js → pipelines-BOEv7P6O.js} +2 -2
  200. package/dashboard/dist/assets/{pipelines-ClNdzuUK.js.map → pipelines-BOEv7P6O.js.map} +1 -1
  201. package/dashboard/dist/assets/{roles-BmHbRaPT.js → roles-c5cV2QYQ.js} +2 -2
  202. package/dashboard/dist/assets/{roles-BmHbRaPT.js.map → roles-c5cV2QYQ.js.map} +1 -1
  203. package/dashboard/dist/assets/{tasks-BPONxLcq.js → tasks-JV3BjeEF.js} +2 -2
  204. package/dashboard/dist/assets/{tasks-BPONxLcq.js.map → tasks-JV3BjeEF.js.map} +1 -1
  205. package/dashboard/dist/assets/{topics-XREPRxwo.js → topics-BDaPnhnQ.js} +2 -2
  206. package/dashboard/dist/assets/{topics-XREPRxwo.js.map → topics-BDaPnhnQ.js.map} +1 -1
  207. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js +2 -0
  208. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js.map +1 -0
  209. package/dashboard/dist/assets/{useEventHooks-M7SaEfel.js → useEventHooks-a7Dnh8G4.js} +2 -2
  210. package/dashboard/dist/assets/{useEventHooks-M7SaEfel.js.map → useEventHooks-a7Dnh8G4.js.map} +1 -1
  211. package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js → useNamespace-BSwEV0e9.js} +2 -2
  212. package/dashboard/dist/assets/{useNamespace-BQHGkdBv.js.map → useNamespace-BSwEV0e9.js.map} +1 -1
  213. package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js → useYamlActivityEvents-BuqvL-cn.js} +2 -2
  214. package/dashboard/dist/assets/{useYamlActivityEvents-B7JtUGSE.js.map → useYamlActivityEvents-BuqvL-cn.js.map} +1 -1
  215. package/dashboard/dist/assets/{users-BpjSNhQe.js → users-Pn85K_3C.js} +2 -2
  216. package/dashboard/dist/assets/{users-BpjSNhQe.js.map → users-Pn85K_3C.js.map} +1 -1
  217. package/dashboard/dist/assets/{vendor-icons-Dj2F0Jrb.js → vendor-icons-D5ycKPA2.js} +114 -109
  218. package/dashboard/dist/assets/vendor-icons-D5ycKPA2.js.map +1 -0
  219. package/dashboard/dist/assets/{workflows-k4jE0ECC.js → workflows-DF-9Voyi.js} +2 -2
  220. package/dashboard/dist/assets/{workflows-k4jE0ECC.js.map → workflows-DF-9Voyi.js.map} +1 -1
  221. package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js → yaml-workflows-2roKaSSK.js} +2 -2
  222. package/dashboard/dist/assets/{yaml-workflows-DpviSLEL.js.map → yaml-workflows-2roKaSSK.js.map} +1 -1
  223. package/dashboard/dist/index.html +3 -3
  224. package/docs/api/mcp/admin.md +242 -5
  225. package/docs/mcp.md +102 -0
  226. package/package.json +1 -1
  227. package/dashboard/dist/assets/AgentDetailPage-bnXR1ezD.js +0 -4
  228. package/dashboard/dist/assets/AgentDetailPage-bnXR1ezD.js.map +0 -1
  229. package/dashboard/dist/assets/AgentsPage-tJIlrnfM.js +0 -2
  230. package/dashboard/dist/assets/AgentsPage-tJIlrnfM.js.map +0 -1
  231. package/dashboard/dist/assets/AvailableEscalationsPage-B7gEfcw3.js +0 -2
  232. package/dashboard/dist/assets/AvailableEscalationsPage-B7gEfcw3.js.map +0 -1
  233. package/dashboard/dist/assets/CapabilitiesPage-DotZ7iQc.js +0 -2
  234. package/dashboard/dist/assets/EventTable-DzrMH-ux.js +0 -2
  235. package/dashboard/dist/assets/EventTable-DzrMH-ux.js.map +0 -1
  236. package/dashboard/dist/assets/McpQueryPage-qtEuMDrd.js +0 -2
  237. package/dashboard/dist/assets/McpQueryPage-qtEuMDrd.js.map +0 -1
  238. package/dashboard/dist/assets/McpRunDetailPage-DRbIZMU2.js +0 -2
  239. package/dashboard/dist/assets/McpRunsPage-CMfwXQ4R.js +0 -2
  240. package/dashboard/dist/assets/McpRunsPage-CMfwXQ4R.js.map +0 -1
  241. package/dashboard/dist/assets/OperatorDashboard-Dq2pfV68.js +0 -2
  242. package/dashboard/dist/assets/OperatorDashboard-Dq2pfV68.js.map +0 -1
  243. package/dashboard/dist/assets/ProcessesListPage-vJimii8-.js +0 -2
  244. package/dashboard/dist/assets/ProcessesListPage-vJimii8-.js.map +0 -1
  245. package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js +0 -2
  246. package/dashboard/dist/assets/SwimlaneTimeline-2Eet4OOL.js.map +0 -1
  247. package/dashboard/dist/assets/WorkflowExecutionPage-CDr5CTM2.js +0 -2
  248. package/dashboard/dist/assets/WorkflowsDashboard-tCBP0i0Y.js +0 -2
  249. package/dashboard/dist/assets/WorkflowsDashboard-tCBP0i0Y.js.map +0 -1
  250. package/dashboard/dist/assets/index-BFQ2t-p1.js.map +0 -1
  251. package/dashboard/dist/assets/index-Cydgj_Co.js +0 -2
  252. package/dashboard/dist/assets/index-Cydgj_Co.js.map +0 -1
  253. package/dashboard/dist/assets/index-DSki_Ub6.css +0 -1
  254. package/dashboard/dist/assets/index-E2hQ8DIi.js +0 -6
  255. package/dashboard/dist/assets/index-u08vQUaw.js +0 -2
  256. package/dashboard/dist/assets/index-u08vQUaw.js.map +0 -1
  257. package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  # Admin
2
2
 
3
- Unified system management — tasks, escalations, workflows, agents, bot accounts, control plane, pipelines, topics, users, roles, and settings.
3
+ Unified system management — tasks, escalations, workflows, diagnostics, agents, bot accounts, control plane, pipelines, topics, users, roles, and settings.
4
4
 
5
5
  | Property | Value |
6
6
  |----------|-------|
@@ -9,6 +9,10 @@ Unified system management — tasks, escalations, workflows, agents, bot account
9
9
  | AI required | No |
10
10
  | Credential providers | — |
11
11
 
12
+ ## Access
13
+
14
+ Each tool below is marked **Read-safe**. A service-account key scoped `mcp:read` can call the Read-safe tools; the rest (Read-safe: No) change state and require an `mcp:full` key, and the account's role must permit the action on the target. See the MCP guide's [Access](../../mcp.md#access-which-tools-and-which-records) section for the full model.
15
+
12
16
  ## Compile Hints
13
17
 
14
18
  Admin tools modify system configuration. certify_workflow and decertify_workflow change interceptor behavior.
@@ -52,7 +56,8 @@ Get all tasks and escalations for a process (origin_id).
52
56
 
53
57
  ### find_escalations
54
58
 
55
- Search escalations with optional filters by status, role, type, priority.
59
+ Search escalations with optional filters and sorting. Returns full records
60
+ including `metadata`, workflow linkage, assignment, and `signal_key`.
56
61
 
57
62
  | | |
58
63
  |---|---|
@@ -62,13 +67,48 @@ Search escalations with optional filters by status, role, type, priority.
62
67
 
63
68
  | Field | Type | Required | Description |
64
69
  |-------|------|----------|-------------|
65
- | status | string | No | pending or resolved |
70
+ | status | string | No | pending, resolved, or cancelled |
66
71
  | role | string | No | Filter by role |
67
72
  | type | string | No | Filter by type |
73
+ | subtype | string | No | Filter by subtype |
74
+ | assigned_to | string | No | Filter by assigned user UUID (active claim holder) |
75
+ | search | string | No | Free-text search across description, type/subtype, role, workflow/origin id, and metadata values (e.g. a correlation key like an order id). Server-side over the full result set. |
68
76
  | priority | integer | No | Filter by priority |
77
+ | sort_by | string | No | Sort column: created_at, priority, updated_at |
78
+ | order | string | No | Sort direction (asc, desc) for sort_by |
69
79
  | limit | integer | No | Max results |
70
80
  | offset | integer | No | Pagination offset |
71
81
 
82
+ ### get_escalation
83
+
84
+ Get a single escalation by ID — the full record including metadata, payloads,
85
+ `signal_key`, and assignment state.
86
+
87
+ | | |
88
+ |---|---|
89
+ | Read-safe | Yes |
90
+
91
+ **Parameters:**
92
+
93
+ | Field | Type | Required | Description |
94
+ |-------|------|----------|-------------|
95
+ | id | string | Yes | Escalation ID |
96
+
97
+ ### get_escalations_by_workflow
98
+
99
+ List all escalations linked to a workflow ID, newest first. Returns full records
100
+ including metadata.
101
+
102
+ | | |
103
+ |---|---|
104
+ | Read-safe | Yes |
105
+
106
+ **Parameters:**
107
+
108
+ | Field | Type | Required | Description |
109
+ |-------|------|----------|-------------|
110
+ | workflow_id | string | Yes | Workflow ID to list escalations for |
111
+
72
112
  ### get_escalation_stats
73
113
 
74
114
  Aggregated escalation statistics: pending, claimed, created, resolved counts with breakdown by role.
@@ -98,6 +138,85 @@ Claim an escalation for a time-boxed lock.
98
138
  | id | string | Yes | Escalation ID |
99
139
  | duration_minutes | integer | No | Lock duration |
100
140
 
141
+ ### release_escalation
142
+
143
+ Release a claimed escalation back to the available pool (reverses `claim_escalation`).
144
+
145
+ | | |
146
+ |---|---|
147
+ | Read-safe | No |
148
+
149
+ **Parameters:**
150
+
151
+ | Field | Type | Required | Description |
152
+ |-------|------|----------|-------------|
153
+ | id | string | Yes | Escalation ID to release |
154
+
155
+ ### resolve_escalation
156
+
157
+ Resolve a pending escalation with a human-provided payload. Routes by escalation
158
+ shape: efficient (`signal_key`) escalations resume the waiting workflow in place;
159
+ legacy paths signal via routing metadata or re-run the original workflow. Password
160
+ fields in the payload are replaced with ephemeral tokens.
161
+
162
+ | | |
163
+ |---|---|
164
+ | Read-safe | No |
165
+
166
+ **Parameters:**
167
+
168
+ | Field | Type | Required | Description |
169
+ |-------|------|----------|-------------|
170
+ | id | string | Yes | Escalation ID to resolve |
171
+ | resolverPayload | object | Yes | Resolution payload |
172
+
173
+ ### resolve_by_signal_key
174
+
175
+ Resolve an efficient (atomic) escalation directly by its `signal_key` and resume
176
+ the waiting workflow in place. For callers that know the deterministic signal id
177
+ and want to skip the id lookup.
178
+
179
+ | | |
180
+ |---|---|
181
+ | Read-safe | No |
182
+
183
+ **Parameters:**
184
+
185
+ | Field | Type | Required | Description |
186
+ |-------|------|----------|-------------|
187
+ | signalKey | string | Yes | Deterministic signal key of the escalation |
188
+ | resolverPayload | object | Yes | Resolution payload |
189
+
190
+ ### escalate_escalation
191
+
192
+ Route a pending escalation to a different role per the escalation chain.
193
+
194
+ | | |
195
+ |---|---|
196
+ | Read-safe | No |
197
+
198
+ **Parameters:**
199
+
200
+ | Field | Type | Required | Description |
201
+ |-------|------|----------|-------------|
202
+ | id | string | Yes | Escalation ID |
203
+ | targetRole | string | Yes | Role to route the escalation to |
204
+
205
+ ### cancel_escalation
206
+
207
+ Permanently cancel a pending escalation (e.g. its workflow has terminated and can
208
+ never receive the resolution signal). Preserved for audit.
209
+
210
+ | | |
211
+ |---|---|
212
+ | Read-safe | No |
213
+
214
+ **Parameters:**
215
+
216
+ | Field | Type | Required | Description |
217
+ |-------|------|----------|-------------|
218
+ | id | string | Yes | Escalation ID to cancel |
219
+
101
220
  ### release_expired_claims
102
221
 
103
222
  Release all escalation claims that exceeded their lock duration.
@@ -125,7 +244,8 @@ Resolve escalations for triage and start mcpTriage workflows.
125
244
 
126
245
  ### find_by_metadata
127
246
 
128
- Find escalations by a metadata key-value pair.
247
+ Find escalations by a metadata key-value pair — e.g. a correlation key (order id,
248
+ ticket id, request id) written into metadata when the escalation was raised.
129
249
 
130
250
  | | |
131
251
  |---|---|
@@ -223,6 +343,20 @@ Escalate multiple escalations to a different role.
223
343
  | ids | string[] | Yes | Escalation IDs |
224
344
  | targetRole | string | Yes | Target role |
225
345
 
346
+ ### bulk_cancel
347
+
348
+ Cancel multiple pending escalations in a single operation.
349
+
350
+ | | |
351
+ |---|---|
352
+ | Read-safe | No |
353
+
354
+ **Parameters:**
355
+
356
+ | Field | Type | Required | Description |
357
+ |-------|------|----------|-------------|
358
+ | ids | string[] | Yes | Escalation IDs to cancel |
359
+
226
360
  ### update_priority
227
361
 
228
362
  Update the priority of multiple escalations.
@@ -323,7 +457,9 @@ Start a certified workflow by type. Returns workflow ID immediately.
323
457
 
324
458
  ### get_workflow_status
325
459
 
326
- Check workflow status and result. Returns status (0=complete, positive=running) and result if complete.
460
+ Check workflow status and result. Returns status (`running` | `complete`) and the
461
+ result when complete. Resolution is namespace-aware — pass `app_id` to read a
462
+ workflow (e.g. a child) running in a non-default HotMesh namespace.
327
463
 
328
464
  | | |
329
465
  |---|---|
@@ -334,6 +470,7 @@ Check workflow status and result. Returns status (0=complete, positive=running)
334
470
  | Field | Type | Required | Description |
335
471
  |-------|------|----------|-------------|
336
472
  | workflow_id | string | Yes | Workflow ID to check |
473
+ | app_id | string | No | HotMesh namespace for resolution (default: durable) |
337
474
 
338
475
  ## MCP Servers
339
476
 
@@ -949,6 +1086,106 @@ Browse stream messages with pagination, filtering, and sorting.
949
1086
  | workflow_name | string | No | Filter by workflow name |
950
1087
  | jid | string | No | Filter by job ID |
951
1088
  | aid | string | No | Filter by activity ID |
1089
+ | dad | string | No | Filter by dimension/ancestor path (worker-only) — pins one execution among siblings sharing an aid |
1090
+
1091
+ ## Diagnostics
1092
+
1093
+ Read-only inspection of workflow execution. These tools never mutate state —
1094
+ HotMesh execution only moves forward and cannot be unwound, so they describe what
1095
+ happened and where to look, not how to "fix" a job.
1096
+
1097
+ **Read this first — what is and isn't a problem.** A workflow suspended at a
1098
+ `condition()` / `waitFor()` / `sleepFor()` can sit idle for days legitimately,
1099
+ and HotMesh only bumps `updated_at` when a job's status changes. A frozen
1100
+ `updated_at` is therefore the *normal* signature of a wait, **not** a fault. The
1101
+ genuinely broken signals are: a dead-lettered message (retries exhausted), a
1102
+ reservation leak (claimed but never ACK'd past the reclaim window), and a
1103
+ suspended waiter with **no** escalation row.
1104
+
1105
+ **Recommended flow:** start fleet-wide with `find_orphaned_signals` (the
1106
+ genuinely-broken case) or `find_stalled_jobs` (candidates worth a look), then run
1107
+ `diagnose_job` on a specific id for root cause. `diagnose_job` is compact by
1108
+ default — the verdict only. Opt into the heavy arrays with `include`, and for the
1109
+ full raw JSONB of a specific message use `list_stream_messages` (Control Plane)
1110
+ filtered by `jid` (and `aid`/`dad`).
1111
+
1112
+ ### diagnose_job
1113
+
1114
+ Read-only diagnosis of one workflow. **Compact by default** — returns the verdict
1115
+ only: `status`, `idle_for_ms`, `workflow_type`, `stream_summary` (counts), the
1116
+ `escalation` summary, and structured `findings[]` with confidence, evidence, and
1117
+ read-only guidance. Classifies a healthy long-wait as such rather than flagging it
1118
+ as stalled.
1119
+
1120
+ To opt into the heavy arrays pass `include: ["events"]` for the execution timeline
1121
+ and/or `include: ["streams"]` for raw engine+worker messages (`verbosity: "full"`
1122
+ adds both). Large `result`/`message` payloads are summarized to
1123
+ `{ bytes, preview, truncated }`; for full untruncated payloads use
1124
+ `list_stream_messages` filtered by `jid` (surfaced as `raw_messages` when streams
1125
+ are omitted).
1126
+
1127
+ | | |
1128
+ |---|---|
1129
+ | Read-safe | Yes |
1130
+
1131
+ **Parameters:**
1132
+
1133
+ | Field | Type | Required | Description |
1134
+ |-------|------|----------|-------------|
1135
+ | workflow_id | string | Yes | Workflow (job) ID to diagnose |
1136
+ | app_id | string | No | HotMesh namespace / DB schema (default: durable) |
1137
+ | include | string[] | No | Heavy sections to add: `events`, `streams`. Omit for the compact verdict. |
1138
+ | verbosity | string | No | `summary` (default, verdict only) or `full` (events + streams) |
1139
+ | max_events | integer | No | Cap on execution events returned when included, most recent kept (default: 500). Use `list_stream_messages` for full payloads. |
1140
+
1141
+ ### find_stalled_jobs
1142
+
1143
+ Find running jobs with no status change in N minutes (bounded, indexed). Each
1144
+ result is classified `likely`: `waiting` (has a pending escalation — healthy) or
1145
+ `no_recent_progress` (worth a closer look). Triage the `no_recent_progress` rows
1146
+ with `diagnose_job`.
1147
+
1148
+ | | |
1149
+ |---|---|
1150
+ | Read-safe | Yes |
1151
+
1152
+ **Parameters:**
1153
+
1154
+ | Field | Type | Required | Description |
1155
+ |-------|------|----------|-------------|
1156
+ | app_id | string | No | HotMesh namespace / DB schema (default: durable) |
1157
+ | idle_minutes | integer | No | Minimum minutes since last status change (default: 5) |
1158
+ | workflow_type | string | No | Filter by workflow function name |
1159
+ | limit | integer | No | Max results (default: 50, max: 200) |
1160
+
1161
+ ### find_orphaned_signals
1162
+
1163
+ Find running workflows suspended at a `condition()` (waiter committed, signal
1164
+ registered) that have **no** escalation row — the genuinely broken case: the
1165
+ workflow waits for a signal nothing will send. Scans a recent time window only,
1166
+ so it never degenerates into a full-history scan of the partitioned
1167
+ `worker_streams` table.
1168
+
1169
+ | | |
1170
+ |---|---|
1171
+ | Read-safe | Yes |
1172
+
1173
+ **Parameters:**
1174
+
1175
+ | Field | Type | Required | Description |
1176
+ |-------|------|----------|-------------|
1177
+ | app_id | string | No | HotMesh namespace / DB schema (default: durable) |
1178
+ | within_hours | integer | No | Recent window to scan, in hours (default: 24, max: 720). Widen to reach older orphans; narrow to go faster. |
1179
+ | limit | integer | No | Max results (default: 100, max: 500) |
1180
+
1181
+ ### Example prompts
1182
+
1183
+ - "Diagnose workflow `ortho-eff-1782084825-b9-3-2-printer-0` and tell me whether it's a healthy wait or genuinely stuck."
1184
+ - "Find any orphaned signals in the last 48 hours and summarize the common cause."
1185
+ - "List stalled jobs of type `printerEfficient` idle more than 30 minutes, then diagnose the ones classified `no_recent_progress`."
1186
+ - "Are there dead-lettered messages or reservation leaks behind job `<id>`? Show the evidence."
1187
+ - "Diagnose `<id>`, then pull the raw worker stream message for its failing activity so I can see the full input payload."
1188
+ - "Scan the fleet for genuinely broken workflows (not normal waits) and give me the job IDs to investigate."
952
1189
 
953
1190
  ## Pipelines
954
1191
 
package/docs/mcp.md CHANGED
@@ -8,6 +8,7 @@ Your agents speak MCP. Long Tail makes their tool calls durable and exposes huma
8
8
  - [Humans as Tools](#humans-as-tools)
9
9
  - [Compiled Workflows as Tools](#compiled-workflows-as-tools)
10
10
  - [The Cycle](#the-cycle)
11
+ - [Connecting an Agent to Long Tail](#connecting-an-agent-to-long-tail) — the `/mcp` endpoint, service accounts, multi-environment `.mcp.json`, example prompts
11
12
  - [Human Queue Server](#human-queue-server) — escalation as MCP tools
12
13
  - [Document Vision Server](#document-vision-server) — AI tools as 3 MCP tools
13
14
  - [MCP-Native Workflow](#mcp-native-workflow) — both sides MCP, end to end
@@ -142,6 +143,107 @@ Over time, the YAML replaces the procedural. The MCP triage workflow stops entro
142
143
 
143
144
  The sections above describe the concept. The rest of this guide covers the concrete servers, tools, and APIs that implement it.
144
145
 
146
+ ## Connecting an Agent to Long Tail
147
+
148
+ Long Tail is itself an MCP server. Any MCP-aware client — Claude Code, Claude Desktop, Cursor, a custom agent — connects to its full tool surface and operates the system in conversation: read its state, work its queues, run its workflows, inspect its plumbing. Diagnostics are one part of that surface, not the whole of it.
149
+
150
+ ### The endpoint
151
+
152
+ | | |
153
+ |---|---|
154
+ | URL | `POST https://<host>/mcp` |
155
+ | Transport | Streamable HTTP, stateless — one request and one response per call |
156
+ | Auth | `Authorization: Bearer <token>` — a signed user token (JWT) or a service-account key |
157
+
158
+ ### Access: which tools, and which records
159
+
160
+ Two things decide what a connected agent can do, and both must pass.
161
+
162
+ **Scope decides which tools appear.** Every service-account key carries one of two scopes:
163
+
164
+ - `mcp:read` — the read-only tools: listing, searching, diagnosing, stream and escalation stats, exports. Anything that only reports.
165
+ - `mcp:full` — those, plus the tools that change state: create an escalation, claim and resolve one, invoke a workflow, update a configuration, prune the database.
166
+
167
+ A deployment can also be set read-only as a whole, which holds every key to read access whatever its scope, and can hide entire groups of tools. Production is the place to do this by default.
168
+
169
+ **Role decides which records.** Scope opens a tool; the account's role decides whether the action is allowed on a given target. An account with `mcp:full` but only the `reviewer` role can resolve reviewer escalations — it cannot route work to finance or manage users. Administrative tools (users, roles, configuration, pruning) require an admin or superadmin role.
170
+
171
+ Put plainly: **scope is which tools, role is which records.** A read key answers questions; a full key with the right role also acts.
172
+
173
+ Creating an escalation shows both at work. `escalate_to_human` changes state, so the key needs `mcp:full`, and the account needs a role allowed to route to that queue. Reading the same queue back — `get_available_work`, `check_resolution` — needs only `mcp:read`. The rule holds for every tool: reading is cheap to grant, writing is deliberate.
174
+
175
+ ### 1. Create a service account
176
+
177
+ In the dashboard: **Admin → Bot Accounts → Create**, assign the role(s) the account should act under, then generate an API key and choose its scope — `mcp:read` for an investigator, `mcp:full` for an operator that also makes changes. The raw key is shown once. The same is available as admin tools: `create_bot_account`, then `create_bot_api_key`.
178
+
179
+ Give each environment its own account and key, scoped to the least it needs.
180
+
181
+ ### 2. Point a client at it — `.mcp.json`
182
+
183
+ Long Tail speaks the standard transport, so a single HTTP server entry connects an MCP client:
184
+
185
+ ```jsonc
186
+ {
187
+ "mcpServers": {
188
+ "longtail-prod": {
189
+ "type": "http",
190
+ "url": "https://your-host.example.com/mcp",
191
+ "headers": { "Authorization": "Bearer ${LONGTAIL_PROD_KEY}" }
192
+ }
193
+ }
194
+ }
195
+ ```
196
+
197
+ Use `${VAR}` for the key so the file holds no secrets — keep the key itself in your shell environment or a secret manager, and never commit it.
198
+
199
+ ### 3. Local, staging, and production in one conversation
200
+
201
+ Add one server entry per environment:
202
+
203
+ ```jsonc
204
+ {
205
+ "mcpServers": {
206
+ "longtail-local": { "type": "http", "url": "http://localhost:3000/mcp", "headers": { "Authorization": "Bearer ${LONGTAIL_LOCAL_KEY}" } },
207
+ "longtail-staging": { "type": "http", "url": "https://staging.example.com/mcp", "headers": { "Authorization": "Bearer ${LONGTAIL_STAGING_KEY}" } },
208
+ "longtail-prod": { "type": "http", "url": "https://prod.example.com/mcp", "headers": { "Authorization": "Bearer ${LONGTAIL_PROD_KEY}" } }
209
+ }
210
+ }
211
+ ```
212
+
213
+ Each server keeps its tools under its own name, so the three copies of every tool never collide — you choose one by naming the environment: *"on production, find orphaned signals,"* *"reproduce it locally and diagnose."*
214
+
215
+ Two things stay separate:
216
+
217
+ - The server names the deployment; a tool's `app_id` argument names the workspace inside it. Together they say where to look.
218
+ - Every server you list is live at once. Give production a read key by default, and reach for a full key only when you mean to change something there.
219
+
220
+ ### Usage — example prompts
221
+
222
+ The full tool reference is in [the admin server doc](api/mcp/admin.md). A read key covers everything marked *read*; a *write* action needs a full key and a role that fits.
223
+
224
+ **Find and diagnose** — *read*
225
+ - "Diagnose workflow `<id>` — is it waiting normally or genuinely stuck?"
226
+ - "Find orphaned signals from the last 48 hours and group them by cause."
227
+
228
+ **Escalations and human work** — *read* to view, *write* to act
229
+ - "How many escalations are pending, by role?"
230
+ - "Find the escalation where `orderId` is `<id>` and show its status."
231
+ - "Create an escalation to the `reviewer` role for order `<id>` with this context."
232
+ - "Claim escalation `<id>` and resolve it as approved."
233
+
234
+ **Workflows and pipelines** — *read* for status, *write* to run
235
+ - "List the workflows this deployment knows about."
236
+ - "Invoke `reviewContent` with this input and return the job id."
237
+ - "What is the status and result of workflow `<id>`?"
238
+
239
+ **Operations and stats** — *read*, a few actions *write*
240
+ - "Roll call app `durable` — which engines and workers are live?"
241
+ - "Show stream stats for the last hour; is the backlog growing?"
242
+ - "Pause the mesh for app `durable`."
243
+
244
+ **Settings** — *read*
245
+ - "What versions and features is this deployment running?"
246
+
145
247
  ## Human Queue Server
146
248
 
147
249
  The Human Queue is a built-in MCP server that exposes Long Tail's escalation API as standard MCP tools. Any MCP-compatible client — Claude, LangGraph, CrewAI, a custom agent — can connect and work the queue.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/long-tail",
3
- "version": "0.5.10",
3
+ "version": "0.5.12",
4
4
  "description": "Long Tail Workflows — Durable AI workflows with human-in-the-loop escalation. Powered by PostgreSQL.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -1,4 +0,0 @@
1
- import{j as e,a as y}from"./vendor-query-B2UbickB.js";import{a as D,b as L,c as R}from"./agents-HMkTc425.js";import{u as W,b as K,N as M}from"./index-BFQ2t-p1.js";import{u as z,E,C as S}from"./CronLabel-C2TuCl4h.js";import{i as I}from"./useEventHooks-M7SaEfel.js";import{W as N}from"./WorkflowPill-F1oKUzmc.js";import{a as U,B as F,Q as H,P as G,aK as J,q as O,aL as Q,R as _,a7 as X,d as Y,aM as V}from"./vendor-icons-Dj2F0Jrb.js";import{e as Z,c as ee}from"./vendor-react-CXumBFUA.js";function te(a){return new Date(a).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function u({icon:a,color:i,children:c,actions:h}){return e.jsxs("div",{className:"flex items-center justify-between mb-3 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(a,{className:`w-4 h-4 ${i}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-xs font-semibold uppercase tracking-widest text-accent/80",children:c})]}),h]})}function j({text:a}){return e.jsx("p",{className:"text-[11px] text-text-quaternary py-2",children:a})}let se=0;function ae(a){const[i,c]=y.useState([]),[h,d]=y.useState(!1),t=y.useCallback(r=>{var m,g,p;if((m=r.type)!=null&&m.startsWith("mesh."))return;const x=r.activityName||((g=r.data)==null?void 0:g.domain)||((p=r.workflowId)==null?void 0:p.slice(0,16))||"";c(f=>[{id:++se,type:r.type,timestamp:r.timestamp,label:x},...f].slice(0,10)),d(!0),setTimeout(()=>d(!1),2e3)},[]);return K(a?`${M}.system.agent.${a}.>`:"",t),{events:i,pulse:h}}function me(){var b,w,k,C,$;const{id:a}=Z(),i=ee(),{data:c}=W(),d=!!((b=c==null?void 0:c.ai)!=null&&b.enabled)?"Agent":"Automation",{data:t,isLoading:r}=D(a??null),{data:x}=z(a??null),m=L(),g=R(),{events:p,pulse:f}=ae(a);if(I(),r)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});if(!t)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(U,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsxs("h2",{className:"text-lg font-medium text-text-primary mb-2",children:[d," not found"]}),e.jsxs("button",{onClick:()=>i("/agents"),className:"text-sm text-accent hover:text-accent-hover transition-colors",children:["Back to ",d.toLowerCase(),"s"]})]});const A=t.status==="active"?"bg-emerald-400":t.status==="paused"?"bg-amber-400":t.status==="error"?"bg-red-400":"bg-zinc-500",n=(x==null?void 0:x.subscriptions)??[],P=t.status==="active"?"Active":t.status==="paused"?"Paused":t.status==="error"?"Error":"Inactive",l=(w=t.behaviors)==null?void 0:w.schedules,v=(k=t.behaviors)==null?void 0:k.cron,o=(l==null?void 0:l.length)||(v?1:0),q=()=>{const s=[`Pause "${t.id}"?`,"","This will:",n.length>0?`• Stop ${n.length} event subscription${n.length!==1?"s":""}`:null,o>0?`• Stop ${o} schedule${o!==1?"s":""}`:null,"","Knowledge and workflow history are preserved. You can reactivate anytime."].filter(Boolean).join(`
2
- `);confirm(s)&&m.mutate({id:t.id,status:"paused"})},T=()=>{const s=[`Delete "${t.id}"?`,"","This permanently removes:","• The agent configuration",n.length>0?`• ${n.length} event subscription${n.length!==1?"s":""}`:null,o>0?`• ${o} schedule${o!==1?"s":""}`:null,"","Knowledge entries and workflow history are preserved."].filter(Boolean).join(`
3
- `);confirm(s)&&g.mutate(t.id,{onSuccess:()=>i("/agents")})};return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-start justify-between mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("h1",{className:"text-3xl font-light text-text-primary",children:[d,": ",t.id]}),e.jsx("button",{onClick:()=>{window.location.hash="#docs:agents.md"},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Docs",children:e.jsx(F,{className:"w-4 h-4",strokeWidth:1.5})})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"flex items-center gap-1.5 mr-2",children:[e.jsx("span",{className:`w-2 h-2 rounded-full ${A}`}),e.jsx("span",{className:"text-xs text-text-secondary capitalize",children:P})]}),e.jsxs("button",{onClick:()=>i(`/agents/${t.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",children:[e.jsx(H,{className:"w-3 h-3"})," Edit"]}),t.status!=="active"&&e.jsxs("button",{onClick:()=>m.mutate({id:t.id,status:"active"}),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",children:[e.jsx(G,{className:"w-3 h-3"})," Activate"]}),t.status==="active"&&e.jsxs("button",{onClick:q,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",children:[e.jsx(J,{className:"w-3 h-3"})," Pause"]}),e.jsxs("button",{onClick:T,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",children:[e.jsx(O,{className:"w-3 h-3"})," Delete"]})]})]}),t.description&&e.jsx("div",{className:"border-l-2 border-accent/30 pl-4 py-1 mb-10",children:e.jsx("p",{className:"text-[13px] text-text-secondary italic leading-relaxed",children:t.description})}),(t.goals||t.rules)&&e.jsxs("div",{className:"mb-10",children:[e.jsx(u,{icon:Q,color:"text-rose-400",children:"Motivation"}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-14 bg-surface-sunken/20 rounded-lg px-5 py-4",children:[t.goals&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5",children:"Goals"}),e.jsx("p",{className:"text-[13px] text-text-primary leading-relaxed",children:t.goals})]}),t.rules&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] text-text-quaternary uppercase tracking-widest mb-1.5",children:"Rules"}),e.jsx("p",{className:"text-[13px] text-text-primary leading-relaxed",children:t.rules})]})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-x-14 gap-y-10",children:[e.jsxs("div",{children:[e.jsxs(u,{icon:_,color:"text-cyan-400",children:["Subscriptions (",n.length,")"]}),n.length===0?e.jsx(j,{text:"No event subscriptions"}):e.jsx("div",{className:"divide-y divide-surface-border/30",children:n.map(s=>e.jsxs("div",{className:"flex items-center py-2",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx(E,{topic:s.topic})}),e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[e.jsx("span",{className:"text-text-quaternary text-[10px]",children:"→"}),e.jsx(N,{type:s.reaction_type==="capability"?s.tool_name:s.workflow_type||s.reaction_type,variant:s.reaction_type==="pipeline"?"pipeline":s.reaction_type==="capability"?"capability":"durable"})]})]},s.id))})]}),e.jsxs("div",{children:[e.jsxs(u,{icon:X,color:"text-amber-400",children:["Schedules (",o,")"]}),l!=null&&l.length?e.jsx("div",{className:"divide-y divide-surface-border/30",children:l.map((s,B)=>e.jsxs("div",{className:"flex items-center py-2",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx(S,{cron:s.cron})}),e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[e.jsx("span",{className:"text-text-quaternary text-[10px]",children:"→"}),e.jsx(N,{type:s.workflow_type||"workflow"})]})]},B))}):v?e.jsxs("div",{className:"flex items-center py-1",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsx(S,{cron:v})}),t.workflow_type&&e.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[e.jsx("span",{className:"text-text-quaternary text-[10px]",children:"→"}),e.jsx(N,{type:t.workflow_type})]})]}):e.jsx(j,{text:"No schedules configured"})]}),e.jsxs("div",{className:"space-y-10",children:[e.jsxs("div",{children:[e.jsx(u,{icon:Y,color:"text-emerald-400",children:"Knowledge"}),t.knowledge_domain?e.jsxs("button",{onClick:()=>i(`/knowledge?domain=${t.knowledge_domain}`),className:"group text-left flex items-center gap-3",children:[e.jsx("span",{className:"text-sm font-mono text-text-primary group-hover:text-accent transition-colors",children:t.knowledge_domain}),e.jsxs("span",{className:"text-[10px] text-text-quaternary",children:[(($=(C=t.stats)==null?void 0:C.knowledge_count)==null?void 0:$.toLocaleString())??0," entries"]}),e.jsx(V,{className:"w-3 h-3 text-accent opacity-0 group-hover:opacity-100 transition-opacity"})]}):e.jsx(j,{text:"No knowledge domain"})]}),e.jsxs("div",{children:[e.jsx(u,{icon:_,color:"text-cyan-400",actions:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full transition-colors duration-500 ${f?"bg-emerald-400":"bg-zinc-600"}`}),e.jsx("span",{className:"text-[10px] text-text-quaternary",children:"live"})]}),children:"Activity"}),p.length===0?e.jsx(j,{text:"Events appear here as the agent runs"}):e.jsx("div",{className:"space-y-1.5",children:p.map(s=>e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-0.5",children:[e.jsx("span",{className:"text-[11px] text-text-primary font-mono truncate flex-1",children:s.label||"—"}),e.jsx("span",{className:"text-[10px] text-text-quaternary shrink-0 ml-2",children:te(s.timestamp)})]}),e.jsx(E,{topic:s.type})]},s.id))})]})]})]})]})}export{me as AgentDetailPage};
4
- //# sourceMappingURL=AgentDetailPage-bnXR1ezD.js.map
@@ -1 +0,0 @@
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,2 +0,0 @@
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 +0,0 @@
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,2 +0,0 @@
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