@hotmeshio/long-tail 0.17.2 → 0.18.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 (209) hide show
  1. package/build/api/escalations/index.d.ts +1 -0
  2. package/build/api/escalations/index.js +5 -1
  3. package/build/api/escalations/resolve-batch.d.ts +58 -0
  4. package/build/api/escalations/resolve-batch.js +247 -0
  5. package/build/api/escalations/resolve.d.ts +11 -0
  6. package/build/api/escalations/resolve.js +2 -0
  7. package/build/lib/events/publish.d.ts +1 -1
  8. package/build/routes/escalations/metadata.js +19 -0
  9. package/build/routes/escalations/resolve.js +41 -0
  10. package/build/sdk/index.d.ts +21 -0
  11. package/build/sdk/index.js +3 -0
  12. package/build/services/escalation/batch.d.ts +38 -0
  13. package/build/services/escalation/batch.js +85 -0
  14. package/build/services/escalation/crud.d.ts +7 -0
  15. package/build/services/escalation/crud.js +1 -0
  16. package/build/services/escalation/index.d.ts +1 -0
  17. package/build/services/escalation/index.js +1 -0
  18. package/build/services/orchestrator/condition.d.ts +28 -0
  19. package/build/services/orchestrator/condition.js +28 -0
  20. package/build/system/mcp-servers/human-queue-schemas.d.ts +13 -0
  21. package/build/system/mcp-servers/human-queue-schemas.js +6 -1
  22. package/build/system/mcp-servers/human-queue.d.ts +3 -1
  23. package/build/system/mcp-servers/human-queue.js +38 -2
  24. package/build/tsconfig.tsbuildinfo +1 -1
  25. package/build/types/escalation.d.ts +24 -0
  26. package/build/types/escalation.js +18 -1
  27. package/build/types/events.d.ts +1 -1
  28. package/build/types/index.d.ts +2 -2
  29. package/build/types/index.js +2 -1
  30. package/dashboard/dist/assets/{AdminDashboard-B_AVB7tk.js → AdminDashboard-mULAQuHV.js} +2 -2
  31. package/dashboard/dist/assets/{AdminDashboard-B_AVB7tk.js.map → AdminDashboard-mULAQuHV.js.map} +1 -1
  32. package/dashboard/dist/assets/{AgentConfigPage-JoZko3JB.js → AgentConfigPage-DHdzgXcr.js} +2 -2
  33. package/dashboard/dist/assets/{AgentConfigPage-JoZko3JB.js.map → AgentConfigPage-DHdzgXcr.js.map} +1 -1
  34. package/dashboard/dist/assets/{AgentDetailPage-DfpR2Fgg.js → AgentDetailPage-Du_33U2u.js} +2 -2
  35. package/dashboard/dist/assets/{AgentDetailPage-DfpR2Fgg.js.map → AgentDetailPage-Du_33U2u.js.map} +1 -1
  36. package/dashboard/dist/assets/{AgentsPage-F2ixDk1Q.js → AgentsPage-4KkQO2Hl.js} +2 -2
  37. package/dashboard/dist/assets/{AgentsPage-F2ixDk1Q.js.map → AgentsPage-4KkQO2Hl.js.map} +1 -1
  38. package/dashboard/dist/assets/{AvailableEscalationsPage-D-W4OP55.js → AvailableEscalationsPage-CjcAIm-d.js} +2 -2
  39. package/dashboard/dist/assets/{AvailableEscalationsPage-D-W4OP55.js.map → AvailableEscalationsPage-CjcAIm-d.js.map} +1 -1
  40. package/dashboard/dist/assets/{BotPicker-B8Yal8Mm.js → BotPicker-BaFiLa-H.js} +2 -2
  41. package/dashboard/dist/assets/{BotPicker-B8Yal8Mm.js.map → BotPicker-BaFiLa-H.js.map} +1 -1
  42. package/dashboard/dist/assets/{BulkAssignModal-ySfoaF7f.js → BulkAssignModal-DNmji4l-.js} +2 -2
  43. package/dashboard/dist/assets/{BulkAssignModal-ySfoaF7f.js.map → BulkAssignModal-DNmji4l-.js.map} +1 -1
  44. package/dashboard/dist/assets/{CapabilitiesPage-BSJ2oFj6.js → CapabilitiesPage-Cewd6Uku.js} +2 -2
  45. package/dashboard/dist/assets/{CapabilitiesPage-BSJ2oFj6.js.map → CapabilitiesPage-Cewd6Uku.js.map} +1 -1
  46. package/dashboard/dist/assets/{CollapsibleSection-CcV88IUy.js → CollapsibleSection-D1WIbyDa.js} +2 -2
  47. package/dashboard/dist/assets/{CollapsibleSection-CcV88IUy.js.map → CollapsibleSection-D1WIbyDa.js.map} +1 -1
  48. package/dashboard/dist/assets/{CountdownTimer-C-E9MXMk.js → CountdownTimer-BKMmFie6.js} +2 -2
  49. package/dashboard/dist/assets/{CountdownTimer-C-E9MXMk.js.map → CountdownTimer-BKMmFie6.js.map} +1 -1
  50. package/dashboard/dist/assets/{CredentialsPage-DrydlZ65.js → CredentialsPage-CwtkQUG3.js} +2 -2
  51. package/dashboard/dist/assets/{CredentialsPage-DrydlZ65.js.map → CredentialsPage-CwtkQUG3.js.map} +1 -1
  52. package/dashboard/dist/assets/{CronLabel-BxQmJXos.js → CronLabel-CRC_uNuC.js} +2 -2
  53. package/dashboard/dist/assets/{CronLabel-BxQmJXos.js.map → CronLabel-CRC_uNuC.js.map} +1 -1
  54. package/dashboard/dist/assets/{ElapsedCell-lszUXiyP.js → ElapsedCell-CxAi0zN0.js} +2 -2
  55. package/dashboard/dist/assets/{ElapsedCell-lszUXiyP.js.map → ElapsedCell-CxAi0zN0.js.map} +1 -1
  56. package/dashboard/dist/assets/{EntityTimelinePanel-CwzIV87U.js → EntityTimelinePanel-DzMuV7ZX.js} +2 -2
  57. package/dashboard/dist/assets/{EntityTimelinePanel-CwzIV87U.js.map → EntityTimelinePanel-DzMuV7ZX.js.map} +1 -1
  58. package/dashboard/dist/assets/{EscalationListSchemaPage-D16uUVcG.js → EscalationListSchemaPage--yZfsE8s.js} +2 -2
  59. package/dashboard/dist/assets/{EscalationListSchemaPage-D16uUVcG.js.map → EscalationListSchemaPage--yZfsE8s.js.map} +1 -1
  60. package/dashboard/dist/assets/{EscalationSchemaPage-BLM3dUEw.js → EscalationSchemaPage-CmoVqaS7.js} +2 -2
  61. package/dashboard/dist/assets/{EscalationSchemaPage-BLM3dUEw.js.map → EscalationSchemaPage-CmoVqaS7.js.map} +1 -1
  62. package/dashboard/dist/assets/{EscalationsOverview-BlFjoKlR.js → EscalationsOverview-DDQTW6Jo.js} +2 -2
  63. package/dashboard/dist/assets/{EscalationsOverview-BlFjoKlR.js.map → EscalationsOverview-DDQTW6Jo.js.map} +1 -1
  64. package/dashboard/dist/assets/{EventTable-rTkMR8Zf.js → EventTable-C5jN7XT7.js} +2 -2
  65. package/dashboard/dist/assets/{EventTable-rTkMR8Zf.js.map → EventTable-C5jN7XT7.js.map} +1 -1
  66. package/dashboard/dist/assets/{FilterBar-BeVBUdfJ.js → FilterBar-CcIgQH9h.js} +2 -2
  67. package/dashboard/dist/assets/{FilterBar-BeVBUdfJ.js.map → FilterBar-CcIgQH9h.js.map} +1 -1
  68. package/dashboard/dist/assets/{GraphInvokePage-BV60xkVy.js → GraphInvokePage-LACIxaiH.js} +2 -2
  69. package/dashboard/dist/assets/{GraphInvokePage-BV60xkVy.js.map → GraphInvokePage-LACIxaiH.js.map} +1 -1
  70. package/dashboard/dist/assets/{HomePage-BA0RYzFc.js → HomePage-DP9Q-x4a.js} +2 -2
  71. package/dashboard/dist/assets/{HomePage-BA0RYzFc.js.map → HomePage-DP9Q-x4a.js.map} +1 -1
  72. package/dashboard/dist/assets/{ListToolbar-4IfsUXfV.js → ListToolbar-CLwSkmUH.js} +2 -2
  73. package/dashboard/dist/assets/{ListToolbar-4IfsUXfV.js.map → ListToolbar-CLwSkmUH.js.map} +1 -1
  74. package/dashboard/dist/assets/{McpOverview-gDegMXvF.js → McpOverview-C2U1XfQw.js} +2 -2
  75. package/dashboard/dist/assets/{McpOverview-gDegMXvF.js.map → McpOverview-C2U1XfQw.js.map} +1 -1
  76. package/dashboard/dist/assets/{McpQueryDetailPage-CnCffPks.js → McpQueryDetailPage-DYOK8A4D.js} +2 -2
  77. package/dashboard/dist/assets/{McpQueryDetailPage-CnCffPks.js.map → McpQueryDetailPage-DYOK8A4D.js.map} +1 -1
  78. package/dashboard/dist/assets/{McpQueryPage-CLEMtLOG.js → McpQueryPage-Ck75ikSd.js} +2 -2
  79. package/dashboard/dist/assets/{McpQueryPage-CLEMtLOG.js.map → McpQueryPage-Ck75ikSd.js.map} +1 -1
  80. package/dashboard/dist/assets/{McpRunDetailPage-tr-lrWVv.js → McpRunDetailPage-CA9gWQ4L.js} +2 -2
  81. package/dashboard/dist/assets/{McpRunDetailPage-tr-lrWVv.js.map → McpRunDetailPage-CA9gWQ4L.js.map} +1 -1
  82. package/dashboard/dist/assets/{McpRunsPage-nE0d_1Px.js → McpRunsPage-BhPshset.js} +2 -2
  83. package/dashboard/dist/assets/{McpRunsPage-nE0d_1Px.js.map → McpRunsPage-BhPshset.js.map} +1 -1
  84. package/dashboard/dist/assets/{OperationsPage-C8h1DN5Q.js → OperationsPage-MlMzl0Bf.js} +2 -2
  85. package/dashboard/dist/assets/{OperationsPage-C8h1DN5Q.js.map → OperationsPage-MlMzl0Bf.js.map} +1 -1
  86. package/dashboard/dist/assets/{OperatorDashboard-DCG8BFKE.js → OperatorDashboard-DZOfHRE7.js} +2 -2
  87. package/dashboard/dist/assets/{OperatorDashboard-DCG8BFKE.js.map → OperatorDashboard-DZOfHRE7.js.map} +1 -1
  88. package/dashboard/dist/assets/{PersonaDetailPage-BEVeJr1q.js → PersonaDetailPage-eyHDupL0.js} +2 -2
  89. package/dashboard/dist/assets/{PersonaDetailPage-BEVeJr1q.js.map → PersonaDetailPage-eyHDupL0.js.map} +1 -1
  90. package/dashboard/dist/assets/{PersonasPage-B5fj2AK6.js → PersonasPage-CCtRkWiP.js} +2 -2
  91. package/dashboard/dist/assets/{PersonasPage-B5fj2AK6.js.map → PersonasPage-CCtRkWiP.js.map} +1 -1
  92. package/dashboard/dist/assets/{ProcessDetailPage-CWGby6KD.js → ProcessDetailPage-CKiAlpOc.js} +2 -2
  93. package/dashboard/dist/assets/{ProcessDetailPage-CWGby6KD.js.map → ProcessDetailPage-CKiAlpOc.js.map} +1 -1
  94. package/dashboard/dist/assets/{ProcessesListPage-nFdLMlfb.js → ProcessesListPage-C4ueZJxU.js} +2 -2
  95. package/dashboard/dist/assets/{ProcessesListPage-nFdLMlfb.js.map → ProcessesListPage-C4ueZJxU.js.map} +1 -1
  96. package/dashboard/dist/assets/{RoleDetailPage-OmOdRm1F.js → RoleDetailPage-BOccQCkx.js} +2 -2
  97. package/dashboard/dist/assets/{RoleDetailPage-OmOdRm1F.js.map → RoleDetailPage-BOccQCkx.js.map} +1 -1
  98. package/dashboard/dist/assets/{RolesPage-DwprdPCA.js → RolesPage-B3-9Ek0F.js} +2 -2
  99. package/dashboard/dist/assets/{RolesPage-DwprdPCA.js.map → RolesPage-B3-9Ek0F.js.map} +1 -1
  100. package/dashboard/dist/assets/{RunAsSelector-DGw9EKSR.js → RunAsSelector-1k1J1_cv.js} +2 -2
  101. package/dashboard/dist/assets/{RunAsSelector-DGw9EKSR.js.map → RunAsSelector-1k1J1_cv.js.map} +1 -1
  102. package/dashboard/dist/assets/{ScanCodesPage-RPi4qZ_l.js → ScanCodesPage-CeuVKnpu.js} +2 -2
  103. package/dashboard/dist/assets/{ScanCodesPage-RPi4qZ_l.js.map → ScanCodesPage-CeuVKnpu.js.map} +1 -1
  104. package/dashboard/dist/assets/{ScanSchemeDetailPage-BKc4lUjc.js → ScanSchemeDetailPage-BnivPUJY.js} +2 -2
  105. package/dashboard/dist/assets/{ScanSchemeDetailPage-BKc4lUjc.js.map → ScanSchemeDetailPage-BnivPUJY.js.map} +1 -1
  106. package/dashboard/dist/assets/{ScanStationPage-DUfxcntB.js → ScanStationPage-DCSA7pcV.js} +2 -2
  107. package/dashboard/dist/assets/{ScanStationPage-DUfxcntB.js.map → ScanStationPage-DCSA7pcV.js.map} +1 -1
  108. package/dashboard/dist/assets/{StickyPagination-DXOk5z5X.js → StickyPagination-BWuKz8uB.js} +2 -2
  109. package/dashboard/dist/assets/{StickyPagination-DXOk5z5X.js.map → StickyPagination-BWuKz8uB.js.map} +1 -1
  110. package/dashboard/dist/assets/{StreamMessageDetail-BB1h2zZN.js → StreamMessageDetail-Cq6AGhgJ.js} +2 -2
  111. package/dashboard/dist/assets/{StreamMessageDetail-BB1h2zZN.js.map → StreamMessageDetail-Cq6AGhgJ.js.map} +1 -1
  112. package/dashboard/dist/assets/{SwimlaneTimeline-CapKokLg.js → SwimlaneTimeline-DM88avgt.js} +2 -2
  113. package/dashboard/dist/assets/{SwimlaneTimeline-CapKokLg.js.map → SwimlaneTimeline-DM88avgt.js.map} +1 -1
  114. package/dashboard/dist/assets/{TaskDetailPage-Dfzdp97x.js → TaskDetailPage-Caqe3fG8.js} +2 -2
  115. package/dashboard/dist/assets/{TaskDetailPage-Dfzdp97x.js.map → TaskDetailPage-Caqe3fG8.js.map} +1 -1
  116. package/dashboard/dist/assets/{TasksListPage-DxlS7PTD.js → TasksListPage-DlQwpXOL.js} +2 -2
  117. package/dashboard/dist/assets/{TasksListPage-DxlS7PTD.js.map → TasksListPage-DlQwpXOL.js.map} +1 -1
  118. package/dashboard/dist/assets/{TimeAgo-Bv5viQ1m.js → TimeAgo-BinTjiVC.js} +2 -2
  119. package/dashboard/dist/assets/{TimeAgo-Bv5viQ1m.js.map → TimeAgo-BinTjiVC.js.map} +1 -1
  120. package/dashboard/dist/assets/{TimestampCell-DXNBf_eb.js → TimestampCell-DDcfSVeQ.js} +2 -2
  121. package/dashboard/dist/assets/{TimestampCell-DXNBf_eb.js.map → TimestampCell-DDcfSVeQ.js.map} +1 -1
  122. package/dashboard/dist/assets/{ToolTestPanel-f32mir7Q.js → ToolTestPanel-CZvegH_w.js} +2 -2
  123. package/dashboard/dist/assets/{ToolTestPanel-f32mir7Q.js.map → ToolTestPanel-CZvegH_w.js.map} +1 -1
  124. package/dashboard/dist/assets/{TopicDetailPage-D-N8Vsd4.js → TopicDetailPage-CShiCwz8.js} +2 -2
  125. package/dashboard/dist/assets/{TopicDetailPage-D-N8Vsd4.js.map → TopicDetailPage-CShiCwz8.js.map} +1 -1
  126. package/dashboard/dist/assets/{TopicsPage-hqlu32wg.js → TopicsPage-CAYxRRbI.js} +2 -2
  127. package/dashboard/dist/assets/{TopicsPage-hqlu32wg.js.map → TopicsPage-CAYxRRbI.js.map} +1 -1
  128. package/dashboard/dist/assets/{UserName-BhA_ItNN.js → UserName-BovQxdSY.js} +2 -2
  129. package/dashboard/dist/assets/{UserName-BhA_ItNN.js.map → UserName-BovQxdSY.js.map} +1 -1
  130. package/dashboard/dist/assets/{WorkflowExecutionPage-BAgMKnhe.js → WorkflowExecutionPage-DNdXEFcB.js} +2 -2
  131. package/dashboard/dist/assets/{WorkflowExecutionPage-BAgMKnhe.js.map → WorkflowExecutionPage-DNdXEFcB.js.map} +1 -1
  132. package/dashboard/dist/assets/{WorkflowsDashboard-B2wYT_hj.js → WorkflowsDashboard-D7DPDeuQ.js} +2 -2
  133. package/dashboard/dist/assets/{WorkflowsDashboard-B2wYT_hj.js.map → WorkflowsDashboard-D7DPDeuQ.js.map} +1 -1
  134. package/dashboard/dist/assets/{WorkflowsOverview--jC5F9lz.js → WorkflowsOverview-C7Z0SpDH.js} +2 -2
  135. package/dashboard/dist/assets/{WorkflowsOverview--jC5F9lz.js.map → WorkflowsOverview-C7Z0SpDH.js.map} +1 -1
  136. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BdB5eX8s.js → YamlWorkflowDetailPage-Bxklswko.js} +2 -2
  137. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BdB5eX8s.js.map → YamlWorkflowDetailPage-Bxklswko.js.map} +1 -1
  138. package/dashboard/dist/assets/{YamlWorkflowsPage-BUQQU9II.js → YamlWorkflowsPage-CkArsPbi.js} +2 -2
  139. package/dashboard/dist/assets/{YamlWorkflowsPage-BUQQU9II.js.map → YamlWorkflowsPage-CkArsPbi.js.map} +1 -1
  140. package/dashboard/dist/assets/{agents-BF_S1J_z.js → agents-Ca0hOp2Y.js} +2 -2
  141. package/dashboard/dist/assets/{agents-BF_S1J_z.js.map → agents-Ca0hOp2Y.js.map} +1 -1
  142. package/dashboard/dist/assets/{bots-CGlEoWAu.js → bots-9GtbGtH9.js} +2 -2
  143. package/dashboard/dist/assets/{bots-CGlEoWAu.js.map → bots-9GtbGtH9.js.map} +1 -1
  144. package/dashboard/dist/assets/{capabilities-Pq8pG0kX.js → capabilities-C0RpEvyY.js} +2 -2
  145. package/dashboard/dist/assets/{capabilities-Pq8pG0kX.js.map → capabilities-C0RpEvyY.js.map} +1 -1
  146. package/dashboard/dist/assets/{controlplane-dY6a4iYT.js → controlplane-ClQiKGyQ.js} +2 -2
  147. package/dashboard/dist/assets/{controlplane-dY6a4iYT.js.map → controlplane-ClQiKGyQ.js.map} +1 -1
  148. package/dashboard/dist/assets/{escalation-columns-CBUTda5U.js → escalation-columns-CZ12_oQF.js} +2 -2
  149. package/dashboard/dist/assets/{escalation-columns-CBUTda5U.js.map → escalation-columns-CZ12_oQF.js.map} +1 -1
  150. package/dashboard/dist/assets/{index-U7HShN30.js → index-B-Qpr29t.js} +2 -2
  151. package/dashboard/dist/assets/{index-U7HShN30.js.map → index-B-Qpr29t.js.map} +1 -1
  152. package/dashboard/dist/assets/{index-DrlZc3C0.js → index-BLCFN3YR.js} +2 -2
  153. package/dashboard/dist/assets/{index-DrlZc3C0.js.map → index-BLCFN3YR.js.map} +1 -1
  154. package/dashboard/dist/assets/{index-D1KCPoRr.js → index-BLLK2mzy.js} +2 -2
  155. package/dashboard/dist/assets/{index-D1KCPoRr.js.map → index-BLLK2mzy.js.map} +1 -1
  156. package/dashboard/dist/assets/{index-ByYeo8P7.js → index-Ba3UsZzz.js} +2 -2
  157. package/dashboard/dist/assets/{index-ByYeo8P7.js.map → index-Ba3UsZzz.js.map} +1 -1
  158. package/dashboard/dist/assets/{index-BHfISWyn.js → index-BoQirCxt.js} +2 -2
  159. package/dashboard/dist/assets/{index-BHfISWyn.js.map → index-BoQirCxt.js.map} +1 -1
  160. package/dashboard/dist/assets/{index-CivQGQpu.js → index-C1oOLjdF.js} +2 -2
  161. package/dashboard/dist/assets/{index-CivQGQpu.js.map → index-C1oOLjdF.js.map} +1 -1
  162. package/dashboard/dist/assets/{index-CwQn-nhR.js → index-CG8oLNHo.js} +2 -2
  163. package/dashboard/dist/assets/{index-CwQn-nhR.js.map → index-CG8oLNHo.js.map} +1 -1
  164. package/dashboard/dist/assets/{index-D9rtK9QF.js → index-CdavRyaX.js} +3 -3
  165. package/dashboard/dist/assets/{index-D9rtK9QF.js.map → index-CdavRyaX.js.map} +1 -1
  166. package/dashboard/dist/assets/{index-D0bjzVum.js → index-CeHOGQM4.js} +2 -2
  167. package/dashboard/dist/assets/{index-D0bjzVum.js.map → index-CeHOGQM4.js.map} +1 -1
  168. package/dashboard/dist/assets/{index-BTksPQZe.js → index-Ct_8Tpec.js} +2 -2
  169. package/dashboard/dist/assets/{index-BTksPQZe.js.map → index-Ct_8Tpec.js.map} +1 -1
  170. package/dashboard/dist/assets/{index-BWtW5puE.js → index-DEr9QjVv.js} +2 -2
  171. package/dashboard/dist/assets/{index-BWtW5puE.js.map → index-DEr9QjVv.js.map} +1 -1
  172. package/dashboard/dist/assets/{index-BrFGgfjR.js → index-DlzW75L4.js} +2 -2
  173. package/dashboard/dist/assets/{index-BrFGgfjR.js.map → index-DlzW75L4.js.map} +1 -1
  174. package/dashboard/dist/assets/{index-Bn-6MP9-.js → index-P1g8r09L.js} +2 -2
  175. package/dashboard/dist/assets/{index-Bn-6MP9-.js.map → index-P1g8r09L.js.map} +1 -1
  176. package/dashboard/dist/assets/{knowledge-8_TilyaY.js → knowledge-DzueDGkw.js} +2 -2
  177. package/dashboard/dist/assets/{knowledge-8_TilyaY.js.map → knowledge-DzueDGkw.js.map} +1 -1
  178. package/dashboard/dist/assets/{mcp-hY3O2HJa.js → mcp-CCOzN8dH.js} +2 -2
  179. package/dashboard/dist/assets/{mcp-hY3O2HJa.js.map → mcp-CCOzN8dH.js.map} +1 -1
  180. package/dashboard/dist/assets/{mcp-query-CA8NEf2e.js → mcp-query-UeMDiM6I.js} +2 -2
  181. package/dashboard/dist/assets/{mcp-query-CA8NEf2e.js.map → mcp-query-UeMDiM6I.js.map} +1 -1
  182. package/dashboard/dist/assets/metadata-display--TzK0REC.js +2 -0
  183. package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +1 -0
  184. package/dashboard/dist/assets/{personas-DrWgQ94s.js → personas-CKcrzaQX.js} +2 -2
  185. package/dashboard/dist/assets/{personas-DrWgQ94s.js.map → personas-CKcrzaQX.js.map} +1 -1
  186. package/dashboard/dist/assets/{pipelines-DdgSlafC.js → pipelines-orE-1gpj.js} +2 -2
  187. package/dashboard/dist/assets/{pipelines-DdgSlafC.js.map → pipelines-orE-1gpj.js.map} +1 -1
  188. package/dashboard/dist/assets/{tasks-UyjER1TA.js → tasks-ZOmzxynB.js} +2 -2
  189. package/dashboard/dist/assets/{tasks-UyjER1TA.js.map → tasks-ZOmzxynB.js.map} +1 -1
  190. package/dashboard/dist/assets/{topics-CIc5SpT_.js → topics-CdYaOCi_.js} +2 -2
  191. package/dashboard/dist/assets/{topics-CIc5SpT_.js.map → topics-CdYaOCi_.js.map} +1 -1
  192. package/dashboard/dist/assets/{useDebouncedValue-CmUqBRK4.js → useDebouncedValue-D-uGnSj5.js} +2 -2
  193. package/dashboard/dist/assets/{useDebouncedValue-CmUqBRK4.js.map → useDebouncedValue-D-uGnSj5.js.map} +1 -1
  194. package/dashboard/dist/assets/{useNamespace-BOZOwXTE.js → useNamespace-DMrjlrJJ.js} +2 -2
  195. package/dashboard/dist/assets/{useNamespace-BOZOwXTE.js.map → useNamespace-DMrjlrJJ.js.map} +1 -1
  196. package/dashboard/dist/assets/{useYamlActivityEvents-BsTpIsba.js → useYamlActivityEvents-ByyQgu8S.js} +2 -2
  197. package/dashboard/dist/assets/{useYamlActivityEvents-BsTpIsba.js.map → useYamlActivityEvents-ByyQgu8S.js.map} +1 -1
  198. package/dashboard/dist/assets/{workflows-BkFI3IwE.js → workflows-CLn05FRV.js} +2 -2
  199. package/dashboard/dist/assets/{workflows-BkFI3IwE.js.map → workflows-CLn05FRV.js.map} +1 -1
  200. package/dashboard/dist/assets/{yaml-workflows-CeeqNi9k.js → yaml-workflows-DFD_HO__.js} +2 -2
  201. package/dashboard/dist/assets/{yaml-workflows-CeeqNi9k.js.map → yaml-workflows-DFD_HO__.js.map} +1 -1
  202. package/dashboard/dist/index.html +1 -1
  203. package/docs/api/sdk/escalations.md +87 -0
  204. package/docs/hitl/escalation.md +29 -0
  205. package/docs/hitl/resolution.md +33 -0
  206. package/docs/sdk.md +1 -1
  207. package/package.json +2 -2
  208. package/dashboard/dist/assets/metadata-display-DHjqWkLG.js +0 -2
  209. package/dashboard/dist/assets/metadata-display-DHjqWkLG.js.map +0 -1
