@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
@@ -5,7 +5,12 @@ export declare const GET_TASK_BY_SIGNAL_ID = "SELECT * FROM lt_tasks WHERE signa
5
5
  export declare const GET_TASK_BY_WORKFLOW_ID = "SELECT * FROM lt_tasks WHERE workflow_id = $1 ORDER BY created_at DESC LIMIT 1";
6
6
  export declare const RESOLVE_TASK_BY_WORKFLOW_ID = "SELECT workflow_type, task_queue FROM lt_tasks WHERE workflow_id = $1 ORDER BY created_at DESC LIMIT 1";
7
7
  export declare const RESOLVE_CONFIG_TASK_QUEUE = "SELECT task_queue FROM lt_config_workflows WHERE workflow_type = $1";
8
- export declare const RESOLVE_JOB_ENTITY = "SELECT entity FROM durable.jobs WHERE key = $1 LIMIT 1";
8
+ /**
9
+ * Look up a job's entity tag in a specific HotMesh namespace. The namespace is a
10
+ * Postgres schema name, so it is interpolated (not a bind param) — same pattern
11
+ * as the diagnostics queries. Callers pass the trusted app_id from config.
12
+ */
13
+ export declare const RESOLVE_JOB_ENTITY: (appId: string) => string;
9
14
  export declare const GET_PROCESS_TASKS = "SELECT * FROM lt_tasks WHERE origin_id = $1 ORDER BY created_at ASC";
10
15
  /**
11
16
  * Build the process-stats totals CTE query for a given interval.
@@ -25,7 +25,13 @@ exports.GET_TASK_BY_WORKFLOW_ID = `SELECT * FROM lt_tasks WHERE workflow_id = $1
25
25
  // ---- resolve.ts queries ---------------------------------------------------
26
26
  exports.RESOLVE_TASK_BY_WORKFLOW_ID = `SELECT workflow_type, task_queue FROM lt_tasks WHERE workflow_id = $1 ORDER BY created_at DESC LIMIT 1`;
27
27
  exports.RESOLVE_CONFIG_TASK_QUEUE = `SELECT task_queue FROM lt_config_workflows WHERE workflow_type = $1`;
28
- exports.RESOLVE_JOB_ENTITY = `SELECT entity FROM durable.jobs WHERE key = $1 LIMIT 1`;
28
+ /**
29
+ * Look up a job's entity tag in a specific HotMesh namespace. The namespace is a
30
+ * Postgres schema name, so it is interpolated (not a bind param) — same pattern
31
+ * as the diagnostics queries. Callers pass the trusted app_id from config.
32
+ */
33
+ const RESOLVE_JOB_ENTITY = (appId) => `SELECT entity FROM "${appId}".jobs WHERE key = $1 LIMIT 1`;
34
+ exports.RESOLVE_JOB_ENTITY = RESOLVE_JOB_ENTITY;
29
35
  // ---- process.ts queries ---------------------------------------------------
30
36
  exports.GET_PROCESS_TASKS = `SELECT * FROM lt_tasks WHERE origin_id = $1 ORDER BY created_at ASC`;
31
37
  /**
@@ -15,12 +15,15 @@ const adapter_1 = require("../services/mcp/adapter");
15
15
  const escalation_strategy_1 = require("../services/escalation-strategy");
16
16
  const default_1 = require("../services/escalation-strategy/default");
17
17
  const mcp_2 = require("../services/escalation-strategy/mcp");
18
+ const features_1 = require("../modules/features");
18
19
  const socket_auth_1 = require("./socket-auth");
19
20
  /**
20
21
  * Register all adapters (logging, telemetry, events, maintenance,
21
22
  * escalation strategy, MCP) based on the startup config.
22
23
  */
