@hotmeshio/long-tail 0.5.11 → 0.6.0

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 (350) hide show
  1. package/README.md +1 -0
  2. package/build/api/diagnostics.d.ts +5 -0
  3. package/build/api/diagnostics.js +5 -1
  4. package/build/api/escalations/bulk.js +9 -1
  5. package/build/api/escalations/cancel.js +5 -7
  6. package/build/api/escalations/claim.js +18 -15
  7. package/build/api/escalations/create.d.ts +6 -0
  8. package/build/api/escalations/create.js +11 -8
  9. package/build/api/escalations/facets.d.ts +18 -0
  10. package/build/api/escalations/facets.js +115 -0
  11. package/build/api/escalations/helpers.d.ts +70 -1
  12. package/build/api/escalations/helpers.js +101 -7
  13. package/build/api/escalations/index.d.ts +3 -2
  14. package/build/api/escalations/index.js +7 -1
  15. package/build/api/escalations/list.d.ts +23 -2
  16. package/build/api/escalations/list.js +111 -10
  17. package/build/api/escalations/metadata.js +22 -27
  18. package/build/api/escalations/resolve.d.ts +19 -1
  19. package/build/api/escalations/resolve.js +111 -26
  20. package/build/api/escalations/single.js +8 -8
  21. package/build/api/settings.d.ts +1 -1
  22. package/build/api/settings.js +3 -1
  23. package/build/api/users.d.ts +6 -0
  24. package/build/api/users.js +29 -1
  25. package/build/api/workflows/invocation.d.ts +6 -0
  26. package/build/api/workflows/invocation.js +6 -2
  27. package/build/bin/ltc.js +40 -0
  28. package/build/lib/cli/commands/escalations.d.ts +36 -0
  29. package/build/lib/cli/commands/escalations.js +98 -0
  30. package/build/lib/db/schemas/001_schema.sql +10 -5
  31. package/build/lib/db/schemas/012_lt_tasks_workflow_id_unique.sql +20 -0
  32. package/build/lib/db/schemas/013_role_scope.sql +37 -0
  33. package/build/modules/features.d.ts +19 -0
  34. package/build/modules/features.js +16 -0
  35. package/build/modules/version.d.ts +10 -5
  36. package/build/modules/version.js +27 -11
  37. package/build/routes/diagnostics.js +15 -2
  38. package/build/routes/escalations/facets.d.ts +7 -0
  39. package/build/routes/escalations/facets.js +81 -0
  40. package/build/routes/escalations/index.js +3 -0
  41. package/build/routes/escalations/list.js +48 -0
  42. package/build/routes/escalations/resolve.js +22 -4
  43. package/build/routes/users.js +9 -5
  44. package/build/routes/workflows/invocation.js +12 -4
  45. package/build/sdk/index.d.ts +35 -2
  46. package/build/sdk/index.js +7 -0
  47. package/build/services/diagnostics/index.d.ts +40 -6
  48. package/build/services/diagnostics/index.js +54 -5
  49. package/build/services/escalation/crud.d.ts +56 -6
  50. package/build/services/escalation/crud.js +102 -31
  51. package/build/services/escalation/facet-sql.d.ts +18 -0
  52. package/build/services/escalation/facet-sql.js +118 -0
  53. package/build/services/escalation/facets.d.ts +45 -0
  54. package/build/services/escalation/facets.js +218 -0
  55. package/build/services/escalation/index.d.ts +1 -0
  56. package/build/services/escalation/index.js +8 -1
  57. package/build/services/escalation/queries.d.ts +47 -0
  58. package/build/services/escalation/queries.js +185 -2
  59. package/build/services/escalation/sql.d.ts +15 -2
  60. package/build/services/escalation/sql.js +80 -3
  61. package/build/services/interceptor/activities/escalation.d.ts +2 -0
  62. package/build/services/interceptor/activities/escalation.js +1 -1
  63. package/build/services/interceptor/lifecycle.js +4 -0
  64. package/build/services/mcp/server-tools.js +10 -4
  65. package/build/services/orchestrator/condition.js +6 -2
  66. package/build/services/role/index.js +2 -3
  67. package/build/services/role/sql.d.ts +8 -0
  68. package/build/services/role/sql.js +17 -1
  69. package/build/services/task/crud.js +22 -14
  70. package/build/services/task/process.js +3 -21
  71. package/build/services/task/resolve.d.ts +5 -3
  72. package/build/services/task/resolve.js +9 -6
  73. package/build/services/task/sql.d.ts +30 -2
  74. package/build/services/task/sql.js +72 -2
  75. package/build/services/user/crud.d.ts +1 -0
  76. package/build/services/user/crud.js +29 -11
  77. package/build/services/user/index.d.ts +2 -1
  78. package/build/services/user/index.js +12 -1
  79. package/build/services/user/rbac.d.ts +18 -0
  80. package/build/services/user/rbac.js +27 -0
  81. package/build/services/user/roles.d.ts +7 -2
  82. package/build/services/user/roles.js +21 -5
  83. package/build/services/user/scope.d.ts +22 -0
  84. package/build/services/user/scope.js +50 -0
  85. package/build/services/user/seed-admin.js +34 -17
  86. package/build/services/user/sql.d.ts +18 -7
  87. package/build/services/user/sql.js +38 -13
  88. package/build/services/user/sso-provision.js +41 -24
  89. package/build/services/user/types.d.ts +9 -5
  90. package/build/start/adapters.js +3 -0
  91. package/build/system/mcp-servers/admin/diagnostics.d.ts +5 -4
  92. package/build/system/mcp-servers/admin/diagnostics.js +12 -10
  93. package/build/system/mcp-servers/admin/escalations.d.ts +6 -0
  94. package/build/system/mcp-servers/admin/escalations.js +247 -54
  95. package/build/system/mcp-servers/admin/index.js +3 -3
  96. package/build/system/mcp-servers/admin/schemas.d.ts +417 -3
  97. package/build/system/mcp-servers/admin/schemas.js +101 -5
  98. package/build/system/mcp-servers/admin/users.js +28 -2
  99. package/build/system/mcp-servers/admin/workflows.js +23 -12
  100. package/build/system/seed/tool-manifests-admin.d.ts +1324 -562
  101. package/build/system/seed/tool-manifests-admin.js +10 -2
  102. package/build/tsconfig.tsbuildinfo +1 -1
  103. package/build/types/envelope.d.ts +7 -0
  104. package/build/types/facets.d.ts +60 -0
  105. package/build/types/facets.js +10 -0
  106. package/build/types/index.d.ts +2 -1
  107. package/build/types/startup.d.ts +9 -0
  108. package/build/types/user.d.ts +11 -0
  109. package/dashboard/dist/assets/AdminDashboard-2CZ8py9X.js +2 -0
  110. package/dashboard/dist/assets/{AdminDashboard-DZpduYdW.js.map → AdminDashboard-2CZ8py9X.js.map} +1 -1
  111. package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js → AgentConfigPage-D68sodgo.js} +7 -7
  112. package/dashboard/dist/assets/{AgentConfigPage-SFnHMIP6.js.map → AgentConfigPage-D68sodgo.js.map} +1 -1
  113. package/dashboard/dist/assets/AgentDetailPage-BmhuWbKi.js +4 -0
  114. package/dashboard/dist/assets/AgentDetailPage-BmhuWbKi.js.map +1 -0
  115. package/dashboard/dist/assets/AgentsPage-C4SKQVeU.js +2 -0
  116. package/dashboard/dist/assets/AgentsPage-C4SKQVeU.js.map +1 -0
  117. package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js +2 -0
  118. package/dashboard/dist/assets/AvailableEscalationsPage-9RBEYwkt.js.map +1 -0
  119. package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js → BotPicker-D-FvXJOM.js} +2 -2
  120. package/dashboard/dist/assets/{BotPicker-Dse2jW4b.js.map → BotPicker-D-FvXJOM.js.map} +1 -1
  121. package/dashboard/dist/assets/CapabilitiesPage-ByDf6WJr.js +2 -0
  122. package/dashboard/dist/assets/{CapabilitiesPage-DTfKCzBQ.js.map → CapabilitiesPage-ByDf6WJr.js.map} +1 -1
  123. package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js → CollapsibleSection-BjGNYEvh.js} +2 -2
  124. package/dashboard/dist/assets/{CollapsibleSection-8vf38J6K.js.map → CollapsibleSection-BjGNYEvh.js.map} +1 -1
  125. package/dashboard/dist/assets/CopyableId-blg-gZvT.js +2 -0
  126. package/dashboard/dist/assets/CopyableId-blg-gZvT.js.map +1 -0
  127. package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js → CredentialsPage-DvCA-wQN.js} +2 -2
  128. package/dashboard/dist/assets/{CredentialsPage-7C4M-hrH.js.map → CredentialsPage-DvCA-wQN.js.map} +1 -1
  129. package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js → CronLabel-DBMurd_c.js} +2 -2
  130. package/dashboard/dist/assets/{CronLabel-DrGWtaSY.js.map → CronLabel-DBMurd_c.js.map} +1 -1
  131. package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js → CustomDurationPicker-DHflFoEa.js} +2 -2
  132. package/dashboard/dist/assets/{CustomDurationPicker-Vcmr4LiR.js.map → CustomDurationPicker-DHflFoEa.js.map} +1 -1
  133. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js → DropZone-CUtdp99Z.js} +2 -2
  134. package/dashboard/dist/assets/{DropZone-Dwpgbueb.js.map → DropZone-CUtdp99Z.js.map} +1 -1
  135. package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js → ElapsedCell-CSjcVOpo.js} +2 -2
  136. package/dashboard/dist/assets/{ElapsedCell-BNexhR5d.js.map → ElapsedCell-CSjcVOpo.js.map} +1 -1
  137. package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js → EscalationsOverview-BUqRNJbK.js} +2 -2
  138. package/dashboard/dist/assets/{EscalationsOverview-BI3DEwYP.js.map → EscalationsOverview-BUqRNJbK.js.map} +1 -1
  139. package/dashboard/dist/assets/{EventTable-CwvX_L9t.js → EventTable-Chz-6XPE.js} +2 -2
  140. package/dashboard/dist/assets/{EventTable-CwvX_L9t.js.map → EventTable-Chz-6XPE.js.map} +1 -1
  141. package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js → GraphInvokePage-BXdgciWg.js} +2 -2
  142. package/dashboard/dist/assets/{GraphInvokePage-C-3b8WK0.js.map → GraphInvokePage-BXdgciWg.js.map} +1 -1
  143. package/dashboard/dist/assets/{HomePage-BS_-jcHr.js → HomePage-CEMxnk0r.js} +2 -2
  144. package/dashboard/dist/assets/{HomePage-BS_-jcHr.js.map → HomePage-CEMxnk0r.js.map} +1 -1
  145. package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js → ListToolbar-_73JCdbB.js} +2 -2
  146. package/dashboard/dist/assets/{ListToolbar-BH9rwQVE.js.map → ListToolbar-_73JCdbB.js.map} +1 -1
  147. package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js → McpOverview-DfdqxhSz.js} +2 -2
  148. package/dashboard/dist/assets/{McpOverview-C9iOdE7E.js.map → McpOverview-DfdqxhSz.js.map} +1 -1
  149. package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js → McpQueryDetailPage-DPAljieY.js} +2 -2
  150. package/dashboard/dist/assets/{McpQueryDetailPage-DMN-yqvJ.js.map → McpQueryDetailPage-DPAljieY.js.map} +1 -1
  151. package/dashboard/dist/assets/McpQueryPage-D5cSziYS.js +2 -0
  152. package/dashboard/dist/assets/McpQueryPage-D5cSziYS.js.map +1 -0
  153. package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js → McpRunDetailPage-DwNb9wZg.js} +2 -2
  154. package/dashboard/dist/assets/{McpRunDetailPage-Wb47sRvo.js.map → McpRunDetailPage-DwNb9wZg.js.map} +1 -1
  155. package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js +2 -0
  156. package/dashboard/dist/assets/McpRunsPage-O5H6yStl.js.map +1 -0
  157. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js → NamespacePill-uW-xOedj.js} +2 -2
  158. package/dashboard/dist/assets/{NamespacePill-DnJl4Lre.js.map → NamespacePill-uW-xOedj.js.map} +1 -1
  159. package/dashboard/dist/assets/OperatorDashboard-DYw9Ekv5.js +2 -0
  160. package/dashboard/dist/assets/OperatorDashboard-DYw9Ekv5.js.map +1 -0
  161. package/dashboard/dist/assets/PageHeader-DVOZjBfL.js +2 -0
  162. package/dashboard/dist/assets/PageHeader-DVOZjBfL.js.map +1 -0
  163. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js → PageHeaderWithStats-DtTpDHOd.js} +2 -2
  164. package/dashboard/dist/assets/{PageHeaderWithStats-BuKc9MKt.js.map → PageHeaderWithStats-DtTpDHOd.js.map} +1 -1
  165. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js +2 -0
  166. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +1 -0
  167. package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js → ProcessDetailPage-B0Dokcx9.js} +2 -2
  168. package/dashboard/dist/assets/{ProcessDetailPage-CvPx-h8y.js.map → ProcessDetailPage-B0Dokcx9.js.map} +1 -1
  169. package/dashboard/dist/assets/ProcessesListPage-Cc87WIjL.js +2 -0
  170. package/dashboard/dist/assets/ProcessesListPage-Cc87WIjL.js.map +1 -0
  171. package/dashboard/dist/assets/RolePill-BaW-30TC.js +2 -0
  172. package/dashboard/dist/assets/RolePill-BaW-30TC.js.map +1 -0
  173. package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js → RolesPage-cp6PiF08.js} +2 -2
  174. package/dashboard/dist/assets/{RolesPage-W5ZjOHpg.js.map → RolesPage-cp6PiF08.js.map} +1 -1
  175. package/dashboard/dist/assets/RowActions-BA9L9djf.js +2 -0
  176. package/dashboard/dist/assets/RowActions-BA9L9djf.js.map +1 -0
  177. package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js → RunAsSelector-2LWkjSnO.js} +2 -2
  178. package/dashboard/dist/assets/{RunAsSelector-CvxGTNGT.js.map → RunAsSelector-2LWkjSnO.js.map} +1 -1
  179. package/dashboard/dist/assets/{StickyPagination-BWhFSr2d.js → StickyPagination-BQEm--kI.js} +2 -2
  180. package/dashboard/dist/assets/{StickyPagination-BWhFSr2d.js.map → StickyPagination-BQEm--kI.js.map} +1 -1
  181. package/dashboard/dist/assets/StreamMessageDetail-BTtw3GjX.js +2 -0
  182. package/dashboard/dist/assets/{StreamMessageDetail-BF0tM0cd.js.map → StreamMessageDetail-BTtw3GjX.js.map} +1 -1
  183. package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js → SwimlaneTimeline-DdXxP4fO.js} +2 -2
  184. package/dashboard/dist/assets/{SwimlaneTimeline-Bv-KHY9s.js.map → SwimlaneTimeline-DdXxP4fO.js.map} +1 -1
  185. package/dashboard/dist/assets/{TagInput-B00uqhjX.js → TagInput-x9XTuqMb.js} +2 -2
  186. package/dashboard/dist/assets/{TagInput-B00uqhjX.js.map → TagInput-x9XTuqMb.js.map} +1 -1
  187. package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js → TaskDetailPage-B8veYG4X.js} +2 -2
  188. package/dashboard/dist/assets/{TaskDetailPage-Bzb_fuLy.js.map → TaskDetailPage-B8veYG4X.js.map} +1 -1
  189. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js → TaskQueuePill-DSEQZ-HT.js} +2 -2
  190. package/dashboard/dist/assets/{TaskQueuePill-CUsofm0X.js.map → TaskQueuePill-DSEQZ-HT.js.map} +1 -1
  191. package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js → TasksListPage-CsN1gZj5.js} +2 -2
  192. package/dashboard/dist/assets/{TasksListPage-CBezWaZL.js.map → TasksListPage-CsN1gZj5.js.map} +1 -1
  193. package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js → TimeAgo-n182EcLx.js} +2 -2
  194. package/dashboard/dist/assets/{TimeAgo-CKHfTzat.js.map → TimeAgo-n182EcLx.js.map} +1 -1
  195. package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js → TimestampCell-2dlcQAfX.js} +2 -2
  196. package/dashboard/dist/assets/{TimestampCell-Dsje8GH-.js.map → TimestampCell-2dlcQAfX.js.map} +1 -1
  197. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js → ToolPill-B_e4eT77.js} +2 -2
  198. package/dashboard/dist/assets/{ToolPill-DjvedZSn.js.map → ToolPill-B_e4eT77.js.map} +1 -1
  199. package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js → ToolTestPanel-Bhnncc6M.js} +2 -2
  200. package/dashboard/dist/assets/{ToolTestPanel-3OcG18e5.js.map → ToolTestPanel-Bhnncc6M.js.map} +1 -1
  201. package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js → TopicDetailPage-29lsNsqI.js} +3 -3
  202. package/dashboard/dist/assets/{TopicDetailPage-DCtv91hH.js.map → TopicDetailPage-29lsNsqI.js.map} +1 -1
  203. package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js → TopicsPage-KJ7_LAvo.js} +2 -2
  204. package/dashboard/dist/assets/{TopicsPage-DVGSNc_E.js.map → TopicsPage-KJ7_LAvo.js.map} +1 -1
  205. package/dashboard/dist/assets/{UserName-xHAgkk8M.js → UserName-CMoFi9zb.js} +2 -2
  206. package/dashboard/dist/assets/{UserName-xHAgkk8M.js.map → UserName-CMoFi9zb.js.map} +1 -1
  207. package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js → WorkflowExecutionPage-Cymfx-Bp.js} +2 -2
  208. package/dashboard/dist/assets/{WorkflowExecutionPage-CWNxsS8a.js.map → WorkflowExecutionPage-Cymfx-Bp.js.map} +1 -1
  209. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js → WorkflowPill-B66_AnaY.js} +2 -2
  210. package/dashboard/dist/assets/{WorkflowPill-F1oKUzmc.js.map → WorkflowPill-B66_AnaY.js.map} +1 -1
  211. package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js +2 -0
  212. package/dashboard/dist/assets/WorkflowsDashboard-CqLN8spd.js.map +1 -0
  213. package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js → WorkflowsOverview-0Rc2WT6q.js} +2 -2
  214. package/dashboard/dist/assets/{WorkflowsOverview-e7jWSj_n.js.map → WorkflowsOverview-0Rc2WT6q.js.map} +1 -1
  215. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js → YamlWorkflowDetailPage-CARQ7_LN.js} +2 -2
  216. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CdAeam76.js.map → YamlWorkflowDetailPage-CARQ7_LN.js.map} +1 -1
  217. package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js → YamlWorkflowsPage-B-7sz1nf.js} +2 -2
  218. package/dashboard/dist/assets/{YamlWorkflowsPage-S_gKs2Di.js.map → YamlWorkflowsPage-B-7sz1nf.js.map} +1 -1
  219. package/dashboard/dist/assets/{agents-JE4aL07D.js → agents-zM43d5Yf.js} +2 -2
  220. package/dashboard/dist/assets/{agents-JE4aL07D.js.map → agents-zM43d5Yf.js.map} +1 -1
  221. package/dashboard/dist/assets/api-path-u2Jf9QXS.js +2 -0
  222. package/dashboard/dist/assets/api-path-u2Jf9QXS.js.map +1 -0
  223. package/dashboard/dist/assets/{bots-cAzKkDtQ.js → bots-D5BasOGz.js} +2 -2
  224. package/dashboard/dist/assets/{bots-cAzKkDtQ.js.map → bots-D5BasOGz.js.map} +1 -1
  225. package/dashboard/dist/assets/{capabilities-RBFXLAXF.js → capabilities-BT3PW9CZ.js} +2 -2
  226. package/dashboard/dist/assets/{capabilities-RBFXLAXF.js.map → capabilities-BT3PW9CZ.js.map} +1 -1
  227. package/dashboard/dist/assets/{controlplane-DGhv3rwI.js → controlplane-NpJr49rN.js} +2 -2
  228. package/dashboard/dist/assets/{controlplane-DGhv3rwI.js.map → controlplane-NpJr49rN.js.map} +1 -1
  229. package/dashboard/dist/assets/{escalation-ne7dIaPa.js → escalation-DrzQolPG.js} +2 -2
  230. package/dashboard/dist/assets/{escalation-ne7dIaPa.js.map → escalation-DrzQolPG.js.map} +1 -1
  231. package/dashboard/dist/assets/escalation-columns-QzwmtD60.js +2 -0
  232. package/dashboard/dist/assets/escalation-columns-QzwmtD60.js.map +1 -0
  233. package/dashboard/dist/assets/index-B5w4Gjyk.js +6 -0
  234. package/dashboard/dist/assets/index-B5w4Gjyk.js.map +1 -0
  235. package/dashboard/dist/assets/{index-CByjpYlU.js → index-BCT4kqGR.js} +2 -2
  236. package/dashboard/dist/assets/{index-CByjpYlU.js.map → index-BCT4kqGR.js.map} +1 -1
  237. package/dashboard/dist/assets/{index-CgyucK0e.js → index-C69XvBfg.js} +2 -2
  238. package/dashboard/dist/assets/{index-CgyucK0e.js.map → index-C69XvBfg.js.map} +1 -1
  239. package/dashboard/dist/assets/index-CHw4Fl0t.css +1 -0
  240. package/dashboard/dist/assets/index-C_NwHTMh.js +2 -0
  241. package/dashboard/dist/assets/index-C_NwHTMh.js.map +1 -0
  242. package/dashboard/dist/assets/{index-DgzgRTNg.js → index-Cq0trGqf.js} +2 -2
  243. package/dashboard/dist/assets/{index-DgzgRTNg.js.map → index-Cq0trGqf.js.map} +1 -1
  244. package/dashboard/dist/assets/{index-DPJW96d2.js → index-DE0r9SEX.js} +26 -26
  245. package/dashboard/dist/assets/index-DE0r9SEX.js.map +1 -0
  246. package/dashboard/dist/assets/{index-BTqhAT6p.js → index-DH_CiD0W.js} +2 -2
  247. package/dashboard/dist/assets/{index-BTqhAT6p.js.map → index-DH_CiD0W.js.map} +1 -1
  248. package/dashboard/dist/assets/{index-C2l4GcZ7.js → index-K23FdS-T.js} +3 -3
  249. package/dashboard/dist/assets/{index-C2l4GcZ7.js.map → index-K23FdS-T.js.map} +1 -1
  250. package/dashboard/dist/assets/index-f6K1UNrn.js +2 -0
  251. package/dashboard/dist/assets/index-f6K1UNrn.js.map +1 -0
  252. package/dashboard/dist/assets/{index-BbJuC9kg.js → index-qr1fndqM.js} +2 -2
  253. package/dashboard/dist/assets/{index-BbJuC9kg.js.map → index-qr1fndqM.js.map} +1 -1
  254. package/dashboard/dist/assets/index-vKTvJ_li.js +2 -0
  255. package/dashboard/dist/assets/index-vKTvJ_li.js.map +1 -0
  256. package/dashboard/dist/assets/{index-CQDn-bLr.js → index-y-3ODtEE.js} +2 -2
  257. package/dashboard/dist/assets/{index-CQDn-bLr.js.map → index-y-3ODtEE.js.map} +1 -1
  258. package/dashboard/dist/assets/{index-QxAYCJ1S.js → index-y56Ds-LB.js} +2 -2
  259. package/dashboard/dist/assets/{index-QxAYCJ1S.js.map → index-y56Ds-LB.js.map} +1 -1
  260. package/dashboard/dist/assets/{knowledge-DzRpsm3D.js → knowledge-DSSATOTX.js} +2 -2
  261. package/dashboard/dist/assets/{knowledge-DzRpsm3D.js.map → knowledge-DSSATOTX.js.map} +1 -1
  262. package/dashboard/dist/assets/{mcp-B1lc6nL4.js → mcp-CfJFVo5k.js} +2 -2
  263. package/dashboard/dist/assets/{mcp-B1lc6nL4.js.map → mcp-CfJFVo5k.js.map} +1 -1
  264. package/dashboard/dist/assets/{mcp-query-CXuweaN3.js → mcp-query-DKVx2Q-X.js} +2 -2
  265. package/dashboard/dist/assets/{mcp-query-CXuweaN3.js.map → mcp-query-DKVx2Q-X.js.map} +1 -1
  266. package/dashboard/dist/assets/{pipelines-D4VLWDvu.js → pipelines-BSWzE-6M.js} +2 -2
  267. package/dashboard/dist/assets/{pipelines-D4VLWDvu.js.map → pipelines-BSWzE-6M.js.map} +1 -1
  268. package/dashboard/dist/assets/{roles-CSpHRRu8.js → roles-t9HzhI5N.js} +2 -2
  269. package/dashboard/dist/assets/{roles-CSpHRRu8.js.map → roles-t9HzhI5N.js.map} +1 -1
  270. package/dashboard/dist/assets/{tasks-CWUsKhM4.js → tasks-B7rUihoH.js} +2 -2
  271. package/dashboard/dist/assets/{tasks-CWUsKhM4.js.map → tasks-B7rUihoH.js.map} +1 -1
  272. package/dashboard/dist/assets/{topics-BXwstrzB.js → topics-PC2fEiyD.js} +2 -2
  273. package/dashboard/dist/assets/{topics-BXwstrzB.js.map → topics-PC2fEiyD.js.map} +1 -1
  274. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js +2 -0
  275. package/dashboard/dist/assets/useDebouncedValue-BA5S7V54.js.map +1 -0
  276. package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js → useEventHooks-DK9mw1cI.js} +2 -2
  277. package/dashboard/dist/assets/{useEventHooks-CjygrbYy.js.map → useEventHooks-DK9mw1cI.js.map} +1 -1
  278. package/dashboard/dist/assets/{useNamespace-CsepDyR5.js → useNamespace-3IjtUtAw.js} +2 -2
  279. package/dashboard/dist/assets/{useNamespace-CsepDyR5.js.map → useNamespace-3IjtUtAw.js.map} +1 -1
  280. package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js → useYamlActivityEvents-uxukp3gO.js} +2 -2
  281. package/dashboard/dist/assets/{useYamlActivityEvents-gWIG6akB.js.map → useYamlActivityEvents-uxukp3gO.js.map} +1 -1
  282. package/dashboard/dist/assets/users-CC4B5Fm5.js +2 -0
  283. package/dashboard/dist/assets/users-CC4B5Fm5.js.map +1 -0
  284. package/dashboard/dist/assets/{vendor-icons-Dj2F0Jrb.js → vendor-icons-Dy5Jpknf.js} +114 -109
  285. package/dashboard/dist/assets/vendor-icons-Dy5Jpknf.js.map +1 -0
  286. package/dashboard/dist/assets/{workflows-C7Cam2Ok.js → workflows-S7MF1nNk.js} +2 -2
  287. package/dashboard/dist/assets/{workflows-C7Cam2Ok.js.map → workflows-S7MF1nNk.js.map} +1 -1
  288. package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js → yaml-workflows-WfdaMHNn.js} +2 -2
  289. package/dashboard/dist/assets/{yaml-workflows-ChUOE22W.js.map → yaml-workflows-WfdaMHNn.js.map} +1 -1
  290. package/dashboard/dist/index.html +3 -3
  291. package/docs/api/http/escalations.md +131 -10
  292. package/docs/api/http/roles.md +44 -9
  293. package/docs/api/http/users.md +15 -6
  294. package/docs/api/mcp/admin.md +164 -14
  295. package/docs/api/mcp/human-queue.md +34 -2
  296. package/docs/api/sdk/escalations.md +155 -2
  297. package/docs/api/sdk/roles.md +11 -0
  298. package/docs/api/sdk/users.md +26 -1
  299. package/docs/auth.md +1 -1
  300. package/docs/dashboard.md +5 -4
  301. package/docs/data.md +9 -2
  302. package/docs/faceted-routing.md +221 -0
  303. package/docs/hitl-guide.md +50 -0
  304. package/docs/iam.md +31 -0
  305. package/docs/mcp.md +8 -0
  306. package/package.json +2 -2
  307. package/dashboard/dist/assets/AdminDashboard-DZpduYdW.js +0 -2
  308. package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js +0 -4
  309. package/dashboard/dist/assets/AgentDetailPage-C-2iSaDs.js.map +0 -1
  310. package/dashboard/dist/assets/AgentsPage-C3FztFd_.js +0 -2
  311. package/dashboard/dist/assets/AgentsPage-C3FztFd_.js.map +0 -1
  312. package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js +0 -2
  313. package/dashboard/dist/assets/AvailableEscalationsPage-DIqdBCwe.js.map +0 -1
  314. package/dashboard/dist/assets/CapabilitiesPage-DTfKCzBQ.js +0 -2
  315. package/dashboard/dist/assets/CopyableId-DaT0ZRHg.js +0 -2
  316. package/dashboard/dist/assets/CopyableId-DaT0ZRHg.js.map +0 -1
  317. package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js +0 -2
  318. package/dashboard/dist/assets/McpQueryPage-Db1LUKVs.js.map +0 -1
  319. package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js +0 -2
  320. package/dashboard/dist/assets/McpRunsPage--tgT5uo7.js.map +0 -1
  321. package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js +0 -2
  322. package/dashboard/dist/assets/OperatorDashboard-BWVUbJkZ.js.map +0 -1
  323. package/dashboard/dist/assets/PageHeader-Bnt2iQQa.js +0 -2
  324. package/dashboard/dist/assets/PageHeader-Bnt2iQQa.js.map +0 -1
  325. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  326. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js.map +0 -1
  327. package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js +0 -2
  328. package/dashboard/dist/assets/ProcessesListPage-CWiRM_h3.js.map +0 -1
  329. package/dashboard/dist/assets/RolePill-DQTT1s9v.js +0 -2
  330. package/dashboard/dist/assets/RolePill-DQTT1s9v.js.map +0 -1
  331. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  332. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js.map +0 -1
  333. package/dashboard/dist/assets/StreamMessageDetail-BF0tM0cd.js +0 -2
  334. package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js +0 -2
  335. package/dashboard/dist/assets/WorkflowsDashboard-M13lIaw7.js.map +0 -1
  336. package/dashboard/dist/assets/escalation-columns-DqTkKbCv.js +0 -2
  337. package/dashboard/dist/assets/escalation-columns-DqTkKbCv.js.map +0 -1
  338. package/dashboard/dist/assets/index-CEpw_Fh8.js +0 -2
  339. package/dashboard/dist/assets/index-CEpw_Fh8.js.map +0 -1
  340. package/dashboard/dist/assets/index-ClvYSNZd.css +0 -1
  341. package/dashboard/dist/assets/index-CucXk58o.js +0 -6
  342. package/dashboard/dist/assets/index-CucXk58o.js.map +0 -1
  343. package/dashboard/dist/assets/index-DPJW96d2.js.map +0 -1
  344. package/dashboard/dist/assets/index-DeZhNCf5.js +0 -2
  345. package/dashboard/dist/assets/index-DeZhNCf5.js.map +0 -1
  346. package/dashboard/dist/assets/index-Do8Xp3pa.js +0 -2
  347. package/dashboard/dist/assets/index-Do8Xp3pa.js.map +0 -1
  348. package/dashboard/dist/assets/users-DvhHbR0R.js +0 -2
  349. package/dashboard/dist/assets/users-DvhHbR0R.js.map +0 -1
  350. package/dashboard/dist/assets/vendor-icons-Dj2F0Jrb.js.map +0 -1
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerFacetRoutes = registerFacetRoutes;
37
+ const api = __importStar(require("../../api/escalations"));
38
+ /**
39
+ * Faceted-routing HTTP surface — pond search + batch claim. Each operation targets a
40
+ * single pond `role` and is RBAC-scoped to it (the api layer enforces the gate). These
41
+ * mirror the SDK `escalations.searchByFacets / claimGroups / claimByFacets`.
42
+ */
43
+ function registerFacetRoutes(router) {
44
+ /**
45
+ * POST /api/escalations/search-by-facets
46
+ * Item-level faceted search over a pond, scoped to the caller's role.
47
+ * Body: FacetQuery — { role, status?, available?, facets?, orderBy?, limit?, offset? }
48
+ */
49
+ router.post('/search-by-facets', async (req, res) => {
50
+ const result = await api.searchByFacets(req.body ?? {}, req.auth);
51
+ res.status(result.status).json(result.data ?? { error: result.error });
52
+ });
53
+ /**
54
+ * POST /api/escalations/claim-groups
55
+ * Batch-claim complete origin groups in priority order, assigned to the caller.
56
+ * Body: { query: FacetQuery, limit?, durationMinutes?, sizeFacet? }
57
+ */
58
+ router.post('/claim-groups', async (req, res) => {
59
+ const result = await api.claimGroups({
60
+ query: req.body?.query,
61
+ limit: req.body?.limit,
62
+ durationMinutes: req.body?.durationMinutes,
63
+ sizeFacet: req.body?.sizeFacet,
64
+ }, req.auth);
65
+ res.status(result.status).json(result.data ?? { error: result.error });
66
+ });
67
+ /**
68
+ * POST /api/escalations/claim-by-facets
69
+ * Batch-claim individual rows (FOR UPDATE SKIP LOCKED), assigned to the caller.
70
+ * Body: { query: FacetQuery, limit?, durationMinutes?, allOrNone? }
71
+ */
72
+ router.post('/claim-by-facets', async (req, res) => {
73
+ const result = await api.claimByFacets({
74
+ query: req.body?.query,
75
+ limit: req.body?.limit,
76
+ durationMinutes: req.body?.durationMinutes,
77
+ allOrNone: req.body?.allOrNone,
78
+ }, req.auth);
79
+ res.status(result.status).json(result.data ?? { error: result.error });
80
+ });
81
+ }
@@ -6,6 +6,7 @@ const bulk_1 = require("./bulk");
6
6
  const metadata_1 = require("./metadata");