@@ -5,6 +5,7 @@ export { getEscalationLookups } from './lookups';
5
5
  export { claimEscalation, releaseEscalation } from './claim';
6
6
  export { releaseExpiredClaims, updatePriority, bulkClaim, bulkAssign, bulkUnassign, bulkEscalate, bulkTriage } from './bulk';
7
7
  export { resolveEscalation, resolveBySignalKey, resolveByIds, resolveAllOrNone } from './resolve';
8
+ export { resolveBatchItem, resolveBatchItemBySignalKey, resolveBatchItemByMetadata } from './resolve-batch';
8
9
  export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
9
10
  export { cancelSingleEscalation, bulkCancel } from './cancel';
10
11
  export { searchByFacets, claimGroups, claimByFacets } from './facets';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
3
+ exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
4
4
  var create_1 = require("./create");
5
5
  Object.defineProperty(exports, "createEscalation", { enumerable: true, get: function () { return create_1.createEscalation; } });
6
6
  var list_1 = require("./list");
@@ -32,6 +32,10 @@ Object.defineProperty(exports, "resolveEscalation", { enumerable: true, get: fun
32
32
  Object.defineProperty(exports, "resolveBySignalKey", { enumerable: true, get: function () { return resolve_1.resolveBySignalKey; } });
33
33
  Object.defineProperty(exports, "resolveByIds", { enumerable: true, get: function () { return resolve_1.resolveByIds; } });
34
34
  Object.defineProperty(exports, "resolveAllOrNone", { enumerable: true, get: function () { return resolve_1.resolveAllOrNone; } });
35
+ var resolve_batch_1 = require("./resolve-batch");
36
+ Object.defineProperty(exports, "resolveBatchItem", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItem; } });
37
+ Object.defineProperty(exports, "resolveBatchItemBySignalKey", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemBySignalKey; } });
38
+ Object.defineProperty(exports, "resolveBatchItemByMetadata", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemByMetadata; } });
35
39
  var metadata_1 = require("./metadata");