23
24
  function registerAdapters(startConfig) {
25
+ // Dashboard feature flags (default permissive; deployment opts out).
26
+ (0, features_1.configureFeatureFlags)(startConfig.features);
24
27
  // Logging (register first so subsequent log calls use it)
25
28
  if (startConfig.logging?.adapter) {
26
29
  logger_1.loggerRegistry.register(startConfig.logging.adapter);
@@ -1,10 +1,17 @@
1
1
  /**
2
- * Diagnostics tools — mirrors routes/diagnostics.ts
2
+ * Diagnostics tools — mirrors routes/diagnostics.ts. Pure read-only.
3
3
  *
4
4
  * Three tools:
5
- * diagnose_job — full per-job diagnosis: events + stream messages + findings
6
- * find_stalled_jobs — fleet-level: running jobs with no recent progress
7
- * find_orphaned_signals — fleet-level: suspended jobs with no escalation row
5
+ * diagnose_job — per-job verdict (compact by default; opt into events/streams)
6
+ * find_stalled_jobs — fleet-level: running jobs with no recent status change
7
+ * find_orphaned_signals — fleet-level: suspended waiters with no escalation row
8
+ *
9
+ * Efficient usage: start fleet-wide (find_orphaned_signals for the genuinely
10
+ * broken case, find_stalled_jobs for candidates), then call diagnose_job on a
11
+ * specific id for root cause — do not fan diagnose_job across every job.
12
+ * diagnose_job returns the verdict only by default; add include: ['events'] or
13
+ * ['streams'] for the heavy arrays. For full raw message payloads, use the
14
+ * stream browser (list_stream_messages filtered by jid).
8
15
  */
9
16
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
10
17
  export declare function registerDiagnosticsTools(server: McpServer): void;
@@ -39,17 +39,23 @@ const schemas_1 = require("./schemas");
39
39
  function registerDiagnosticsTools(server) {
40
40
  server.registerTool('diagnose_job', {
41
41
  title: 'Diagnose Job',
42
- description: 'Complete diagnostic for a single workflow job. Combines the execution event ' +
43
- 'timeline (from exportWorkflowExecution) with the raw stream messages for that ' +
44
- 'job (engine + worker, including full JSONB payload, retry state, and timing) ' +
45
- 'and the escalation row from hmsh_escalations. Returns structured findings[] ' +
46
- 'with confidence, evidence, and treatment options. ' +
47
- 'Use when a workflow is stalled, stuck at a condition, has dead-lettered ' +
48
- 'messages, or shows unexpected behavior. Call find_stalled_jobs or ' +
49
- 'find_orphaned_signals first to surface job IDs, then call this per job.',
42
+ description: 'Read-only diagnosis for a single workflow job. Compact by default returns the ' +
43
+ 'verdict only: status, idle_for_ms, workflow_type, stream_summary (counts), the ' +
44
+ 'escalation row from hmsh_escalations, and structured findings[] with confidence, ' +
45
+ 'evidence, and read-only guidance (where to look next never recovery; HotMesh ' +
46
+ 'state cannot be unwound). ' +
47
+ 'A workflow sitting at a condition()/waitFor()/sleepFor() for a long time is ' +
48
+ 'classified as a healthy wait, not a fault only dead-letter, reservation-leak, ' +
49
+ 'or a suspended-waiter-with-no-escalation indicate a real problem. ' +
50
+ 'To opt into the heavy arrays pass include: ["events"] for the execution timeline ' +
51
+ '(capped by max_events, default 500) and/or include: ["streams"] for raw engine+worker ' +
52
+ 'messages; large result/message payloads are summarized to {bytes,preview,truncated}. ' +
53
+ 'For full untruncated payloads use list_stream_messages filtered by jid (returned in ' +
54
+ 'raw_messages). Call find_orphaned_signals / find_stalled_jobs first to surface IDs, ' +
55
+ 'then this per job.',
50
56
  inputSchema: schemas_1.diagnoseJobSchema,
51
57
  }, async (args) => {
52
- const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id });
58
+ const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id, maxEvents: args.max_events, include: args.include, verbosity: args.verbosity });
53
59
  if (result.error) {
54
60
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
55
61
  }
@@ -57,15 +63,18 @@ function registerDiagnosticsTools(server) {
57
63
  });
