@hotmeshio/long-tail 0.5.11 → 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 (237) hide show
  1. package/build/api/diagnostics.d.ts +5 -0
  2. package/build/api/diagnostics.js +5 -1
  3. package/build/api/escalations/list.d.ts +2 -0
  4. package/build/api/escalations/list.js +2 -0
  5. package/build/api/settings.d.ts +1 -1
  6. package/build/api/settings.js +3 -1
  7. package/build/api/workflows/invocation.d.ts +6 -0
  8. package/build/api/workflows/invocation.js +6 -2
  9. package/build/modules/features.d.ts +19 -0
  10. package/build/modules/features.js +16 -0
  11. package/build/routes/diagnostics.js +15 -2
  12. package/build/routes/escalations/list.js +2 -0
  13. package/build/routes/workflows/invocation.js +12 -4
  14. package/build/sdk/index.d.ts +2 -0
  15. package/build/services/diagnostics/index.d.ts +40 -6
  16. package/build/services/diagnostics/index.js +54 -5
  17. package/build/services/escalation/queries.d.ts +2 -0
  18. package/build/services/escalation/queries.js +84 -2
  19. package/build/services/escalation/sql.d.ts +7 -0
  20. package/build/services/escalation/sql.js +50 -1
  21. package/build/services/task/resolve.d.ts +5 -3
  22. package/build/services/task/resolve.js +9 -6
  23. package/build/services/task/sql.d.ts +6 -1
  24. package/build/services/task/sql.js +7 -1
  25. package/build/start/adapters.js +3 -0
  26. package/build/system/mcp-servers/admin/diagnostics.d.ts +5 -4
  27. package/build/system/mcp-servers/admin/diagnostics.js +12 -10
  28. package/build/system/mcp-servers/admin/escalations.d.ts +6 -0
  29. package/build/system/mcp-servers/admin/escalations.js +182 -54
  30. package/build/system/mcp-servers/admin/index.js +3 -3
  31. package/build/system/mcp-servers/admin/schemas.d.ts +92 -3
  32. package/build/system/mcp-servers/admin/schemas.js +39 -4
  33. package/build/system/mcp-servers/admin/workflows.js +23 -12
  34. package/build/system/seed/tool-manifests-admin.d.ts +1324 -562
  35. package/build/system/seed/tool-manifests-admin.js +10 -2
  36. package/build/tsconfig.tsbuildinfo +1 -1
  37. package/build/types/startup.d.ts +9 -0
  38. package/dashboard/dist/assets/{AdminDashboard-DZpduYdW.js → AdminDashboard-LTiYLuzq.js} +2 -2
  39. package/dashboard/dist/assets/{AdminDashboard-DZpduYdW.js.map → AdminDashboard-LTiYLuzq.js.map} +1 -1
  40. package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js → AgentConfigPage-nlOudfpZ.js} +7 -7
  41. package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js.map → AgentConfigPage-nlOudfpZ.js.map} +1 -1
  42. package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js +4 -0
  43. package/dashboard/dist/assets/AgentDetailPage-BSUnDvGp.js.map +1 -0
  44. package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js +2 -0
  45. package/dashboard/dist/assets/AgentsPage-DpS0cCYe.js.map +1 -0
  46. package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js +2 -0
  47. package/dashboard/dist/assets/AvailableEscalationsPage-BEylRqjP.js.map +1 -0
  48. package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js → BotPicker-BhKmq7M7.js} +2 -2
  49. package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js.map → BotPicker-BhKmq7M7.js.map} +1 -1
  50. package/dashboard/dist/assets/CapabilitiesPage-DLIleX2L.js +2 -0
  51. package/dashboard/dist/assets/{CapabilitiesPage-DTfKCzBQ.js.map → CapabilitiesPage-DLIleX2L.js.map} +1 -1
  52. package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js → CollapsibleSection-D7SVwNVk.js} +2 -2
  53. package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js.map → CollapsibleSection-D7SVwNVk.js.map} +1 -1
  54. package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js → CredentialsPage-fat5Z2U9.js} +2 -2
  55. package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js.map → CredentialsPage-fat5Z2U9.js.map} +1 -1
  56. package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js → CronLabel-OOP4P2mJ.js} +2 -2
  57. package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js.map → CronLabel-OOP4P2mJ.js.map} +1 -1
  58. package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js → CustomDurationPicker-COacSAXO.js} +2 -2
  59. package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js.map → CustomDurationPicker-COacSAXO.js.map} +1 -1
  60. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js → DropZone-Bfw2YLVS.js} +2 -2
  61. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js.map → DropZone-Bfw2YLVS.js.map} +1 -1
  62. package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js → ElapsedCell-CkfCD-m7.js} +2 -2
  63. package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js.map → ElapsedCell-CkfCD-m7.js.map} +1 -1
  64. package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js → EscalationsOverview-BmI8jxlh.js} +2 -2
  65. package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js.map → EscalationsOverview-BmI8jxlh.js.map} +1 -1
  66. package/dashboard/dist/assets/{EventTable-CwvX_L9t.js → EventTable-CeKfFk3m.js} +2 -2
  67. package/dashboard/dist/assets/{EventTable-CwvX_L9t.js.map → EventTable-CeKfFk3m.js.map} +1 -1
  68. package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js → GraphInvokePage-BZBPBCSq.js} +2 -2
  69. package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js.map → GraphInvokePage-BZBPBCSq.js.map} +1 -1
  70. package/dashboard/dist/assets/{HomePage-BS_-jcHr.js → HomePage-dM7U2tl6.js} +2 -2
  71. package/dashboard/dist/assets/{HomePage-BS_-jcHr.js.map → HomePage-dM7U2tl6.js.map} +1 -1
  72. package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js → ListToolbar-BJaCzAXS.js} +2 -2
  73. package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js.map → ListToolbar-BJaCzAXS.js.map} +1 -1
  74. package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js → McpOverview-CvnDG5OB.js} +2 -2
  75. package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js.map → McpOverview-CvnDG5OB.js.map} +1 -1
  76. package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js → McpQueryDetailPage-DwmSIcIL.js} +2 -2
  77. package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js.map → McpQueryDetailPage-DwmSIcIL.js.map} +1 -1
  78. package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js +2 -0
  79. package/dashboard/dist/assets/McpQueryPage-CU6FMEEk.js.map +1 -0
  80. package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js → McpRunDetailPage-8a6lsehv.js} +2 -2
  81. package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js.map → McpRunDetailPage-8a6lsehv.js.map} +1 -1
  82. package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js +2 -0
  83. package/dashboard/dist/assets/McpRunsPage-CPMYWgm_.js.map +1 -0
  84. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js → NamespacePill-D6btr6e8.js} +2 -2
  85. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js.map → NamespacePill-D6btr6e8.js.map} +1 -1
  86. package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js +2 -0
  87. package/dashboard/dist/assets/OperatorDashboard-g9o7I925.js.map +1 -0
  88. package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js → PageHeader-Dk2Pe44Q.js} +2 -2
  89. package/dashboard/dist/assets/{PageHeader-Bnt2iQQa.js.map → PageHeader-Dk2Pe44Q.js.map} +1 -1
  90. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js → PageHeaderWithStats-DJQCZ0FR.js} +2 -2
  91. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js.map → PageHeaderWithStats-DJQCZ0FR.js.map} +1 -1
  92. package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js → ProcessDetailPage-ByyWCs2A.js} +2 -2
  93. package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js.map → ProcessDetailPage-ByyWCs2A.js.map} +1 -1
  94. package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js +2 -0
  95. package/dashboard/dist/assets/ProcessesListPage-BTsXds4l.js.map +1 -0
  96. package/dashboard/dist/assets/{RolePill-DQTT1s9v.js → RolePill-Du-aNnjR.js} +2 -2
  97. package/dashboard/dist/assets/{RolePill-DQTT1s9v.js.map → RolePill-Du-aNnjR.js.map} +1 -1
  98. package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js → RolesPage-B2Kdf-L9.js} +2 -2
  99. package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js.map → RolesPage-B2Kdf-L9.js.map} +1 -1
  100. package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js → RunAsSelector-BzkZXpSX.js} +2 -2
  101. package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js.map → RunAsSelector-BzkZXpSX.js.map} +1 -1
  102. package/dashboard/dist/assets/StreamMessageDetail-B6ch-6SY.js +2 -0
  103. package/dashboard/dist/assets/{StreamMessageDetail-BF0tM0cd.js.map → StreamMessageDetail-B6ch-6SY.js.map} +1 -1
  104. package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js → SwimlaneTimeline-CjvfUkls.js} +2 -2
  105. package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js.map → SwimlaneTimeline-CjvfUkls.js.map} +1 -1
  106. package/dashboard/dist/assets/{TagInput-B00uqhjX.js → TagInput-CZSeyesi.js} +2 -2
  107. package/dashboard/dist/assets/{TagInput-B00uqhjX.js.map → TagInput-CZSeyesi.js.map} +1 -1
  108. package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js → TaskDetailPage-BjHU6opi.js} +2 -2
  109. package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js.map → TaskDetailPage-BjHU6opi.js.map} +1 -1
  110. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js → TaskQueuePill-CQrXrSxk.js} +2 -2
  111. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js.map → TaskQueuePill-CQrXrSxk.js.map} +1 -1
  112. package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js → TasksListPage-Bem44zd0.js} +2 -2
  113. package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js.map → TasksListPage-Bem44zd0.js.map} +1 -1
  114. package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js → TimeAgo-CUIYqSt_.js} +2 -2
  115. package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js.map → TimeAgo-CUIYqSt_.js.map} +1 -1
  116. package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js → TimestampCell--tnreI1i.js} +2 -2
  117. package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js.map → TimestampCell--tnreI1i.js.map} +1 -1
  118. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js → ToolPill-O09jsTQM.js} +2 -2
  119. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js.map → ToolPill-O09jsTQM.js.map} +1 -1
  120. package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js → ToolTestPanel-OD99H7Pk.js} +2 -2
  121. package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js.map → ToolTestPanel-OD99H7Pk.js.map} +1 -1
  122. package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js → TopicDetailPage-rh_dsTJI.js} +3 -3
  123. package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js.map → TopicDetailPage-rh_dsTJI.js.map} +1 -1
  124. package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js → TopicsPage-CD_40_v-.js} +2 -2
  125. package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js.map → TopicsPage-CD_40_v-.js.map} +1 -1
  126. package/dashboard/dist/assets/{UserName-xHAgkk8M.js → UserName-C__c8BN0.js} +2 -2
  127. package/dashboard/dist/assets/{UserName-xHAgkk8M.js.map → UserName-C__c8BN0.js.map} +1 -1
  128. package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js → WorkflowExecutionPage-Bw6QdtUO.js} +2 -2
  129. package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js.map → WorkflowExecutionPage-Bw6QdtUO.js.map} +1 -1
  130. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js → WorkflowPill-CS-IsR0U.js} +2 -2
  131. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js.map → WorkflowPill-CS-IsR0U.js.map} +1 -1
  132. package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js +2 -0
  133. package/dashboard/dist/assets/WorkflowsDashboard-BgI-iOP6.js.map +1 -0
  134. package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js → WorkflowsOverview-BRc0QbA7.js} +2 -2
  135. package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js.map → WorkflowsOverview-BRc0QbA7.js.map} +1 -1
  136. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js → YamlWorkflowDetailPage-DdzspNQR.js} +2 -2
  137. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js.map → YamlWorkflowDetailPage-DdzspNQR.js.map} +1 -1
  138. package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js → YamlWorkflowsPage-Djw5ZbgQ.js} +2 -2
  139. package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js.map → YamlWorkflowsPage-Djw5ZbgQ.js.map} +1 -1
  140. package/dashboard/dist/assets/{agents-JE4aL07D.js → agents-xstNkF6c.js} +2 -2
  141. package/dashboard/dist/assets/{agents-JE4aL07D.js.map → agents-xstNkF6c.js.map} +1 -1
  142. package/dashboard/dist/assets/api-path-u2Jf9QXS.js +2 -0
  143. package/dashboard/dist/assets/api-path-u2Jf9QXS.js.map +1 -0
  144. package/dashboard/dist/assets/{bots-cAzKkDtQ.js → bots-BztAI0s_.js} +2 -2
  145. package/dashboard/dist/assets/{bots-cAzKkDtQ.js.map → bots-BztAI0s_.js.map} +1 -1
  146. package/dashboard/dist/assets/{capabilities-RBFXLAXF.js → capabilities-CEDwtxNL.js} +2 -2
  147. package/dashboard/dist/assets/{capabilities-RBFXLAXF.js.map → capabilities-CEDwtxNL.js.map} +1 -1
  148. package/dashboard/dist/assets/{controlplane-DGhv3rwI.js → controlplane-BlGEsRKe.js} +2 -2
  149. package/dashboard/dist/assets/{controlplane-DGhv3rwI.js.map → controlplane-BlGEsRKe.js.map} +1 -1
  150. package/dashboard/dist/assets/{escalation-columns-DqTkKbCv.js → escalation-columns-nVYVt7Gl.js} +2 -2
  151. package/dashboard/dist/assets/{escalation-columns-DqTkKbCv.js.map → escalation-columns-nVYVt7Gl.js.map} +1 -1
  152. package/dashboard/dist/assets/{escalation-ne7dIaPa.js → escalation-iI4QKlP-.js} +2 -2
  153. package/dashboard/dist/assets/{escalation-ne7dIaPa.js.map → escalation-iI4QKlP-.js.map} +1 -1
  154. package/dashboard/dist/assets/{index-BbJuC9kg.js → index-B5qsp8lb.js} +2 -2
  155. package/dashboard/dist/assets/{index-BbJuC9kg.js.map → index-B5qsp8lb.js.map} +1 -1
  156. package/dashboard/dist/assets/{index-CgyucK0e.js → index-B7VC0vjf.js} +2 -2
  157. package/dashboard/dist/assets/{index-CgyucK0e.js.map → index-B7VC0vjf.js.map} +1 -1
  158. package/dashboard/dist/assets/{index-CQDn-bLr.js → index-BUmnJ4eT.js} +2 -2
  159. package/dashboard/dist/assets/{index-CQDn-bLr.js.map → index-BUmnJ4eT.js.map} +1 -1
  160. package/dashboard/dist/assets/{index-DgzgRTNg.js → index-CAqEy2Db.js} +2 -2
  161. package/dashboard/dist/assets/{index-DgzgRTNg.js.map → index-CAqEy2Db.js.map} +1 -1
  162. package/dashboard/dist/assets/{index-CByjpYlU.js → index-CMviPjXQ.js} +2 -2
  163. package/dashboard/dist/assets/{index-CByjpYlU.js.map → index-CMviPjXQ.js.map} +1 -1
  164. package/dashboard/dist/assets/index-CP0JEQhZ.js +6 -0
  165. package/dashboard/dist/assets/{index-CucXk58o.js.map → index-CP0JEQhZ.js.map} +1 -1
  166. package/dashboard/dist/assets/index-CUfgt3mV.js +2 -0
  167. package/dashboard/dist/assets/index-CUfgt3mV.js.map +1 -0
  168. package/dashboard/dist/assets/{index-DPJW96d2.js → index-D1xVY4JR.js} +26 -26
  169. package/dashboard/dist/assets/index-D1xVY4JR.js.map +1 -0
  170. package/dashboard/dist/assets/{index-CEpw_Fh8.js → index-DPLy-jwO.js} +2 -2
  171. package/dashboard/dist/assets/{index-CEpw_Fh8.js.map → index-DPLy-jwO.js.map} +1 -1
  172. package/dashboard/dist/assets/{index-BTqhAT6p.js → index-DjJ6VCuc.js} +2 -2
  173. package/dashboard/dist/assets/{index-BTqhAT6p.js.map → index-DjJ6VCuc.js.map} +1 -1
  174. package/dashboard/dist/assets/{index-QxAYCJ1S.js → index-Dsi5o7dx.js} +2 -2
  175. package/dashboard/dist/assets/{index-QxAYCJ1S.js.map → index-Dsi5o7dx.js.map} +1 -1
  176. package/dashboard/dist/assets/{index-C2l4GcZ7.js → index-DzVYjoex.js} +3 -3
  177. package/dashboard/dist/assets/{index-C2l4GcZ7.js.map → index-DzVYjoex.js.map} +1 -1
  178. package/dashboard/dist/assets/index-FuhiJuHL.js +2 -0
  179. package/dashboard/dist/assets/index-FuhiJuHL.js.map +1 -0
  180. package/dashboard/dist/assets/{knowledge-DzRpsm3D.js → knowledge-BKg0cr39.js} +2 -2
  181. package/dashboard/dist/assets/{knowledge-DzRpsm3D.js.map → knowledge-BKg0cr39.js.map} +1 -1
  182. package/dashboard/dist/assets/{mcp-B1lc6nL4.js → mcp-CVdHpKlz.js} +2 -2
  183. package/dashboard/dist/assets/{mcp-B1lc6nL4.js.map → mcp-CVdHpKlz.js.map} +1 -1
  184. package/dashboard/dist/assets/{mcp-query-CXuweaN3.js → mcp-query-CYxZcbwQ.js} +2 -2
  185. package/dashboard/dist/assets/{mcp-query-CXuweaN3.js.map → mcp-query-CYxZcbwQ.js.map} +1 -1
  186. package/dashboard/dist/assets/{pipelines-D4VLWDvu.js → pipelines-BOEv7P6O.js} +2 -2
  187. package/dashboard/dist/assets/{pipelines-D4VLWDvu.js.map → pipelines-BOEv7P6O.js.map} +1 -1
  188. package/dashboard/dist/assets/{roles-CSpHRRu8.js → roles-c5cV2QYQ.js} +2 -2
  189. package/dashboard/dist/assets/{roles-CSpHRRu8.js.map → roles-c5cV2QYQ.js.map} +1 -1
  190. package/dashboard/dist/assets/{tasks-CWUsKhM4.js → tasks-JV3BjeEF.js} +2 -2
  191. package/dashboard/dist/assets/{tasks-CWUsKhM4.js.map → tasks-JV3BjeEF.js.map} +1 -1
  192. package/dashboard/dist/assets/{topics-BXwstrzB.js → topics-BDaPnhnQ.js} +2 -2
  193. package/dashboard/dist/assets/{topics-BXwstrzB.js.map → topics-BDaPnhnQ.js.map} +1 -1
  194. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js +2 -0
  195. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js.map +1 -0
  196. package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js → useEventHooks-a7Dnh8G4.js} +2 -2
  197. package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js.map → useEventHooks-a7Dnh8G4.js.map} +1 -1
  198. package/dashboard/dist/assets/{useNamespace-CsepDyR5.js → useNamespace-BSwEV0e9.js} +2 -2
  199. package/dashboard/dist/assets/{useNamespace-CsepDyR5.js.map → useNamespace-BSwEV0e9.js.map} +1 -1
  200. package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js → useYamlActivityEvents-BuqvL-cn.js} +2 -2
  201. package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js.map → useYamlActivityEvents-BuqvL-cn.js.map} +1 -1
  202. package/dashboard/dist/assets/{users-DvhHbR0R.js → users-Pn85K_3C.js} +2 -2
  203. package/dashboard/dist/assets/{users-DvhHbR0R.js.map → users-Pn85K_3C.js.map} +1 -1
  204. package/dashboard/dist/assets/{vendor-icons-Dj2F0Jrb.js → vendor-icons-D5ycKPA2.js} +114 -109
  205. package/dashboard/dist/assets/vendor-icons-D5ycKPA2.js.map +1 -0
  206. package/dashboard/dist/assets/{workflows-C7Cam2Ok.js → workflows-DF-9Voyi.js} +2 -2
  207. package/dashboard/dist/assets/{workflows-C7Cam2Ok.js.map → workflows-DF-9Voyi.js.map} +1 -1
  208. package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js → yaml-workflows-2roKaSSK.js} +2 -2
  209. package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js.map → yaml-workflows-2roKaSSK.js.map} +1 -1
  210. package/dashboard/dist/index.html +2 -2
  211. package/docs/api/mcp/admin.md +156 -12
  212. package/package.json +1 -1
  213. package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js +0 -4
  214. package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js.map +0 -1
  215. package/dashboard/dist/assets/AgentsPage-C3FztFd_.js +0 -2
  216. package/dashboard/dist/assets/AgentsPage-C3FztFd_.js.map +0 -1
  217. package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js +0 -2
  218. package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js.map +0 -1
  219. package/dashboard/dist/assets/CapabilitiesPage-DTfKCzBQ.js +0 -2
  220. package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js +0 -2
  221. package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js.map +0 -1
  222. package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js +0 -2
  223. package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js.map +0 -1
  224. package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js +0 -2
  225. package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js.map +0 -1
  226. package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js +0 -2
  227. package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js.map +0 -1
  228. package/dashboard/dist/assets/StreamMessageDetail-BF0tM0cd.js +0 -2
  229. package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js +0 -2
  230. package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js.map +0 -1
  231. package/dashboard/dist/assets/index-CucXk58o.js +0 -6
  232. package/dashboard/dist/assets/index-DPJW96d2.js.map +0 -1
  233. package/dashboard/dist/assets/index-DeZhNCf5.js +0 -2
  234. package/dashboard/dist/assets/index-DeZhNCf5.js.map +0 -1
  235. package/dashboard/dist/assets/index-Do8Xp3pa.js +0 -2
  236. package/dashboard/dist/assets/index-Do8Xp3pa.js.map +0 -1
  237. package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