7
7
  const single_1 = require("./single");
8
8
  const resolve_1 = require("./resolve");
9
+ const facets_1 = require("./facets");
9
10
  const router = (0, express_1.Router)();
10
11
  // Registration order matters: literal paths before parameterized /:id routes.
11
12
  // GET /, /available, /types, /stats
@@ -15,6 +16,8 @@ const router = (0, express_1.Router)();
15
16
  (0, bulk_1.registerBulkRoutes)(router);
16
17
  // GET /by-metadata, POST /claim-by-metadata, POST /resolve-by-metadata
17
18
  (0, metadata_1.registerMetadataRoutes)(router);
19
+ // POST /search-by-facets, /claim-groups, /claim-by-facets
20
+ (0, facets_1.registerFacetRoutes)(router);
18
21
  // PATCH /:id/escalate, GET /by-workflow/:workflowId,
19
22
  // GET /:id, POST /:id/claim, POST /:id/release
20
23
  (0, single_1.registerSingleRoutes)(router);
@@ -35,6 +35,21 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerListRoutes = registerListRoutes;
37
37
  const api = __importStar(require("../../api/escalations"));
38
+ /**
39
+ * Parse a JSON-encoded query param (facets/block/range/exists/orderBy/roles) so the
40
+ * full faceted query rides on a GET URL — keeps the dashboard's copy-URL/curl path
41
+ * reproducible. Returns undefined on absent/invalid JSON (never throws to the caller).
42
+ */
43
+ function jsonParam(v) {
44
+ if (typeof v !== 'string' || !v)
45
+ return undefined;
46
+ try {
47
+ return JSON.parse(v);
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
38
53
  function registerListRoutes(router) {
39
54
  /**
40
55
  * POST /api/escalations
@@ -55,6 +70,13 @@ function registerListRoutes(router) {
55
70
  envelope: req.body?.envelope,
56
71
  metadata: req.body?.metadata,
57
72
  escalation_payload: req.body?.escalation_payload,
73
+ // Workflow-linkage (optional): an advert for a running workflow.
74
+ origin_id: req.body?.origin_id,
75
+ parent_id: req.body?.parent_id,
76
+ task_id: req.body?.task_id,
77
+ workflow_id: req.body?.workflow_id,
78
+ task_queue: req.body?.task_queue,
79
+ workflow_type: req.body?.workflow_type,
58
80
  }, req.auth);
59
81
  res.status(result.status).json(result.data ?? { error: result.error });
60
82
  });
@@ -76,6 +98,15 @@ function registerListRoutes(router) {
76
98
  offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
77
99
  sort_by: req.query.sort_by,
78
100
  order: req.query.order,
101
+ search: req.query.search,
102
+ // Faceted query elements (JSON-encoded on the URL).
103
+ roles: jsonParam(req.query.roles),
104
+ facets: jsonParam(req.query.facets),
105
+ block: jsonParam(req.query.block),
106
+ range: jsonParam(req.query.range),
107
+ exists: jsonParam(req.query.exists),
108
+ orderBy: jsonParam(req.query.orderBy),
109
+ available: req.query.available != null ? req.query.available === 'true' : undefined,
79
110
  }, req.auth);
80
111
  res.status(result.status).json(result.data ?? { error: result.error });
81
112
  });
@@ -94,6 +125,14 @@ function registerListRoutes(router) {
94
125
  offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
95
126
  sort_by: req.query.sort_by,
96
127
  order: req.query.order,
128
+ search: req.query.search,
129
+ // Faceted query elements (JSON-encoded on the URL).
130
+ roles: jsonParam(req.query.roles),
131
+ facets: jsonParam(req.query.facets),
132
+ block: jsonParam(req.query.block),
133
+ range: jsonParam(req.query.range),
134
+ exists: jsonParam(req.query.exists),
135
+ orderBy: jsonParam(req.query.orderBy),
97
136
  }, req.auth);
98
137
  res.status(result.status).json(result.data ?? { error: result.error });
99
138
  });
@@ -105,6 +144,15 @@ function registerListRoutes(router) {
105
144
  const result = await api.listDistinctTypes();
106
145
  res.status(result.status).json(result.data ?? { error: result.error });
107
146
  });
147
+ /**
148
+ * GET /api/escalations/facet-keys
149
+ * Distinct top-level metadata facet keys visible to the caller (role-scoped).
150
+ * Powers the faceted-query UI's key autocomplete.
151
+ */
152
+ router.get('/facet-keys', async (req, res) => {
153
+ const result = await api.listFacetKeys(undefined, req.auth);
154
+ res.status(result.status).json(result.data ?? { error: result.error });
155
+ });
108
156
  /**
109
157
  * GET /api/escalations/stats
110
158
  * Aggregated escalation statistics.
@@ -42,10 +42,28 @@ function registerResolveRoutes(router) {
42
42
  * waiting workflow in place. For webhook callers that know the deterministic
43
43
  * signal id. Literal single-segment path — registered before /:id/resolve so
44
44
  * it is never shadowed by the parameterized route.
45
- * Body: { signalKey: string, resolverPayload: Record<string, any> }
45
+ * Body: { signalKey: string, resolverPayload: Record<string, any>, metadata?: Record<string, any> }
46
46
  */
47
47
  router.post('/resolve-by-signal-key', async (req, res) => {
48
- const result = await api.resolveBySignalKey({ signalKey: req.body?.signalKey, resolverPayload: req.body?.resolverPayload }, req.auth);
48
+ const result = await api.resolveBySignalKey({
49
+ signalKey: req.body?.signalKey,
50
+ resolverPayload: req.body?.resolverPayload,
51
+ metadata: req.body?.metadata,
52
+ }, req.auth);
53
+ res.status(result.status).json(result.data ?? { error: result.error });
54
+ });
55
+ /**
56
+ * POST /api/escalations/resolve-by-ids
57
+ * Resolve a SET of escalations by id in one guarded statement (set-based sibling of
58
+ * /:id/resolve). RBAC: scoped callers may only resolve rows whose role they hold.
59
+ * Body: { ids: string[], resolverPayload: Record<string, any>, metadata?: Record<string, any> }
60
+ */
61
+ router.post('/resolve-by-ids', async (req, res) => {
62
+ const result = await api.resolveByIds({
63
+ ids: req.body?.ids,
64
+ resolverPayload: req.body?.resolverPayload,
65
+ metadata: req.body?.metadata,
66
+ }, req.auth);
49
67
  res.status(result.status).json(result.data ?? { error: result.error });
50
68
  });
51
69
  /**
@@ -53,10 +71,10 @@ function registerResolveRoutes(router) {
53
71
  * Resolve a pending escalation with a human-provided payload. Routes by
54
72
  * escalation shape: efficient (signal_key) resumes the job in place; legacy
55
73
  * paths signal via routing metadata or re-run the original workflow.
56
- * Body: { resolverPayload: Record<string, any> }
74
+ * Body: { resolverPayload: Record<string, any>, metadata?: Record<string, any> }
57
75
  */
58
76
  router.post('/:id/resolve', async (req, res) => {
59
- const result = await api.resolveEscalation({ id: req.params.id, resolverPayload: req.body?.resolverPayload }, req.auth);
77
+ const result = await api.resolveEscalation({ id: req.params.id, resolverPayload: req.body?.resolverPayload, metadata: req.body?.metadata }, req.auth);
60
78
  res.status(result.status).json(result.data ?? { error: result.error });
61
79
  });
62
80
  }
@@ -41,13 +41,14 @@ const router = (0, express_1.Router)();
41
41
  /**
42
42
  * GET /api/users
43
43
  * List users with optional filters.
44
- * Query: ?role=reviewer&roleType=admin&status=active&limit=50&offset=0
44
+ * Query: ?role=reviewer&roleType=admin&status=active&search=ada&limit=50&offset=0
45
45
  */
46
46
  router.get('/', async (req, res) => {
47
47
  const result = await api.listUsers({
48
48
  role: req.query.role,
49
49
  roleType: req.query.roleType,
50
50
  status: req.query.status,
51
+ search: req.query.search,
51
52
  limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
52
53
  offset: req.query.offset ? parseInt(req.query.offset, 10) : undefined,
53
54
  });
@@ -99,15 +100,18 @@ router.get('/:id/roles', async (req, res) => {
99
100
  /**
100
101
  * POST /api/users/:id/roles
101
102
  * Add a role to a user.
102
- * Body: { role, type } — type must be superadmin, admin, or member
103
+ * Body: { role, type, read_scope?, write_scope? } — type must be superadmin,
104
+ * admin, or member. read_scope (self|all) and write_scope (none|self|all) refine
105
+ * a member's work surface; they default to all/all and are ignored for admin/superadmin.
103
106
  *
104
- * Scoping rules:
107
+ * Scoping rules (management tier):
105
108
  * - superadmin: can assign any role/type
106
109
  * - engineer: can assign up to admin type, but never superadmin type
107
110
  * - role/admin (non-builder): can only assign member/admin for roles they hold
111
+ * A caller who may assign a role may set any work-surface scope on it.
108
112
  */
109
113
  router.post('/:id/roles', auth_1.requireAdmin, async (req, res) => {
110
- const { role, type } = req.body || {};
114
+ const { role, type, read_scope, write_scope } = req.body || {};
111
115
  const userId = req.auth.userId;
112
116
  // Superadmin bypasses all scoping
113
117
  const { isSuperAdmin } = await Promise.resolve().then(() => __importStar(require('../services/user/rbac')));
@@ -129,7 +133,7 @@ router.post('/:id/roles', auth_1.requireAdmin, async (req, res) => {
129
133
  }
130
134
  }
131
135
  }
132
- const result = await api.addUserRole({ id: req.params.id, role, type });
136
+ const result = await api.addUserRole({ id: req.params.id, role, type, read_scope, write_scope });
133
137
  res.status(result.status).json(result.data ?? { error: result.error });
134
138
  });
135
139
  /**
@@ -66,19 +66,27 @@ router.post('/:type/invoke', async (req, res) => {
66
66
  // ── Workflow observation ────────────────────────────────────────────────────
67
67
  /**
68
68
  * GET /api/workflows/:workflowId/status
69
- * Get the status of a workflow. Only the workflowId is needed.
69
+ * Get the status of a workflow. Optional `app_id` query param selects the
70
+ * HotMesh namespace for resolution (default: durable).
70
71
  */
71
72
  router.get('/:workflowId/status', async (req, res) => {
72
- const result = await api.getWorkflowStatus({ workflowId: req.params.workflowId });
73
+ const result = await api.getWorkflowStatus({
74
+ workflowId: req.params.workflowId,
75
+ appId: typeof req.query.app_id === 'string' ? req.query.app_id : undefined,
76
+ });
73
77
  res.status(result.status).json(result.data ?? { error: result.error });
74
78
  });
75
79
  /**
76
80
  * GET /api/workflows/:workflowId/result
77
81
  * Return the workflow result if complete, or 202 if still running.
78
- * Never blocks — always returns immediately.
82
+ * Never blocks — always returns immediately. Optional `app_id` query param
83
+ * selects the HotMesh namespace for resolution (default: durable).
79
84
  */
80
85
  router.get('/:workflowId/result', async (req, res) => {
81
- const result = await api.getWorkflowResult({ workflowId: req.params.workflowId });
86
+ const result = await api.getWorkflowResult({
87
+ workflowId: req.params.workflowId,
88
+ appId: typeof req.query.app_id === 'string' ? req.query.app_id : undefined,
89
+ });
82
90
  res.status(result.status).json(result.data ?? { error: result.error });
83
91
  });
84
92
  /**
@@ -82,6 +82,12 @@ export declare function createClient(options?: LTClientOptions): {
82
82
  envelope?: string;
83
83
  metadata?: Record<string, any>;
84
84
  escalation_payload?: string;
85
+ origin_id?: string;
86
+ parent_id?: string;
87
+ task_id?: string;
88
+ workflow_id?: string;
89
+ task_queue?: string;
90
+ workflow_type?: string;
85
91
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
86
92
  list: (input: {
87
93
  status?: string;
@@ -95,7 +101,8 @@ export declare function createClient(options?: LTClientOptions): {
95
101
  offset?: number;
96
102
  sort_by?: string;
97
103
  order?: string;
98
- }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
104
+ search?: string;
105
+ } & import("../api/escalations/list").FacetInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
99
106
  listAvailable: (input: {
100
107
  role?: string;
101
108
  type?: string;
@@ -105,8 +112,10 @@ export declare function createClient(options?: LTClientOptions): {
105
112
  offset?: number;
106
113
  sort_by?: string;
107
114
  order?: string;
108
- }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
115
+ search?: string;
116
+ } & import("../api/escalations/list").FacetInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
109
117
  listTypes: typeof escalationsApi.listDistinctTypes;
118
+ listFacetKeys: (input: unknown, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
110
119
  getStats: (input: {
111
120
  period?: string;
112
121
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
@@ -129,6 +138,17 @@ export declare function createClient(options?: LTClientOptions): {
129
138
  resolve: (input: {
130
139
  id: string;
131
140
  resolverPayload: Record<string, any>;
141
+ metadata?: Record<string, any>;
142
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
143
+ resolveBySignalKey: (input: {
144
+ signalKey: string;
145
+ resolverPayload: Record<string, any>;
146
+ metadata?: Record<string, any>;
147
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
148
+ resolveByIds: (input: {
149
+ ids: string[];
150
+ resolverPayload: Record<string, any>;
151
+ metadata?: Record<string, any>;
132
152
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
133
153
  releaseExpired: typeof escalationsApi.releaseExpiredClaims;
134
154
  updatePriority: (input: {
@@ -174,6 +194,19 @@ export declare function createClient(options?: LTClientOptions): {
174
194
  assignee?: string;
175
195
  metadata?: Record<string, any>;
176
196
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
197
+ searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
198
+ claimGroups: (input: {
199
+ query: import("..").FacetQuery;
200
+ limit?: number;
201
+ durationMinutes?: number;
202
+ sizeFacet?: string;
203
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
204
+ claimByFacets: (input: {
205
+ query: import("..").FacetQuery;
206
+ limit?: number;
207
+ durationMinutes?: number;
208
+ allOrNone?: boolean;
209
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
177
210
  };
178
211
  workflows: {
179
212
  invoke: (input: {
@@ -117,6 +117,7 @@ function createClient(options = {}) {
117
117
  list: bindAuth(escalationsApi.listEscalations, auth),
118
118
  listAvailable: bindAuth(escalationsApi.listAvailableEscalations, auth),
119
119
  listTypes: escalationsApi.listDistinctTypes,
120
+ listFacetKeys: bindAuth(escalationsApi.listFacetKeys, auth),
120
121
  getStats: bindAuth(escalationsApi.getEscalationStats, auth),
121
122
  get: bindAuth(escalationsApi.getEscalation, auth),
122
123
  getByWorkflowId: escalationsApi.getEscalationsByWorkflowId,
@@ -124,6 +125,8 @@ function createClient(options = {}) {
124
125
  claim: bindAuth(escalationsApi.claimEscalation, auth),
125
126
  release: bindAuth(escalationsApi.releaseEscalation, auth),
126
127
  resolve: bindAuth(escalationsApi.resolveEscalation, auth),
128
+ resolveBySignalKey: bindAuth(escalationsApi.resolveBySignalKey, auth),
129
+ resolveByIds: bindAuth(escalationsApi.resolveByIds, auth),
127
130
  releaseExpired: escalationsApi.releaseExpiredClaims,
128
131
  updatePriority: bindAuth(escalationsApi.updatePriority, auth),
129
132
  bulkClaim: bindAuth(escalationsApi.bulkClaim, auth),
@@ -133,6 +136,10 @@ function createClient(options = {}) {
133
136
  findByMetadata: bindAuth(escalationsApi.findByMetadata, auth),
134
137
  claimByMetadata: bindAuth(escalationsApi.claimByMetadata, auth),
135
138
  resolveByMetadata: bindAuth(escalationsApi.resolveByMetadata, auth),
139
+ // Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
140
+ searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
141
+ claimGroups: bindAuth(escalationsApi.claimGroups, auth),
142
+ claimByFacets: bindAuth(escalationsApi.claimByFacets, auth),
136
143
  },
137
144
  // ── Workflows ──────────────────────────────────────────────────────────
138
145
  workflows: {
@@ -17,6 +17,21 @@ export interface StreamSummary {
17
17
  pending: number;
18
18
  in_flight: number;
19
19
  }
20
+ /** A large string field replaced with a bounded summary instead of the full payload. */
21
+ export interface TruncatedString {
22
+ bytes: number;
23
+ preview: string;
24
+ truncated: true;
25
+ }
26
+ /** Pointer to the stream browser for the raw, untruncated message payloads. */
27
+ export interface RawMessagesHint {
28
+ hint: string;
29
+ jid: string;
30
+ }
31
+ /** A stream message whose large `message` payload may have been summarized. */
32
+ export type SummarizedStreamMessage = Omit<StreamMessage, 'message'> & {
33
+ message: string | TruncatedString;
34
+ };
20
35
  export interface JobDiagnosis {
21
36
  workflow_id: string;
22
37
  app_id: string;
@@ -32,18 +47,37 @@ export interface JobDiagnosis {
32
47
  stream_summary: StreamSummary;
33
48
  escalation: EscalationSummary;
34
49
  findings: Finding[];
35
- execution_events: unknown[];
36
50
  /** Total events before any cap was applied (execution_events may be truncated to the most recent `maxEvents`). */
37
51
  total_events: number;
38
52
  events_truncated: boolean;
39
- stream_messages: {
40
- worker: StreamMessage[];
41
- engine: StreamMessage[];
53
+ /**
54
+ * Full event timeline — present only when `include` contains `'events'` (or
55
+ * `verbosity: 'full'`). Large string attributes are summarized to
56
+ * `{ bytes, preview, truncated }`. Omitted by default to keep the verdict compact.
57
+ */
58
+ execution_events?: unknown[];
59
+ /**
60
+ * Raw engine + worker stream messages — present only when `include` contains
61
+ * `'streams'` (or `verbosity: 'full'`). Large `message` payloads are summarized.
62
+ * Omitted by default; see `raw_messages` for where to fetch the full payloads.
63
+ */
64
+ stream_messages?: {
65
+ worker: SummarizedStreamMessage[];
66
+ engine: SummarizedStreamMessage[];
42
67
  };
68
+ /** Pointer to `list_stream_messages` for the raw payloads (present when streams are omitted). */
69
+ raw_messages?: RawMessagesHint;
43
70
  }
44
- export declare function diagnoseJob(workflowId: string, appId?: string, options?: {
71
+ export type DiagnoseVerbosity = 'summary' | 'full';
72
+ export type DiagnoseSection = 'events' | 'streams';
73
+ export interface DiagnoseOptions {
45
74
  maxEvents?: number;
46
- }): Promise<JobDiagnosis>;
75
+ /** Heavy sections to include in the response. Default: none (verdict only). */
76
+ include?: DiagnoseSection[];
77
+ /** Shorthand: `'full'` includes both events and streams; `'summary'` (default) includes neither. */
78
+ verbosity?: DiagnoseVerbosity;
79
+ }
80
+ export declare function diagnoseJob(workflowId: string, appId?: string, options?: DiagnoseOptions): Promise<JobDiagnosis>;
47
81
  export declare function findStalledJobs(params: {
48
82
  appId?: string;
49
83
  idleMinutes?: number;
@@ -88,10 +88,39 @@ const ORPHANED_SIGNALS = (appId) => `
88
88
  `;
89
89
  /** Default cap on events returned in the payload — keeps a high-activity workflow from returning a huge response. */
90
90
  const DEFAULT_MAX_EVENTS = 500;
91
+ /** Strings larger than this (UTF-8 bytes) are summarized rather than returned in full. */
92
+ const LARGE_STRING_BYTES = 1024;
93
+ /** How many leading characters of a summarized string to keep as a preview. */
94
+ const PREVIEW_CHARS = 200;
95
+ /** Recursion depth cap for summarizing nested event attributes. */
96
+ const SUMMARIZE_MAX_DEPTH = 6;
97
+ /** Replace an over-threshold string with a bounded summary; pass small strings through unchanged. */
98
+ function summarizeString(value) {
99
+ const bytes = Buffer.byteLength(value, 'utf8');
100
+ if (bytes <= LARGE_STRING_BYTES)
101
+ return value;
102
+ return { bytes, preview: value.slice(0, PREVIEW_CHARS), truncated: true };
103
+ }
104
+ /** Recursively summarize large string leaves in an event attribute tree (result/output/input/error payloads). */
105
+ function summarizeDeep(value, depth = 0) {
106
+ if (typeof value === 'string')
107
+ return summarizeString(value);
108
+ if (value === null || typeof value !== 'object' || depth >= SUMMARIZE_MAX_DEPTH)
109
+ return value;
110
+ if (Array.isArray(value))
111
+ return value.map((v) => summarizeDeep(v, depth + 1));
112
+ const out = {};
113
+ for (const [k, v] of Object.entries(value)) {
114
+ out[k] = summarizeDeep(v, depth + 1);
115
+ }
116
+ return out;
117
+ }
91
118
  // ── diagnoseJob ──────────────────────────────────────────────────────────────
92
119
  async function diagnoseJob(workflowId, appId = 'durable', options = {}) {
93
120
  const pool = (0, db_1.getPool)();
94
121
  const maxEvents = Math.max(options.maxEvents ?? DEFAULT_MAX_EVENTS, 1);
122
+ const includeEvents = options.verbosity === 'full' || !!options.include?.includes('events');
123
+ const includeStreams = options.verbosity === 'full' || !!options.include?.includes('streams');
95
124
  let resolved;
96
125
  try {
97
126
  resolved = await (0, resolve_1.resolveWorkflowHandle)(workflowId);
@@ -135,7 +164,7 @@ async function diagnoseJob(workflowId, appId = 'durable', options = {}) {
135
164
  const findings = execution
136
165
  ? (0, patterns_1.matchPatterns)(execution, workerMessages, engineMessages, escalationRow)
137
166
  : [{ condition: 'export_unavailable', confidence: 0.9, severity: 'warning', evidence: ['Execution export unavailable — job may have expired or HotMesh engine is not running'], guidance: [] }];
138
- return {
167
+ const diagnosis = {
139
168
  workflow_id: workflowId,
140
169
  app_id: appId,
141
170
  status,
@@ -153,11 +182,33 @@ async function diagnoseJob(workflowId, appId = 'durable', options = {}) {
153
182
  created_at: escalationRow?.created_at ?? null,
154
183
  },
155
184
  findings,
156
- execution_events: cappedEvents,
157
185
  total_events: events.length,
158
186
  events_truncated: eventsTruncated,
159
- stream_messages: { worker: workerMessages, engine: engineMessages },
160
187
  };
188
+ // Heavy sections are opt-in. Large string payloads are summarized either way
189
+ // so an included section can't reintroduce the 100–200KB blow-up.
190
+ if (includeEvents) {
191
+ diagnosis.execution_events = cappedEvents.map((e) => e && typeof e === 'object'
192
+ ? { ...e, attributes: summarizeDeep(e.attributes) }
193
+ : e);
194
+ }
195
+ if (includeStreams) {
196
+ diagnosis.stream_messages = {
197
+ worker: summarizeMessages(workerMessages),
198
+ engine: summarizeMessages(engineMessages),
199
+ };
200
+ }
201
+ else {
202
+ diagnosis.raw_messages = {
203
+ hint: 'Use list_stream_messages (Control Plane) filtered by jid (and aid/dad) for the full raw message payloads.',
204
+ jid: workflowId,
205
+ };
206
+ }
207
+ return diagnosis;
208
+ }
209
+ /** Summarize the large `message` payload of each stream message; everything else passes through. */
210
+ function summarizeMessages(messages) {
211
+ return messages.map((m) => ({ ...m, message: summarizeString(m.message) }));
161
212
  }
162
213
  // ── findStalledJobs ──────────────────────────────────────────────────────────
163
214
  async function findStalledJobs(params) {
@@ -200,9 +251,7 @@ function notFound(workflowId, appId) {
200
251
  stream_summary: { worker_total: 0, engine_total: 0, dead_lettered: 0, pending: 0, in_flight: 0 },
201
252
  escalation: { exists: false, id: null, status: null, signal_key: null, role: null, type: null, created_at: null },
202
253
  findings: [{ condition: 'not_found', confidence: 1, severity: 'critical', evidence: ['Workflow ID not found — no task record or job entity'], guidance: [] }],
203
- execution_events: [],
204
254
  total_events: 0,
205
255
  events_truncated: false,
206
- stream_messages: { worker: [], engine: [] },
207
256
  };
208
257
  }