58
64
  server.registerTool('find_stalled_jobs', {
59
65
  title: 'Find Stalled Jobs',
60
- description: 'Find all running jobs that have not progressed in N minutes. ' +
61
- 'Returns workflow_id, workflow_type, stalled_ms, created_at, updated_at. ' +
62
- 'Use as a first step to surface the scope of a stall incident. ' +
63
- 'Follow up with diagnose_job on individual results for root cause.',
66
+ description: 'Find running jobs with no status change in N minutes (bounded, indexed; cap 200). ' +
67
+ 'IMPORTANT: "no recent change" is NOT "broken" — HotMesh bumps updated_at only on ' +
68
+ 'status change, so a frozen timestamp is the normal signature of a workflow waiting ' +
69
+ 'at a condition()/waitFor()/sleepFor(). Each row carries a `likely` classification: ' +
70
+ '"waiting" (has a pending escalation — healthy) vs "no_recent_progress" (worth a ' +
71
+ 'closer look). Returns workflow_id, workflow_type, idle_ms, has_open_escalation, likely. ' +
72
+ 'Triage the "no_recent_progress" rows with diagnose_job for root cause.',
64
73
  inputSchema: schemas_1.findStalledJobsSchema,
65
74
  }, async (args) => {
66
75
  const result = await api.stalledJobs({
67
76
  appId: args.app_id,
68
- stalledMinutes: args.stalled_minutes,
77
+ idleMinutes: args.idle_minutes,
69
78
  workflowType: args.workflow_type,
70
79
  limit: args.limit,
71
80
  });
@@ -76,16 +85,19 @@ function registerDiagnosticsTools(server) {
76
85
  });
77
86
  server.registerTool('find_orphaned_signals', {
78
87
  title: 'Find Orphaned Signals',
79
- description: 'Find running workflows that are suspended at a condition() call ' +
80
- '(waiter Leg1 committed, signal registered) but have no corresponding ' +
81
- 'escalation row in hmsh_escalations. These are permanently stalled ' +
82
- 'the workflow is waiting for a signal that nothing will ever send. ' +
83
- 'Returns job_id, signal_id, workflow_name, suspended_at, stalled_ms, ' +
84
- 'and missing_queue_config (true = pre-0.22 SDK, false = DB error at commit time). ' +
85
- 'Call diagnose_job on any result for the full picture and recovery options.',
88
+ description: 'Find running workflows suspended at a condition() (waiter committed, signal ' +
89
+ 'registered) that have NO escalation row in hmsh_escalations the genuinely ' +
90
+ 'broken case: the workflow waits for a signal nothing will send. ' +
91
+ 'Scans a recent window only (within_hours, default 24, max 720) to stay off a ' +
92
+ 'full-history scan of the partitioned worker_streams table; widen the window ' +
93
+ 'deliberately to reach older orphans, narrow it to go faster. ' +
94
+ 'Returns job_id, signal_id, workflow_name, suspended_at, waiting_ms, and ' +
95
+ 'missing_queue_config (true = pre-0.22 SDK, false = error at commit time), plus ' +
96
+ 'the within_hours actually applied. Call diagnose_job on any result for the full ' +
97
+ 'picture. This is read-only — resolving an orphan needs engineering review.',
86
98
  inputSchema: schemas_1.findOrphanedSignalsSchema,
87
99
  }, async (args) => {
88
- const result = await api.orphanedSignals({ appId: args.app_id, limit: args.limit });
100
+ const result = await api.orphanedSignals({ appId: args.app_id, withinHours: args.within_hours, limit: args.limit });
89
101
  if (result.error) {
90
102
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
91
103
  }
@@ -1,5 +1,11 @@
1
1
  /**
2
2
  * Escalation tools — mirrors routes/escalations/
3
+ *
4
+ * Every tool runs as the `lt-system` bot. The escalation RBAC helpers
5
+ * (getVisibleRoles / getUserRoles / hasGlobalEscalationAccess) query a uuid
6
+ * column, so the bot's external_id string ('lt-system') would blow up with
7
+ * `invalid input syntax for type uuid`. `systemAuth()` resolves the bot's real
8
+ * UUID once and caches it; that UUID (a superadmin) is passed as the principal.
3
9
  */
4
10
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
11
  export declare function registerEscalationTools(server: McpServer): void;
@@ -35,47 +35,109 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerEscalationTools = registerEscalationTools;
37
37
  const escalationService = __importStar(require("../../../services/escalation"));
38
+ const escalationApi = __importStar(require("../../../api/escalations"));
38
39
  const escalationMetaApi = __importStar(require("../../../api/escalations/metadata"));
39
40
  const escalationBulkApi = __importStar(require("../../../api/escalations/bulk"));
41
+ const iam_1 = require("../../../services/iam");
40
42
  const schemas_1 = require("./schemas");
43
+ let systemPrincipalId = null;
44
+ /**
45
+ * Resolve (and cache) the lt-system bot's real UUID. The escalation RBAC helpers
46
+ * query the uuid `user_id` column, so the external_id string 'lt-system' would
47
+ * raise `invalid input syntax for type uuid`. The bot is a superadmin, so it has
48
+ * global escalation access.
49
+ */
50
+ async function systemAuth() {
51
+ if (!systemPrincipalId)
52
+ systemPrincipalId = await (0, iam_1.ensureSystemBot)();
53
+ return { userId: systemPrincipalId, role: 'superadmin' };
54
+ }
55
+ /** Project the full escalation record to the MCP-facing shape, including metadata. */
56
+ function projectEscalation(e) {
57
+ return {
58
+ id: e.id,
59
+ type: e.type,
60
+ subtype: e.subtype,
61
+ role: e.role,
62
+ priority: e.priority,
63
+ status: e.status,
64
+ description: e.description,
65
+ workflow_id: e.workflow_id,
66
+ workflow_type: e.workflow_type,
67
+ assigned_to: e.assigned_to,
68
+ assigned_until: e.assigned_until,
69
+ signal_key: e.signal_key,
70
+ metadata: e.metadata,
71
+ created_at: e.created_at,
72
+ updated_at: e.updated_at,
73
+ };
74
+ }
41
75
  function registerEscalationTools(server) {
76
+ // ── Read-only ───────────────────────────────────────────────────────────────
42
77
  // mirrors GET /api/escalations
43
78
  server.registerTool('find_escalations', {
44
79
  title: 'Find Escalations',
45
- description: 'Search escalations with optional filters. Returns records with ' +
46
- 'type, role, priority, status, description, and assignment info.',
80
+ description: 'Search escalations with optional filters (status, role, type, subtype, ' +
81
+ 'assigned_to, priority), free-text `search`, and sorting. `search` matches ' +
82
+ 'across description, type/subtype, role, workflow/origin id, and metadata values ' +
83
+ '(e.g. a correlation key like an order id) server-side over the full result set. ' +
84
+ 'Returns full records including metadata, workflow linkage, assignment, and signal_key.',
47
85
  inputSchema: schemas_1.findEscalationsSchema,
48
86
  }, async (args) => {
49
- const { escalations, total } = await escalationService.listEscalations({
87
+ const result = await escalationApi.listEscalations({
50
88
  status: args.status,
51
89
  role: args.role,
52
90
  type: args.type,
91
+ subtype: args.subtype,
92
+ assigned_to: args.assigned_to,
93
+ search: args.search,
53
94
  priority: args.priority,
54
95
  limit: args.limit,
55
96
  offset: args.offset,
56
- });
97
+ sort_by: args.sort_by,
98
+ order: args.order,
99
+ }, await systemAuth());
100
+ if (result.error) {
101
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
102
+ }
103
+ const { escalations, total } = result.data;
57
104
  return {
58
105
  content: [{
59
106
  type: 'text',
60
107
  text: JSON.stringify({
61
108
  total,
62
109
  count: escalations.length,
63
- escalations: escalations.map((e) => ({
64
- id: e.id,
65
- type: e.type,
66
- subtype: e.subtype,
67
- role: e.role,
68
- priority: e.priority,
69
- status: e.status,
70
- description: e.description,
71
- workflow_type: e.workflow_type,
72
- assigned_to: e.assigned_to,
73
- created_at: e.created_at,
74
- })),
110
+ escalations: escalations.map(projectEscalation),
75
111
  }),
76
112
  }],
77
113
  };
78
114
  });
115
+ // mirrors GET /api/escalations/:id
116
+ server.registerTool('get_escalation', {
117
+ title: 'Get Escalation',
118
+ description: 'Get a single escalation by ID — the full record including metadata, envelope ' +
119
+ 'linkage, resolver/escalation payloads, signal_key, and assignment state.',
120
+ inputSchema: schemas_1.getEscalationSchema,
121
+ }, async (args) => {
122
+ const result = await escalationApi.getEscalation({ id: args.id }, await systemAuth());
123
+ if (result.error) {
124
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
125
+ }
126
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
127
+ });
128
+ // mirrors GET /api/escalations/by-workflow/:workflowId
129
+ server.registerTool('get_escalations_by_workflow', {
130
+ title: 'Get Escalations by Workflow',
131
+ description: 'List all escalations linked to a specific workflow ID, newest first. Returns ' +
132
+ 'full records including metadata.',
133
+ inputSchema: schemas_1.getEscalationsByWorkflowSchema,
134
+ }, async (args) => {
135
+ const result = await escalationApi.getEscalationsByWorkflowId({ workflowId: args.workflow_id });
136
+ if (result.error) {
137
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
138
+ }
139
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
140
+ });
79
141
  // mirrors GET /api/escalations/stats
80
142
  server.registerTool('get_escalation_stats', {
81
143
  title: 'Get Escalation Stats',
@@ -85,12 +147,23 @@ function registerEscalationTools(server) {
85
147
  }, async (args) => {
86
148
  const stats = await escalationService.getEscalationStats(undefined, args.period);
87
149
  return {
88
- content: [{
89
- type: 'text',
90
- text: JSON.stringify(stats),
91
- }],
150
+ content: [{ type: 'text', text: JSON.stringify(stats) }],
92
151
  };
93
152
  });
153
+ // mirrors GET /api/escalations/by-metadata
154
+ server.registerTool('find_by_metadata', {
155
+ title: 'Find by Metadata',
156
+ description: 'Find escalations by a metadata key-value pair (e.g. a correlation key written ' +
157
+ 'into metadata when the escalation was raised).',
158
+ inputSchema: schemas_1.findByMetadataSchema,
159
+ }, async (args) => {
160
+ const result = await escalationMetaApi.findByMetadata(args, await systemAuth());
161
+ if (result.error) {
162
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
163
+ }
164
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
165
+ });
166
+ // ── Read-write ────────────────────────────────────────────────────────────────
94
167
  // mirrors POST /api/escalations/:id/claim
95
168
  server.registerTool('claim_escalation', {
96
169
  title: 'Claim Escalation',
@@ -99,23 +172,79 @@ function registerEscalationTools(server) {
99
172
  'the escalation returns to the queue.',
100
173
  inputSchema: schemas_1.claimEscalationSchema,
101
174
  }, async (args) => {
102
- const escalation = await escalationService.getEscalation(args.id);
103
- if (!escalation) {
104
- return {
105
- content: [{ type: 'text', text: JSON.stringify({ error: 'Escalation not found' }) }],
106
- isError: true,
107
- };
175
+ const result = await escalationApi.claimEscalation({ id: args.id, durationMinutes: args.duration_minutes }, await systemAuth());
176
+ if (result.error) {
177
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
108
178
  }
109
- const result = await escalationService.claimEscalation(args.id, 'lt-system', args.duration_minutes);
110
- if (!result) {
111
- return {
112
- content: [{ type: 'text', text: JSON.stringify({ error: 'Escalation not available for claim' }) }],
113
- isError: true,
114
- };
179
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
180
+ });
181
+ // mirrors POST /api/escalations/:id/release
182
+ server.registerTool('release_escalation', {
183
+ title: 'Release Escalation',
184
+ description: 'Release a claimed escalation back to the available pool. Reverses a ' +
185
+ 'claim_escalation so another holder can pick it up.',
186
+ inputSchema: schemas_1.releaseEscalationSchema,
187
+ }, async (args) => {
188
+ const result = await escalationApi.releaseEscalation({ id: args.id }, await systemAuth());
189
+ if (result.error) {
190
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
115
191
  }
116
- return {
117
- content: [{ type: 'text', text: JSON.stringify(result) }],
118
- };
192
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
193
+ });
194
+ // mirrors POST /api/escalations/:id/resolve
195
+ server.registerTool('resolve_escalation', {
196
+ title: 'Resolve Escalation',
197
+ description: 'Resolve a pending escalation with a human-provided payload. Routes by escalation ' +
198
+ 'shape: efficient (signal_key) escalations resume the waiting workflow in place; ' +
199
+ 'legacy paths signal via routing metadata or re-run the original workflow. ' +
200
+ 'Password fields in the payload are replaced with ephemeral tokens.',
201
+ inputSchema: schemas_1.resolveEscalationSchema,
202
+ }, async (args) => {
203
+ const result = await escalationApi.resolveEscalation({ id: args.id, resolverPayload: args.resolverPayload }, await systemAuth());
204
+ if (result.error) {
205
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
206
+ }
207
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
208
+ });
209
+ // mirrors POST /api/escalations/resolve-by-signal-key
210
+ server.registerTool('resolve_by_signal_key', {
211
+ title: 'Resolve by Signal Key',
212
+ description: 'Resolve an efficient (atomic) escalation directly by its signal_key and resume the ' +
213
+ 'waiting workflow in place. For callers that know the deterministic signal id and want ' +
214
+ 'to skip the id lookup.',
215
+ inputSchema: schemas_1.resolveBySignalKeySchema,
216
+ }, async (args) => {
217
+ const result = await escalationApi.resolveBySignalKey({ signalKey: args.signalKey, resolverPayload: args.resolverPayload }, await systemAuth());
218
+ if (result.error) {
219
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
220
+ }
221
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
222
+ });
223
+ // mirrors PATCH /api/escalations/:id/escalate
224
+ server.registerTool('escalate_escalation', {
225
+ title: 'Escalate Escalation',
226
+ description: 'Route a pending escalation to a different role (per the escalation chain). The new ' +
227
+ 'role becomes responsible for resolving it.',
228
+ inputSchema: schemas_1.escalateEscalationSchema,
229
+ }, async (args) => {
230
+ const result = await escalationApi.escalateToRole({ id: args.id, targetRole: args.targetRole }, await systemAuth());
231
+ if (result.error) {
232
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
233
+ }
234
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
235
+ });
236
+ // mirrors POST /api/escalations/:id/cancel
237
+ server.registerTool('cancel_escalation', {
238
+ title: 'Cancel Escalation',
239
+ description: 'Permanently cancel a pending escalation — used when the tied workflow has ' +
240
+ 'terminated and can never receive the resolution signal. Preserved for audit.',
241
+ inputSchema: schemas_1.cancelEscalationSchema,
242
+ }, async (args) => {
243
+ const result = await escalationApi.cancelSingleEscalation({ id: args.id }, await systemAuth());
244
+ if (result.error) {
245
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
246
+ }
247
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
119
248
  });
120
249
  // mirrors POST /api/escalations/release-expired
121
250
  server.registerTool('release_expired_claims', {
@@ -148,26 +277,13 @@ function registerEscalationTools(server) {
148
277
  }],
149
278
  };
150
279
  });
151
- // ── Metadata-based operations ───────────────────────────────────────────────
152
- // mirrors GET /api/escalations/by-metadata
153
- server.registerTool('find_by_metadata', {
154
- title: 'Find by Metadata',
155
- description: 'Find escalations by a metadata key-value pair.',
156
- inputSchema: schemas_1.findByMetadataSchema,
157
- }, async (args) => {
158
- const result = await escalationMetaApi.findByMetadata(args, { userId: 'lt-system' });
159
- if (result.error) {
160
- return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
161
- }
162
- return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
163
- });
164
280
  // mirrors POST /api/escalations/claim-by-metadata
165
281
  server.registerTool('claim_by_metadata', {
166
282
  title: 'Claim by Metadata',
167
283
  description: 'Find and claim an escalation by metadata key-value pair.',
168
284
  inputSchema: schemas_1.claimByMetadataSchema,
169
285
  }, async (args) => {
170
- const result = await escalationMetaApi.claimByMetadata(args, { userId: 'lt-system' });
286
+ const result = await escalationMetaApi.claimByMetadata(args, await systemAuth());
171
287
  if (result.error) {
172
288
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
173
289
  }
@@ -179,7 +295,7 @@ function registerEscalationTools(server) {
179
295
  description: 'Find and resolve an escalation by metadata key-value pair.',
180
296
  inputSchema: schemas_1.resolveByMetadataSchema,
181
297
  }, async (args) => {
182
- const result = await escalationMetaApi.resolveByMetadata(args, { userId: 'lt-system' });
298
+ const result = await escalationMetaApi.resolveByMetadata(args, await systemAuth());
183
299
  if (result.error) {
184
300
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
185
301
  }
@@ -192,7 +308,7 @@ function registerEscalationTools(server) {
192
308
  description: 'Claim multiple escalations in a single operation.',
193
309
  inputSchema: schemas_1.bulkClaimSchema,
194
310
  }, async (args) => {
195
- const result = await escalationBulkApi.bulkClaim(args, { userId: 'lt-system' });
311
+ const result = await escalationBulkApi.bulkClaim(args, await systemAuth());
196
312
  if (result.error) {
197
313
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
198
314
  }
@@ -204,7 +320,7 @@ function registerEscalationTools(server) {
204
320
  description: 'Assign multiple escalations to a specific user.',
205
321
  inputSchema: schemas_1.bulkAssignSchema,
206
322
  }, async (args) => {
207
- const result = await escalationBulkApi.bulkAssign(args, { userId: 'lt-system' });
323
+ const result = await escalationBulkApi.bulkAssign(args, await systemAuth());
208
324
  if (result.error) {
209
325
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
210
326
  }
@@ -216,7 +332,19 @@ function registerEscalationTools(server) {
216
332
  description: 'Escalate multiple escalations to a different role.',
217
333
  inputSchema: schemas_1.bulkEscalateSchema,
218
334
  }, async (args) => {
219
- const result = await escalationBulkApi.bulkEscalate(args, { userId: 'lt-system' });
335
+ const result = await escalationBulkApi.bulkEscalate(args, await systemAuth());
336
+ if (result.error) {
337
+ return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
338
+ }
339
+ return { content: [{ type: 'text', text: JSON.stringify(result.data) }] };
340
+ });
341
+ // mirrors POST /api/escalations/bulk-cancel
342
+ server.registerTool('bulk_cancel', {
343
+ title: 'Bulk Cancel',
344
+ description: 'Cancel multiple pending escalations in a single operation.',
345
+ inputSchema: schemas_1.bulkCancelSchema,
346
+ }, async (args) => {
347
+ const result = await escalationApi.bulkCancel(args, await systemAuth());
220
348
  if (result.error) {
221
349
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
222
350
  }
@@ -228,7 +356,7 @@ function registerEscalationTools(server) {
228
356
  description: 'Update the priority of multiple escalations.',
229
357
  inputSchema: schemas_1.updatePrioritySchema,
230
358
  }, async (args) => {
231
- const result = await escalationBulkApi.updatePriority(args, { userId: 'lt-system' });
359
+ const result = await escalationBulkApi.updatePriority(args, await systemAuth());
232
360
  if (result.error) {
233
361
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
234
362
  }
@@ -55,7 +55,7 @@ const settings_1 = require("./settings");
55
55
  const exports_1 = require("./exports");
56
56
  const overview_1 = require("./overview");
57
57
  const diagnostics_1 = require("./diagnostics");
58
- const TOOL_COUNT = 75;
58
+ const TOOL_COUNT = 83;
59
59
  let server = null;
60
60
  async function createAdminServer(options) {
61
61
  if (server && !options?.fresh)
@@ -66,7 +66,7 @@ async function createAdminServer(options) {
66
66
  server = instance;
67
67
  }
68
68
  (0, tasks_1.registerTaskTools)(instance); // 2 tools
69
- (0, escalations_1.registerEscalationTools)(instance); // 12 tools (5 base + 7 metadata/bulk)
69
+ (0, escalations_1.registerEscalationTools)(instance); // 20 tools (RO + RW single + metadata + bulk)
70
70
  (0, workflow_config_1.registerWorkflowConfigTools)(instance); // 3 tools
71
71
  (0, workflows_1.registerWorkflowTools)(instance); // 3 tools
72
72
  (0, mcp_servers_1.registerMcpServerTools)(instance); // 4 tools
@@ -83,7 +83,7 @@ async function createAdminServer(options) {
83
83
  (0, exports_1.registerExportTools)(instance); // 4 tools
84
84
  (0, overview_1.registerOverviewTools)(instance); // 1 tool
85
85
  (0, diagnostics_1.registerDiagnosticsTools)(instance); // 3 tools
86
- // Total: 75
86
+ // Total: 83
87
87
  logger_1.loggerRegistry.info(`[lt-mcp:admin] ${name} ready (${TOOL_COUNT} tools registered)`);
88
88
  return instance;
89
89
  }