@@ -11,7 +11,8 @@
11
11
  // `hmsh_escalations` here rather than composed from generic SDK calls.
12
12
  // ---------------------------------------------------------------------------
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.RESOLVE_BY_METADATA_ATOMIC = exports.RELEASE_EXPIRED_CLAIMS = void 0;
14
+ exports.RESOLVE_BY_METADATA_ATOMIC = exports.COUNT_SEARCH_ESCALATIONS = exports.RELEASE_EXPIRED_CLAIMS = void 0;
15
+ exports.searchEscalationsQuery = searchEscalationsQuery;
15
16
  /**
16
17
  * Sweep expired claims back to the available pool.
17
18
  *
@@ -31,6 +32,54 @@ SET assigned_to = NULL,
31
32
  WHERE status = 'pending'
32
33
  AND assigned_to IS NOT NULL
33
34
  AND assigned_until <= NOW()`;
35
+ /**
36
+ * Free-text escalation search.
37
+ *
38
+ * The SDK's `client.list()` filters by structured columns only — it has no
39
+ * free-text predicate. Long-tail's contract needs a search box that matches a
40
+ * correlation key (order id, ticket id) or any visible field across the WHOLE
41
+ * result set, not just the current page. That is server-side SQL here (over the
42
+ * `lt_escalations` view, which adds the computed `available` flag), following the
43
+ * same raw-SQL-on-the-shared-table pattern as the atomic resolve below — so the
44
+ * filter flows SQL→service→API→route→dashboard rather than being faked client-side.
45
+ *
46
+ * All structured filters are optional and combine with the search term (AND).
47
+ * `metadata::text ILIKE` scans the JSONB as text (the GIN index is containment-only
48
+ * and cannot serve ILIKE) — bounded in practice by the other filters and the page.
49
+ *
50
+ * $1 status, $2 role, $3 roles (text[] visibleRoles), $4 type, $5 subtype,
51
+ * $6 priority, $7 assigned_to, $8 available (bool), $9 search.
52
+ * The list query adds $10 limit, $11 offset.
53
+ */
54
+ const SEARCH_ESCALATIONS_WHERE = `\
55
+ FROM public.lt_escalations
56
+ WHERE ($1::text IS NULL OR status = $1)
57
+ AND ($2::text IS NULL OR role = $2)
58
+ AND ($3::text[] IS NULL OR role = ANY($3))
59
+ AND ($4::text IS NULL OR type = $4)
60
+ AND ($5::text IS NULL OR subtype = $5)
61
+ AND ($6::int IS NULL OR priority = $6)
62
+ AND ($7::text IS NULL OR assigned_to = $7)
63
+ AND ($8::boolean IS NULL OR available = $8)
64
+ AND ($9::text IS NULL OR (
65
+ description ILIKE '%' || $9 || '%'
66
+ OR type ILIKE '%' || $9 || '%'
67
+ OR subtype ILIKE '%' || $9 || '%'
68
+ OR role ILIKE '%' || $9 || '%'
69
+ OR workflow_id ILIKE '%' || $9 || '%'
70
+ OR origin_id ILIKE '%' || $9 || '%'
71
+ OR id::text ILIKE '%' || $9 || '%'
72
+ OR metadata::text ILIKE '%' || $9 || '%'
73
+ ))`;
74
+ /** Count matching the search WHERE (params $1–$9). */
75
+ exports.COUNT_SEARCH_ESCALATIONS = `SELECT COUNT(*)::int AS total\n${SEARCH_ESCALATIONS_WHERE}`;
76
+ /**
77
+ * Build the search SELECT. `orderBy` is composed from a whitelist by the caller
78
+ * (never raw user input), so it is safe to interpolate; everything else is bound.
79
+ */
80
+ function searchEscalationsQuery(orderBy) {
81
+ return `SELECT *\n${SEARCH_ESCALATIONS_WHERE}\n ORDER BY ${orderBy}\n LIMIT $10 OFFSET $11`;
82
+ }
34
83
  /**
35
84
  * Atomic resolve by metadata with signal guard.
36
85
  *
@@ -4,9 +4,11 @@ import type { ResolvedHandle } from './types';
4
4
  * HotMesh needs to get a workflow handle.
5
5
  *
6
6
  * 1. Look up lt_tasks by workflow_id — returns workflow_type and task_queue.
7
- * 2. If no task record (e.g., orchestrators/containers), fall back to
8
- * durable.jobs (entity) + lt_config_workflows (task_queue).
7
+ * 2. If no task record (e.g., orchestrators/containers, or a child running in
8
+ * another app), fall back to `<appId>.jobs` (entity) + lt_config_workflows
9
+ * (task_queue). `appId` selects the HotMesh namespace to scan — children of
10
+ * a workflow live under their own app's schema, not always `durable`.
9
11
  * 3. If task_queue is null (pre-migration record), fall back to lt_config_workflows.
10
12
  * 4. Throws if the workflow cannot be resolved.
11
13
  */