36
40
  Object.defineProperty(exports, "findByMetadata", { enumerable: true, get: function () { return metadata_1.findByMetadata; } });
37
41
  Object.defineProperty(exports, "claimByMetadata", { enumerable: true, get: function () { return metadata_1.claimByMetadata; } });
@@ -0,0 +1,58 @@
1
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
2
+ /**
3
+ * Submit ONE declared item of a batch escalation (a `conditional` wait created
4
+ * with `batch: [...]`). Interim submissions are cheap atomic fills — the row
5
+ * stays pending and `remaining` reports progress. The LAST item completes the
6
+ * escalation: the row resolves and the waiting workflow wakes with the full
7
+ * collection, in the same statement.
8
+ *
9
+ * Each item validates against the SAME versioned form schema a single-item
10
+ * resolver gets (metadata.form_schema → pinned lt_role_schemas → live role
11
+ * schema), including the submit guard.
12
+ *
13
+ * Claim semantics: claim-agnostic by default — a batch accumulates
14
+ * contributions from multiple principals, so the single-owner claim lock is
15
+ * not asserted (same rationale as resolve-by-signal-key). Pass
16
+ * `assertClaim: true` to require the caller's own live claim, asserted
17
+ * atomically inside the SDK's guarded statement.
18
+ */
19
+ export declare function resolveBatchItem(input: {
20
+ id: string;
21
+ itemKey: string;
22
+ resolverPayload: Record<string, any>;
23
+ metadata?: Record<string, any>;
24
+ assertClaim?: boolean;
25
+ }, auth: LTApiAuth): Promise<LTApiResult>;
26
+ /**
27
+ * Submit one batch item selecting the escalation by its `signal_key` — the
28
+ * deterministic home signal id the waiting workflow parked on. For callers
29
+ * that already own that identity (a child workflow calling home, a webhook),
30
+ * so no UUID lookup and no facet duplication. Mirrors resolve-by-signal-key:
31
+ * claim-agnostic, write-scope gated with 404 non-disclosure.
32
+ */
33
+ export declare function resolveBatchItemBySignalKey(input: {
34
+ signalKey: string;
35
+ itemKey: string;
36
+ resolverPayload: Record<string, any>;
37
+ metadata?: Record<string, any>;
38
+ }, auth: LTApiAuth): Promise<LTApiResult>;
39
+ /**
40
+ * Submit one batch item selecting the escalation by metadata facet — the
41
+ * faceted sibling of {@link resolveBatchItem}, mirroring resolve-by-metadata.
42
+ * RBAC folds into the SDK's atomic facet selection as a flat role filter
43
+ * (write_all roles; self-scope members act on their items by id).
44
+ *
45
+ * Schema enforcement is two-phase when enforcing roles exist: the item's
46
+ * schema is a function of the SELECTED row's role and version pin, so the row
47
+ * is picked first (scoped, priority-ordered), validated, then filled by
48
+ * asserted id — the SDK statement re-checks pending/batch state atomically,
49
+ * and a row that went terminal between phases surfaces as a 409.
50
+ */
51
+ export declare function resolveBatchItemByMetadata(input: {
52
+ key: string;
53
+ value: string;
54
+ itemKey: string;
55
+ resolverPayload: Record<string, any>;
56
+ metadata?: Record<string, any>;
57
+ restrictRoles?: string[];
58
+ }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,247 @@
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.resolveBatchItem = resolveBatchItem;
37
+ exports.resolveBatchItemBySignalKey = resolveBatchItemBySignalKey;
38
+ exports.resolveBatchItemByMetadata = resolveBatchItemByMetadata;
39
+ const escalationService = __importStar(require("../../services/escalation"));
40
+ const resolver_validation_1 = require("../../services/escalation/resolver-validation");
41
+ const enforcement_cache_1 = require("../../services/role/enforcement-cache");
42
+ const escalation_1 = require("../../types/escalation");
43
+ const helpers_1 = require("./helpers");
44
+ const resolve_1 = require("./resolve");
45
+ const metadata_1 = require("./metadata");
46
+ /**
47
+ * Submit ONE declared item of a batch escalation (a `conditional` wait created
48
+ * with `batch: [...]`). Interim submissions are cheap atomic fills — the row
49
+ * stays pending and `remaining` reports progress. The LAST item completes the
50
+ * escalation: the row resolves and the waiting workflow wakes with the full
51
+ * collection, in the same statement.
52
+ *
53
+ * Each item validates against the SAME versioned form schema a single-item
54
+ * resolver gets (metadata.form_schema → pinned lt_role_schemas → live role
55
+ * schema), including the submit guard.
56
+ *
57
+ * Claim semantics: claim-agnostic by default — a batch accumulates
58
+ * contributions from multiple principals, so the single-owner claim lock is
59
+ * not asserted (same rationale as resolve-by-signal-key). Pass
60
+ * `assertClaim: true` to require the caller's own live claim, asserted
61
+ * atomically inside the SDK's guarded statement.
62
+ */
63
+ async function resolveBatchItem(input, auth) {
64
+ try {
65
+ const { id, itemKey, resolverPayload, metadata } = input;
66
+ if (!itemKey)
67
+ return { status: 400, error: 'itemKey is required' };
68
+ if (!resolverPayload)
69
+ return { status: 400, error: 'resolverPayload is required' };
70
+ const escalation = await escalationService.getEscalation(id);
71
+ if (!escalation)
72
+ return { status: 404, error: 'Escalation not found' };
73
+ if (escalation.status === 'cancelled')
74
+ return { status: 409, error: 'Escalation is cancelled' };
75
+ if (escalation.status !== 'pending')
76
+ return { status: 409, error: 'Escalation not available for resolution' };
77
+ // Advisory shape gate — cheap, readable rejection. The SDK's guarded
78
+ // statement re-checks and is the atomic arbiter (outcome 'not-batch').
79
+ const pending = escalation.metadata?.[escalation_1.ESCALATION_BATCH_KEYS.PENDING];
80
+ if (!Array.isArray(pending)) {
81
+ return { status: 400, error: 'Escalation is not a batch' };
82
+ }
83
+ // Hybrid RBAC, identical to single-resolve: non-disclosure 404 for rows the
84
+ // caller cannot see; informative 403 for rows they see but cannot act on.
85
+ if (await (0, helpers_1.assertReadAccess)(auth.userId, escalation)) {
86
+ return { status: 404, error: 'Escalation not found' };
87
+ }
88
+ const denied = await (0, helpers_1.assertWriteAccess)(auth.userId, escalation);
89
+ if (denied)
90
+ return denied;
91
+ // Per-item schema enforcement — the exact validation path single-resolve
92
+ // runs, against the row's pinned schema version.
93
+ const violation = await (0, resolver_validation_1.checkResolverPayload)(escalation, resolverPayload, undefined, auth.userId);
94
+ if (violation)
95
+ return (0, resolve_1.validationFailure)(violation);
96
+ const redacted = await (0, resolve_1.redactPasswords)(resolverPayload, escalation.metadata?.form_schema);
97
+ // resolved_by merges on every fill; the completing fill's stamp is the
98
+ // resolution provenance, matching single-resolve. $resolution rides the
99
+ // completing item's signal only.
100
+ const result = await escalationService.resolveBatchItem(escalation.id, itemKey, redacted, { ...metadata, resolved_by: auth.userId }, input.assertClaim ? auth.userId : undefined, await (0, resolve_1.resolverIdentity)(auth));
101
+ return batchOutcomeResult(result, itemKey, escalation.workflow_id);
102
+ }
103
+ catch (err) {
104
+ return { status: 500, error: err.message };
105
+ }
106
+ }
107
+ /**
108
+ * Submit one batch item selecting the escalation by its `signal_key` — the
109
+ * deterministic home signal id the waiting workflow parked on. For callers
110
+ * that already own that identity (a child workflow calling home, a webhook),
111
+ * so no UUID lookup and no facet duplication. Mirrors resolve-by-signal-key:
112
+ * claim-agnostic, write-scope gated with 404 non-disclosure.
113
+ */
114
+ async function resolveBatchItemBySignalKey(input, auth) {
115
+ try {
116
+ const { signalKey, itemKey, resolverPayload, metadata } = input;
117
+ if (!signalKey)
118
+ return { status: 400, error: 'signalKey is required' };
119
+ if (!itemKey)
120
+ return { status: 400, error: 'itemKey is required' };
121
+ if (!resolverPayload)
122
+ return { status: 400, error: 'resolverPayload is required' };
123
+ const escalation = await escalationService.getEscalationBySignalKey(signalKey);
124
+ if (!escalation)
125
+ return { status: 404, error: 'Escalation not found' };
126
+ if (escalation.status !== 'pending')
127
+ return { status: 409, error: 'Escalation not available for resolution' };
128
+ const pending = escalation.metadata?.[escalation_1.ESCALATION_BATCH_KEYS.PENDING];
129
+ if (!Array.isArray(pending)) {
130
+ return { status: 400, error: 'Escalation is not a batch' };
131
+ }
132
+ // Write verb on a system ingress surface — scope-gate with non-disclosure.
133
+ const denied = await (0, helpers_1.assertWriteAccess)(auth.userId, escalation);
134
+ if (denied)
135
+ return { status: 404, error: 'Escalation not found' };
136
+ const violation = await (0, resolver_validation_1.checkResolverPayload)(escalation, resolverPayload, undefined, auth.userId);
137
+ if (violation)
138
+ return (0, resolve_1.validationFailure)(violation);
139
+ const redacted = await (0, resolve_1.redactPasswords)(resolverPayload, escalation.metadata?.form_schema);
140
+ const result = await escalationService.resolveBatchItemBySignalKey(signalKey, itemKey, redacted, { ...metadata, resolved_by: auth.userId }, await (0, resolve_1.resolverIdentity)(auth));
141
+ return batchOutcomeResult(result, itemKey, escalation.workflow_id);
142
+ }
143
+ catch (err) {
144
+ return { status: 500, error: err.message };
145
+ }
146
+ }
147
+ /**
148
+ * Submit one batch item selecting the escalation by metadata facet — the
149
+ * faceted sibling of {@link resolveBatchItem}, mirroring resolve-by-metadata.
150
+ * RBAC folds into the SDK's atomic facet selection as a flat role filter
151
+ * (write_all roles; self-scope members act on their items by id).
152
+ *
153
+ * Schema enforcement is two-phase when enforcing roles exist: the item's
154
+ * schema is a function of the SELECTED row's role and version pin, so the row
155
+ * is picked first (scoped, priority-ordered), validated, then filled by
156
+ * asserted id — the SDK statement re-checks pending/batch state atomically,
157
+ * and a row that went terminal between phases surfaces as a 409.
158
+ */
159
+ async function resolveBatchItemByMetadata(input, auth) {
160
+ try {
161
+ const { key, value, itemKey, resolverPayload, metadata } = input;
162
+ if (!key || !value)
163
+ return { status: 400, error: 'key and value are required' };
164
+ if (!itemKey)
165
+ return { status: 400, error: 'itemKey is required' };
166
+ if (!resolverPayload)
167
+ return { status: 400, error: 'resolverPayload is required' };
168
+ const writeScope = await (0, helpers_1.getEscalationWriteScope)(auth.userId);
169
+ const allowedRoles = (0, metadata_1.restrictScopeRoles)(writeScope.allRoles, writeScope.global, input.restrictRoles);
170
+ const resolvedBy = await (0, resolve_1.resolverIdentity)(auth);
171
+ const outcome = { ...metadata, resolved_by: auth.userId };
172
+ const enforcing = await (0, enforcement_cache_1.getEnforcingRoles)();
173
+ if (enforcing.size === 0) {
174
+ // Single atomic call — selection, fill, and (on the last item) the
175
+ // resolve + wake all inside the SDK statement.
176
+ const result = await escalationService.resolveBatchItemByMetadata(key, value, itemKey, resolverPayload, allowedRoles ?? undefined, outcome, resolvedBy);
177
+ return batchOutcomeResult(result, itemKey, result.escalation?.workflow_id ?? null);
178
+ }
179
+ // Phase 1: pick the row the fill would target (scoped, priority-ordered)
180
+ // and validate against ITS schema when its role enforces. The role
181
+ // restriction folds into the scoped query — never a client-side filter.
182
+ const found = await escalationService.findByMetadata(key, value, 'pending', 1, 0, allowedRoles === null ? undefined : { allRoles: allowedRoles, meUserId: auth.userId });
183
+ const row = found.escalations[0];
184
+ if (!row)
185
+ return { status: 404, error: 'No pending escalation found for this metadata' };
186
+ if (enforcing.has(row.role)) {
187
+ const report = await (0, resolver_validation_1.checkResolverPayload)(row, resolverPayload, undefined, auth.userId);
188
+ if (report)
189
+ return (0, resolve_1.validationFailure)(report);
190
+ }
191
+ // Phase 2: fill by asserted id. The SDK statement re-checks pending +
192
+ // batch state; a row that went terminal between phases maps to 409.
193
+ const redacted = await (0, resolve_1.redactPasswords)(resolverPayload, row.metadata?.form_schema);
194
+ const result = await escalationService.resolveBatchItem(row.id, itemKey, redacted, outcome, undefined, resolvedBy);
195
+ if (result.outcome === 'not-found') {
196
+ return { status: 409, error: 'A concurrent resolution is already in progress for this escalation' };
197
+ }
198
+ return batchOutcomeResult(result, itemKey, row.workflow_id);
199
+ }
200
+ catch (err) {
201
+ return { status: 500, error: err.message };
202
+ }
203
+ }
204
+ /** Maps the SDK batch outcome vocabulary onto HTTP results. */
205
+ function batchOutcomeResult(result, itemKey, workflowId) {
206
+ switch (result.outcome) {
207
+ case 'completed':
208
+ return {
209
+ status: 200,
210
+ data: {
211
+ outcome: 'completed',
212
+ remaining: 0,
213
+ signaled: !!result.escalation?.signal_key,
214
+ escalationId: result.escalation?.id,
215
+ workflowId,
216
+ },
217
+ };
218
+ case 'accepted':
219
+ return {
220
+ status: 200,
221
+ data: {
222
+ outcome: 'accepted',
223
+ remaining: result.remaining,
224
+ escalationId: result.escalation?.id,
225
+ },
226
+ };
227
+ case 'duplicate-item':
228
+ return {
229
+ status: 409,
230
+ error: 'Batch item already submitted',
231
+ data: { error: 'Batch item already submitted', itemKey },
232
+ };
233
+ case 'claimed-by-other':
234
+ return { status: 409, error: 'Escalation is claimed by another user' };
235
+ case 'claim-expired':
236
+ return { status: 409, error: 'Your claim has expired — re-claim this escalation to resolve it' };
237
+ case 'not-found':
238
+ return { status: 404, error: 'Escalation not found' };
239
+ case 'unknown-item':
240
+ return { status: 400, error: 'itemKey is not in the declared batch' };
241
+ case 'not-batch':
242
+ return { status: 400, error: 'Escalation is not a batch' };
243
+ default:
244
+ // already-resolved / already-cancelled / already-expired
245
+ return { status: 409, error: 'Escalation not available for resolution' };
246
+ }
247
+ }
@@ -73,6 +73,15 @@ export declare function resolveAllOrNone(input: {
73
73
  metadata?: Record<string, any>;
74
74
  requireClaimed?: boolean;
75
75
  }, auth: LTApiAuth): Promise<LTApiResult>;
76
+ /**
77
+ * The resolving principal's identity for `$resolution` delivery. The email is
78
+ * best-effort (one indexed read, tolerated failure) — the id alone satisfies
79
+ * the provenance contract.
80
+ */
81
+ export declare function resolverIdentity(auth: LTApiAuth): Promise<{
82
+ id: string;
83
+ email?: string;
84
+ }>;
76
85
  /**
77
86
  * The canonical 422 for a schema-validation rejection. The full body rides in
78
87
  * `data` (routes serialize `data ?? { error }`), so every transport — HTTP,
@@ -80,3 +89,5 @@ export declare function resolveAllOrNone(input: {
80
89
  * role, schemaVersion. `code` also sits on the envelope for SDK branching.
81
90
  */
82
91
  export declare function validationFailure(report: ResolverSchemaViolationReport): LTApiResult;
92
+ /** Replace password fields with ephemeral tokens so plaintext never enters the signal store. */
93
+ export declare function redactPasswords(payload: Record<string, any>, formSchema: any): Promise<Record<string, any>>;
@@ -37,7 +37,9 @@ exports.resolveEscalation = resolveEscalation;
37
37
  exports.resolveBySignalKey = resolveBySignalKey;
38
38
  exports.resolveByIds = resolveByIds;
39
39
  exports.resolveAllOrNone = resolveAllOrNone;
40
+ exports.resolverIdentity = resolverIdentity;
40
41
  exports.validationFailure = validationFailure;
42
+ exports.redactPasswords = redactPasswords;
41
43
  const escalationService = __importStar(require("../../services/escalation"));
42
44
  const userService = __importStar(require("../../services/user"));
43
45
  const taskService = __importStar(require("../../services/task"));
@@ -40,7 +40,7 @@ export declare function publishTaskEvent(params: {
40
40
  * role hops (`system.escalation.*.{id}.>`).
41
41
  */
42
42
  export declare function publishEscalationEvent(params: {
43
- type: 'escalation.created' | 'escalation.resolved' | 'escalation.claimed' | 'escalation.released' | 'escalation.cancelled' | 'escalation.reassigned';
43
+ type: 'escalation.created' | 'escalation.resolved' | 'escalation.claimed' | 'escalation.released' | 'escalation.cancelled' | 'escalation.reassigned' | 'escalation.updated';
44
44
  source: string;
45
45
  workflowId: string;
46
46
  workflowName: string;
@@ -86,4 +86,23 @@ function registerMetadataRoutes(router) {
86
86
  }, req.auth);
87
87
  res.status(result.status).json(result.data ?? { error: result.error });
88
88
  });
89
+ /**
90
+ * POST /api/escalations/resolve-batch-item-by-metadata
91
+ * Submit one declared item of a batch escalation selected by metadata facet.
92
+ * Interim items return { outcome: 'accepted', remaining }; the LAST item
93
+ * completes the escalation and wakes the waiting workflow with the full
94
+ * collection.
95
+ * Body: { key, value, itemKey, resolverPayload, metadata?, restrictRoles? }
96
+ */
97
+ router.post('/resolve-batch-item-by-metadata', async (req, res) => {
98
+ const result = await api.resolveBatchItemByMetadata({
99
+ key: req.body?.key,
100
+ value: req.body?.value,
101
+ itemKey: req.body?.itemKey,
102
+ resolverPayload: req.body?.resolverPayload,
103
+ metadata: req.body?.metadata,
104
+ restrictRoles: req.body?.restrictRoles,
105
+ }, req.auth);
106
+ res.status(result.status).json(result.data ?? { error: result.error });
107
+ });
89
108
  }
@@ -85,6 +85,47 @@ function registerResolveRoutes(router) {
85
85
  }, req.auth);
86
86
  res.status(result.status).json(result.data ?? { error: result.error });
87
87
  });
88
+ /**
89
+ * POST /api/escalations/resolve-batch-item-by-signal-key
90
+ * Submit ONE declared item of a batch escalation by its signal_key — the
91
+ * deterministic home signal id the waiting workflow parked on. For callers
92
+ * that already own that identity (a child calling home, a webhook).
93
+ * Literal single-segment path — registered before /:id routes.
94
+ * Body: { signalKey: string, itemKey: string, resolverPayload: Record<string, any>,
95
+ * metadata?: Record<string, any> }
96
+ */
97
+ router.post('/resolve-batch-item-by-signal-key', async (req, res) => {
98
+ const result = await api.resolveBatchItemBySignalKey({
99
+ signalKey: req.body?.signalKey,
100
+ itemKey: req.body?.itemKey,
101
+ resolverPayload: req.body?.resolverPayload,
102
+ metadata: req.body?.metadata,
103
+ }, req.auth);
104
+ res.status(result.status).json(result.data ?? { error: result.error });
105
+ });
106
+ /**
107
+ * POST /api/escalations/:id/resolve-batch-item
108
+ * Submit ONE declared item of a batch escalation. Interim items return
109
+ * { outcome: 'accepted', remaining }; the LAST item completes the
110
+ * escalation and wakes the waiting workflow with the full collection.
111
+ * Claim-agnostic by default; assertClaim: true requires the caller's own
112
+ * live claim, asserted atomically.
113
+ * Body: { itemKey: string, resolverPayload: Record<string, any>,
114
+ * metadata?: Record<string, any>, assertClaim?: boolean }
115
+ */
116
+ router.post('/:id/resolve-batch-item', async (req, res) => {
117
+ const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
118
+ if (!auth)
119
+ return;
120
+ const result = await api.resolveBatchItem({
121
+ id: req.params.id,
122
+ itemKey: req.body?.itemKey,
123
+ resolverPayload: req.body?.resolverPayload,
124
+ metadata: req.body?.metadata,
125
+ assertClaim: req.body?.assertClaim,
126
+ }, auth);
127
+ res.status(result.status).json(result.data ?? { error: result.error });
128
+ });
88
129
  /**
89
130
  * POST /api/escalations/:id/resolve
90
131
  * Resolve a pending escalation with a human-provided payload. Routes by
@@ -222,6 +222,27 @@ export declare function createClient(options?: LTClientOptions): {
222
222
  restrictRoles?: string[];
223
223
  extraFacets?: Record<string, any>;
224
224
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
225
+ resolveBatchItem: (input: {
226
+ id: string;
227
+ itemKey: string;
228
+ resolverPayload: Record<string, any>;
229
+ metadata?: Record<string, any>;
230
+ assertClaim?: boolean;
231
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
232
+ resolveBatchItemBySignalKey: (input: {
233
+ signalKey: string;
234
+ itemKey: string;
235
+ resolverPayload: Record<string, any>;
236
+ metadata?: Record<string, any>;
237
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
238
+ resolveBatchItemByMetadata: (input: {
239
+ key: string;
240
+ value: string;
241
+ itemKey: string;
242
+ resolverPayload: Record<string, any>;
243
+ metadata?: Record<string, any>;
244
+ restrictRoles?: string[];
245
+ }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
225
246
  searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
226
247
  claimGroups: (input: {
227
248
  query: import("..").FacetQuery;
@@ -143,6 +143,9 @@ function createClient(options = {}) {
143
143
  findByMetadata: bindAuth(escalationsApi.findByMetadata, auth),
144
144
  claimByMetadata: bindAuth(escalationsApi.claimByMetadata, auth),
145
145
  resolveByMetadata: bindAuth(escalationsApi.resolveByMetadata, auth),
146
+ resolveBatchItem: bindAuth(escalationsApi.resolveBatchItem, auth),
147
+ resolveBatchItemBySignalKey: bindAuth(escalationsApi.resolveBatchItemBySignalKey, auth),
148
+ resolveBatchItemByMetadata: bindAuth(escalationsApi.resolveBatchItemByMetadata, auth),
146
149
  // Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
147
150
  searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
148
151
  claimGroups: bindAuth(escalationsApi.claimGroups, auth),
@@ -0,0 +1,38 @@
1
+ import type { BatchItemOutcome, LTEscalationRecord } from '../../types';
2
+ export interface ResolveBatchItemOutcome {
3
+ outcome: BatchItemOutcome;
4
+ /** Items still awaiting submission after this call (0 exactly when completed). */
5
+ remaining: number;
6
+ /** The post-fill row on `completed`/`accepted`; null on every failure outcome. */
7
+ escalation: LTEscalationRecord | null;
8
+ }
9
+ /**
10
+ * Fills one declared item of a batch escalation in a single atomic SDK
11
+ * statement (guarded fill + facet recompute + resolve-and-wake on the last
12
+ * item). Interim fills publish `escalation.updated` with progress; the
13
+ * completing fill publishes the standard `escalation.resolved`. Failure
14
+ * outcomes publish nothing — the row was untouched.
15
+ */
16
+ export declare function resolveBatchItem(id: string, itemKey: string, payload: Record<string, any>, metadata?: Record<string, any>, assertClaim?: string, resolvedBy?: {
17
+ id: string;
18
+ email?: string;
19
+ }): Promise<ResolveBatchItemOutcome>;
20
+ /**
21
+ * Batch-item fill selecting the row by its `signal_key` — the deterministic
22
+ * home signal id the parent parked on. For callers that already own that
23
+ * identity (a child calling home, a webhook), skipping both the UUID lookup
24
+ * and any facet duplication. Same event contract as {@link resolveBatchItem}.
25
+ */
26
+ export declare function resolveBatchItemBySignalKey(signalKey: string, itemKey: string, payload: Record<string, any>, metadata?: Record<string, any>, resolvedBy?: {
27
+ id: string;
28
+ email?: string;
29
+ }): Promise<ResolveBatchItemOutcome>;
30
+ /**
31
+ * Batch-item fill selecting the row by metadata facet — the highest-priority
32
+ * pending row whose metadata contains the key/value, scoped by `roles`.
33
+ * Same event contract as {@link resolveBatchItem}.
34
+ */
35
+ export declare function resolveBatchItemByMetadata(key: string, value: unknown, itemKey: string, payload: Record<string, any>, roles?: string[], metadata?: Record<string, any>, resolvedBy?: {
36
+ id: string;
37
+ email?: string;
38
+ }): Promise<ResolveBatchItemOutcome>;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveBatchItem = resolveBatchItem;
4
+ exports.resolveBatchItemBySignalKey = resolveBatchItemBySignalKey;
5
+ exports.resolveBatchItemByMetadata = resolveBatchItemByMetadata;
6
+ const escalation_wire_1 = require("../../lib/events/escalation-wire");
7
+ const client_1 = require("./client");
8
+ const crud_1 = require("./crud");
9
+ const map_1 = require("./map");
10
+ /**
11
+ * Fills one declared item of a batch escalation in a single atomic SDK
12
+ * statement (guarded fill + facet recompute + resolve-and-wake on the last
13
+ * item). Interim fills publish `escalation.updated` with progress; the
14
+ * completing fill publishes the standard `escalation.resolved`. Failure
15
+ * outcomes publish nothing — the row was untouched.
16
+ */
17
+ async function resolveBatchItem(id, itemKey, payload, metadata, assertClaim, resolvedBy) {
18
+ const client = await (0, client_1.escalations)();
19
+ const result = await client.resolveBatchItem({
20
+ id,
21
+ itemKey,
22
+ payload,
23
+ metadata,
24
+ assertClaim,
25
+ resolvedBy,
26
+ });
27
+ return settleBatchOutcome(result, itemKey);
28
+ }
29
+ /**
30
+ * Batch-item fill selecting the row by its `signal_key` — the deterministic
31
+ * home signal id the parent parked on. For callers that already own that
32
+ * identity (a child calling home, a webhook), skipping both the UUID lookup
33
+ * and any facet duplication. Same event contract as {@link resolveBatchItem}.
34
+ */
35
+ async function resolveBatchItemBySignalKey(signalKey, itemKey, payload, metadata, resolvedBy) {
36
+ const client = await (0, client_1.escalations)();
37
+ const result = await client.resolveBatchItem({
38
+ signalKey,
39
+ itemKey,
40
+ payload,
41
+ metadata,
42
+ resolvedBy,
43
+ });
44
+ return settleBatchOutcome(result, itemKey);
45
+ }
46
+ /**
47
+ * Batch-item fill selecting the row by metadata facet — the highest-priority
48
+ * pending row whose metadata contains the key/value, scoped by `roles`.
49
+ * Same event contract as {@link resolveBatchItem}.
50
+ */
51
+ async function resolveBatchItemByMetadata(key, value, itemKey, payload, roles, metadata, resolvedBy) {
52
+ const client = await (0, client_1.escalations)();
53
+ const result = await client.resolveBatchItemByMetadata({
54
+ key,
55
+ value,
56
+ roles,
57
+ itemKey,
58
+ payload,
59
+ metadata,
60
+ resolvedBy,
61
+ });
62
+ return settleBatchOutcome(result, itemKey);
63
+ }
64
+ function settleBatchOutcome(result, itemKey) {
65
+ if (!result.ok) {
66
+ return { outcome: result.outcome, remaining: -1, escalation: null };
67
+ }
68
+ const escalation = (0, map_1.toEscalationRecord)(result.entry);
69
+ const completed = result.outcome === 'completed';
70
+ (0, crud_1.publishEscalationChange)({
71
+ type: completed ? 'escalation.resolved' : 'escalation.updated',
72
+ source: 'service',
73
+ workflowId: escalation.workflow_id || '',
74
+ workflowName: escalation.workflow_type || '',
75
+ taskQueue: escalation.task_queue || '',
76
+ escalationId: escalation.id,
77
+ role: escalation.role,
78
+ status: completed ? 'resolved' : 'pending',
79
+ data: (0, escalation_wire_1.escalationEventData)(escalation, {
80
+ item_key: itemKey,
81
+ remaining: result.remaining,
82
+ }),
83
+ });
84
+ return { outcome: result.outcome, remaining: result.remaining, escalation };
85
+ }
@@ -1,5 +1,12 @@
1
+ import { publishEscalationEvent } from '../../lib/events/publish';
1
2
  import type { LTEscalationRecord } from '../../types';
2
3
  import type { CreateEscalationInput, ClaimResult } from './types';
4
+ /**
5
+ * Every escalation write publishes an event AND drops this container's cached
6
+ * aggregates — the event triggers a dashboard refetch, which must observe the
7
+ * write rather than a pre-change aggregate held for up to a cache TTL.
8
+ */
9
+ export declare function publishEscalationChange(...args: Parameters<typeof publishEscalationEvent>): Promise<void>;
3
10
  export declare function createEscalation(input: CreateEscalationInput): Promise<LTEscalationRecord>;
4
11
  /**
5
12
  * Atomic claim. Implicit model — status stays 'pending'; "claimed" is
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.publishEscalationChange = publishEscalationChange;
3
4
  exports.createEscalation = createEscalation;
4
5
  exports.claimEscalation = claimEscalation;
5
6
  exports.resolveEscalation = resolveEscalation;
@@ -1,5 +1,6 @@
1
1
  export * from './types';
2
2
  export * from './crud';
3
+ export * from './batch';
3
4
  export * from './bulk';
4
5
  export * from './queries';
5
6
  export * from './resolver-validation';