12
- export declare function resolveWorkflowHandle(workflowId: string): Promise<ResolvedHandle>;
14
+ export declare function resolveWorkflowHandle(workflowId: string, appId?: string): Promise<ResolvedHandle>;
@@ -9,12 +9,14 @@ const sql_1 = require("./sql");
9
9
  * HotMesh needs to get a workflow handle.
10
10
  *
11
11
  * 1. Look up lt_tasks by workflow_id — returns workflow_type and task_queue.
12
- * 2. If no task record (e.g., orchestrators/containers), fall back to
13
- * durable.jobs (entity) + lt_config_workflows (task_queue).
12
+ * 2. If no task record (e.g., orchestrators/containers, or a child running in
13
+ * another app), fall back to `<appId>.jobs` (entity) + lt_config_workflows
14
+ * (task_queue). `appId` selects the HotMesh namespace to scan — children of
15
+ * a workflow live under their own app's schema, not always `durable`.
14
16
  * 3. If task_queue is null (pre-migration record), fall back to lt_config_workflows.
15
17
  * 4. Throws if the workflow cannot be resolved.
16
18
  */
17
- async function resolveWorkflowHandle(workflowId) {
19
+ async function resolveWorkflowHandle(workflowId, appId = 'durable') {
18
20
  const pool = (0, db_1.getPool)();
19
21
  // 1. Try lt_tasks first (leaf workflows)
20
22
  const { rows } = await pool.query(sql_1.RESOLVE_TASK_BY_WORKFLOW_ID, [workflowId]);
@@ -29,9 +31,10 @@ async function resolveWorkflowHandle(workflowId) {
29
31
  return { taskQueue: configRows[0].task_queue, workflowName: workflow_type };
30
32
  }
31
33
  }
32
- // 2. Fall back to durable.jobs — handles orchestrators/containers that
33
- // have no lt_tasks record but do have a job with an entity tag.
34
- const { rows: jobRows } = await pool.query(sql_1.RESOLVE_JOB_ENTITY, [`hmsh:durable:j:${workflowId}`]);
34
+ // 2. Fall back to <appId>.jobs — handles orchestrators/containers that
35
+ // have no lt_tasks record but do have a job with an entity tag, and
36
+ // children running in a non-default namespace.
37
+ const { rows: jobRows } = await pool.query((0, sql_1.RESOLVE_JOB_ENTITY)(appId), [`hmsh:${appId}:j:${workflowId}`]);
35
38
  if (jobRows.length > 0 && jobRows[0].entity) {
36
39
  const entity = jobRows[0].entity;
37
40
  // 2a. Try lt_config_workflows for task_queue
@@ -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);
@@ -2,15 +2,16 @@
2
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
5
+ * diagnose_job — per-job verdict (compact by default; opt into events/streams)
6
6
  * find_stalled_jobs — fleet-level: running jobs with no recent status change
7
7
  * find_orphaned_signals — fleet-level: suspended waiters with no escalation row
8
8
  *
9
9
  * Efficient usage: start fleet-wide (find_orphaned_signals for the genuinely
10
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. For
12
- * full raw message payloads, use the stream browser (list_stream_messages
13
- * filtered by jid), not diagnose_job, which returns a capped summary.
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).
14
15
  */
15
16
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
16
17
  export declare function registerDiagnosticsTools(server: McpServer): void;
@@ -39,21 +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: 'Read-only diagnosis 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 retry state and timing) and the escalation row ' +
45
- 'from hmsh_escalations. Returns structured findings[] with confidence, evidence, ' +
46
- 'and read-only guidance (where to look next — never recovery; HotMesh state ' +
47
- 'cannot be unwound). ' +
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). ' +
48
47
  'A workflow sitting at a condition()/waitFor()/sleepFor() for a long time is ' +
49
48
  'classified as a healthy wait, not a fault — only dead-letter, reservation-leak, ' +
50
49
  'or a suspended-waiter-with-no-escalation indicate a real problem. ' +
51
- 'Events are capped (max_events, default 500); for full raw message payloads use ' +
52
- 'the stream browser (list_stream_messages filtered by jid). Call ' +
53
- 'find_orphaned_signals / find_stalled_jobs first to surface IDs, then this per job.',
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.',
54
56
  inputSchema: schemas_1.diagnoseJobSchema,
55
57
  }, async (args) => {
56
- const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id, maxEvents: args.max_events });
58
+ const result = await api.diagnose({ workflowId: args.workflow_id, appId: args.app_id, maxEvents: args.max_events, include: args.include, verbosity: args.verbosity });
57
59
  if (result.error) {
58
60
  return { content: [{ type: 'text', text: JSON.stringify({ error: result.error }) }], isError: true };
59
61
  }
@@ -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
  }