@hotmeshio/long-tail 0.25.0 → 0.25.2

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 (282) hide show
  1. package/build/api/escalations/batch-flag.d.ts +19 -0
  2. package/build/api/escalations/batch-flag.js +138 -0
  3. package/build/api/escalations/index.d.ts +2 -0
  4. package/build/api/escalations/index.js +8 -1
  5. package/build/api/escalations/roster-action.d.ts +37 -0
  6. package/build/api/escalations/roster-action.js +179 -0
  7. package/build/api/scan-codes/choice-roles.d.ts +3 -0
  8. package/build/api/scan-codes/choice-roles.js +48 -0
  9. package/build/api/scan-codes/choice.js +8 -0
  10. package/build/api/scan-codes/fill-labels.d.ts +15 -0
  11. package/build/api/scan-codes/fill-labels.js +99 -0
  12. package/build/api/scan-codes/hold.js +1 -0
  13. package/build/api/scan-codes/present.js +7 -2
  14. package/build/api/scan-codes/verb-fill.js +22 -5
  15. package/build/routes/escalations/resolve.js +45 -0
  16. package/build/sdk/index.d.ts +11 -0
  17. package/build/sdk/index.js +3 -0
  18. package/build/services/domain/seed.d.ts +12 -10
  19. package/build/services/domain/seed.js +31 -25
  20. package/build/services/escalation/batch-flag.d.ts +25 -0
  21. package/build/services/escalation/batch-flag.js +51 -0
  22. package/build/services/escalation/index.d.ts +1 -0
  23. package/build/services/escalation/index.js +1 -0
  24. package/build/services/escalation/roster.d.ts +3 -1
  25. package/build/services/escalation/roster.js +6 -1
  26. package/build/services/scan-code/validate-subject.js +16 -0
  27. package/build/services/scan-code/validate.js +7 -0
  28. package/build/shared/form-validation/index.d.ts +1 -0
  29. package/build/shared/form-validation/index.js +1 -0
  30. package/build/shared/form-validation/x-lt-actions.d.ts +80 -0
  31. package/build/shared/form-validation/x-lt-actions.js +133 -0
  32. package/build/shared/form-validation/x-lt-roster.d.ts +2 -0
  33. package/build/shared/form-validation/x-lt-roster.js +50 -6
  34. package/build/start/workers.d.ts +3 -0
  35. package/build/start/workers.js +15 -5
  36. package/build/tsconfig.tsbuildinfo +1 -1
  37. package/build/types/escalation.d.ts +19 -0
  38. package/build/types/escalation.js +4 -0
  39. package/build/types/index.d.ts +1 -1
  40. package/build/types/scan-choice.d.ts +9 -0
  41. package/build/types/scan-code/response.d.ts +2 -0
  42. package/build/types/scan-code/rule.d.ts +17 -0
  43. package/build/types/startup.d.ts +8 -1
  44. package/dashboard/dist/assets/{AdminDashboard-DWVRAu63.js → AdminDashboard-B8MqNLiB.js} +2 -2
  45. package/dashboard/dist/assets/{AdminDashboard-DWVRAu63.js.map → AdminDashboard-B8MqNLiB.js.map} +1 -1
  46. package/dashboard/dist/assets/{AgentConfigPage-Exjtjbvp.js → AgentConfigPage-Yg81Eiuo.js} +2 -2
  47. package/dashboard/dist/assets/{AgentConfigPage-Exjtjbvp.js.map → AgentConfigPage-Yg81Eiuo.js.map} +1 -1
  48. package/dashboard/dist/assets/{AgentDetailPage-nDbZo6RB.js → AgentDetailPage-ZUGYEONO.js} +3 -3
  49. package/dashboard/dist/assets/{AgentDetailPage-nDbZo6RB.js.map → AgentDetailPage-ZUGYEONO.js.map} +1 -1
  50. package/dashboard/dist/assets/{AgentsPage-Dsk9iHps.js → AgentsPage-CZIWMwak.js} +2 -2
  51. package/dashboard/dist/assets/{AgentsPage-Dsk9iHps.js.map → AgentsPage-CZIWMwak.js.map} +1 -1
  52. package/dashboard/dist/assets/AvailableEscalationsPage-BVtpc4xO.js +2 -0
  53. package/dashboard/dist/assets/{AvailableEscalationsPage-D1mCqj8Z.js.map → AvailableEscalationsPage-BVtpc4xO.js.map} +1 -1
  54. package/dashboard/dist/assets/{BotPicker-u5760MWZ.js → BotPicker-8bf0yOCT.js} +2 -2
  55. package/dashboard/dist/assets/{BotPicker-u5760MWZ.js.map → BotPicker-8bf0yOCT.js.map} +1 -1
  56. package/dashboard/dist/assets/{BulkAssignModal-CtISXXmW.js → BulkAssignModal-B2lr1J6P.js} +2 -2
  57. package/dashboard/dist/assets/{BulkAssignModal-CtISXXmW.js.map → BulkAssignModal-B2lr1J6P.js.map} +1 -1
  58. package/dashboard/dist/assets/{CapabilitiesPage-BKIlrQfU.js → CapabilitiesPage-BQQBR2sj.js} +2 -2
  59. package/dashboard/dist/assets/{CapabilitiesPage-BKIlrQfU.js.map → CapabilitiesPage-BQQBR2sj.js.map} +1 -1
  60. package/dashboard/dist/assets/{CollapsibleSection-DlBVTFqc.js → CollapsibleSection-DFW8TYyU.js} +2 -2
  61. package/dashboard/dist/assets/{CollapsibleSection-DlBVTFqc.js.map → CollapsibleSection-DFW8TYyU.js.map} +1 -1
  62. package/dashboard/dist/assets/{ConfirmDeleteModal-Pabkchg_.js → ConfirmDeleteModal-DGlOlQAo.js} +2 -2
  63. package/dashboard/dist/assets/{ConfirmDeleteModal-Pabkchg_.js.map → ConfirmDeleteModal-DGlOlQAo.js.map} +1 -1
  64. package/dashboard/dist/assets/{ConnectedAppsPage-DG2YZGN3.js → ConnectedAppsPage-CIM9gzHj.js} +2 -2
  65. package/dashboard/dist/assets/{ConnectedAppsPage-DG2YZGN3.js.map → ConnectedAppsPage-CIM9gzHj.js.map} +1 -1
  66. package/dashboard/dist/assets/{CountdownTimer-5t8S2qMi.js → CountdownTimer-BD_iWm6S.js} +2 -2
  67. package/dashboard/dist/assets/{CountdownTimer-5t8S2qMi.js.map → CountdownTimer-BD_iWm6S.js.map} +1 -1
  68. package/dashboard/dist/assets/{CredentialsPage-CPVbYQow.js → CredentialsPage-CTtUkvoD.js} +2 -2
  69. package/dashboard/dist/assets/{CredentialsPage-CPVbYQow.js.map → CredentialsPage-CTtUkvoD.js.map} +1 -1
  70. package/dashboard/dist/assets/{CronLabel-C7UbTrO-.js → CronLabel-rZMptkYQ.js} +2 -2
  71. package/dashboard/dist/assets/{CronLabel-C7UbTrO-.js.map → CronLabel-rZMptkYQ.js.map} +1 -1
  72. package/dashboard/dist/assets/{DropZone-DCZpORx-.js → DropZone-u1JGfR9G.js} +2 -2
  73. package/dashboard/dist/assets/{DropZone-DCZpORx-.js.map → DropZone-u1JGfR9G.js.map} +1 -1
  74. package/dashboard/dist/assets/{ElapsedCell-Yz7-LbtE.js → ElapsedCell-CmK9gHC5.js} +2 -2
  75. package/dashboard/dist/assets/{ElapsedCell-Yz7-LbtE.js.map → ElapsedCell-CmK9gHC5.js.map} +1 -1
  76. package/dashboard/dist/assets/{EntityTimelinePanel-xgPRdKEq.js → EntityTimelinePanel-Cfg0EMZs.js} +2 -2
  77. package/dashboard/dist/assets/{EntityTimelinePanel-xgPRdKEq.js.map → EntityTimelinePanel-Cfg0EMZs.js.map} +1 -1
  78. package/dashboard/dist/assets/{EscalationListSchemaPage-CqCd-y6B.js → EscalationListSchemaPage-CPcbC1-9.js} +3 -3
  79. package/dashboard/dist/assets/{EscalationListSchemaPage-CqCd-y6B.js.map → EscalationListSchemaPage-CPcbC1-9.js.map} +1 -1
  80. package/dashboard/dist/assets/{EscalationSchemaPage-D8YVQNph.js → EscalationSchemaPage-BsYdNVN7.js} +3 -3
  81. package/dashboard/dist/assets/{EscalationSchemaPage-D8YVQNph.js.map → EscalationSchemaPage-BsYdNVN7.js.map} +1 -1
  82. package/dashboard/dist/assets/EscalationTimeline-D1enxZDs.js +2 -0
  83. package/dashboard/dist/assets/{EscalationTimeline-D6jrDcBb.js.map → EscalationTimeline-D1enxZDs.js.map} +1 -1
  84. package/dashboard/dist/assets/{EscalationTitleSelect-CGGT-QTu.js → EscalationTitleSelect-DwqhnPKX.js} +2 -2
  85. package/dashboard/dist/assets/{EscalationTitleSelect-CGGT-QTu.js.map → EscalationTitleSelect-DwqhnPKX.js.map} +1 -1
  86. package/dashboard/dist/assets/{EscalationsOverview-B7O4ttP4.js → EscalationsOverview-ChuKh02E.js} +2 -2
  87. package/dashboard/dist/assets/{EscalationsOverview-B7O4ttP4.js.map → EscalationsOverview-ChuKh02E.js.map} +1 -1
  88. package/dashboard/dist/assets/{EventTable-DJniXnhe.js → EventTable-GqZIKPce.js} +2 -2
  89. package/dashboard/dist/assets/{EventTable-DJniXnhe.js.map → EventTable-GqZIKPce.js.map} +1 -1
  90. package/dashboard/dist/assets/{FilterBar-f-LEKcHI.js → FilterBar-CqPFZkVU.js} +2 -2
  91. package/dashboard/dist/assets/{FilterBar-f-LEKcHI.js.map → FilterBar-CqPFZkVU.js.map} +1 -1
  92. package/dashboard/dist/assets/{GraphInvokePage-CR0MtYv8.js → GraphInvokePage-_fB7mtBU.js} +2 -2
  93. package/dashboard/dist/assets/{GraphInvokePage-CR0MtYv8.js.map → GraphInvokePage-_fB7mtBU.js.map} +1 -1
  94. package/dashboard/dist/assets/{HomePage-HVw7T5ER.js → HomePage-BXA0Cz0F.js} +2 -2
  95. package/dashboard/dist/assets/{HomePage-HVw7T5ER.js.map → HomePage-BXA0Cz0F.js.map} +1 -1
  96. package/dashboard/dist/assets/{ListToolbar-CTGK5BXW.js → ListToolbar-Bf4DFITI.js} +2 -2
  97. package/dashboard/dist/assets/{ListToolbar-CTGK5BXW.js.map → ListToolbar-Bf4DFITI.js.map} +1 -1
  98. package/dashboard/dist/assets/{McpOverview-B2bbKKu2.js → McpOverview-H61XQRji.js} +2 -2
  99. package/dashboard/dist/assets/{McpOverview-B2bbKKu2.js.map → McpOverview-H61XQRji.js.map} +1 -1
  100. package/dashboard/dist/assets/{McpQueryDetailPage-DgLxwwJy.js → McpQueryDetailPage-wbwK8WWq.js} +2 -2
  101. package/dashboard/dist/assets/{McpQueryDetailPage-DgLxwwJy.js.map → McpQueryDetailPage-wbwK8WWq.js.map} +1 -1
  102. package/dashboard/dist/assets/{McpQueryPage-CSkczeJP.js → McpQueryPage-CYvVEk3G.js} +2 -2
  103. package/dashboard/dist/assets/{McpQueryPage-CSkczeJP.js.map → McpQueryPage-CYvVEk3G.js.map} +1 -1
  104. package/dashboard/dist/assets/{McpRunDetailPage-CrUsDPRD.js → McpRunDetailPage-TZBX68i4.js} +2 -2
  105. package/dashboard/dist/assets/{McpRunDetailPage-CrUsDPRD.js.map → McpRunDetailPage-TZBX68i4.js.map} +1 -1
  106. package/dashboard/dist/assets/{McpRunsPage-twxFdTtJ.js → McpRunsPage-Cu91Mh52.js} +2 -2
  107. package/dashboard/dist/assets/{McpRunsPage-twxFdTtJ.js.map → McpRunsPage-Cu91Mh52.js.map} +1 -1
  108. package/dashboard/dist/assets/{NamespacePill-CSZT2fA4.js → NamespacePill-C5epAgq6.js} +2 -2
  109. package/dashboard/dist/assets/{NamespacePill-CSZT2fA4.js.map → NamespacePill-C5epAgq6.js.map} +1 -1
  110. package/dashboard/dist/assets/{OperationsPage-gOVMrL_a.js → OperationsPage-D-6sKw6y.js} +3 -3
  111. package/dashboard/dist/assets/{OperationsPage-gOVMrL_a.js.map → OperationsPage-D-6sKw6y.js.map} +1 -1
  112. package/dashboard/dist/assets/OperatorDashboard-DD8JUU3L.js +2 -0
  113. package/dashboard/dist/assets/{OperatorDashboard-BoeZIyup.js.map → OperatorDashboard-DD8JUU3L.js.map} +1 -1
  114. package/dashboard/dist/assets/{PageHeader-C4z1ExF7.js → PageHeader-BSWIspNB.js} +2 -2
  115. package/dashboard/dist/assets/{PageHeader-C4z1ExF7.js.map → PageHeader-BSWIspNB.js.map} +1 -1
  116. package/dashboard/dist/assets/{PageHeaderWithStats-B_f_Sz_Q.js → PageHeaderWithStats-DDjopQ-k.js} +2 -2
  117. package/dashboard/dist/assets/{PageHeaderWithStats-B_f_Sz_Q.js.map → PageHeaderWithStats-DDjopQ-k.js.map} +1 -1
  118. package/dashboard/dist/assets/{PersonaDetailPage-CDktk1mi.js → PersonaDetailPage-CGri6okV.js} +2 -2
  119. package/dashboard/dist/assets/{PersonaDetailPage-CDktk1mi.js.map → PersonaDetailPage-CGri6okV.js.map} +1 -1
  120. package/dashboard/dist/assets/{PersonasPage-Bs097x07.js → PersonasPage-DtHW6-Qx.js} +2 -2
  121. package/dashboard/dist/assets/{PersonasPage-Bs097x07.js.map → PersonasPage-DtHW6-Qx.js.map} +1 -1
  122. package/dashboard/dist/assets/PortalPage-Dgbk_mzr.js +2 -0
  123. package/dashboard/dist/assets/{PortalPage-DjfjerpF.js.map → PortalPage-Dgbk_mzr.js.map} +1 -1
  124. package/dashboard/dist/assets/{ProcessDetailPage-B30RatjD.js → ProcessDetailPage-BdkacBrD.js} +2 -2
  125. package/dashboard/dist/assets/{ProcessDetailPage-B30RatjD.js.map → ProcessDetailPage-BdkacBrD.js.map} +1 -1
  126. package/dashboard/dist/assets/{ProcessesListPage-DrvjzgWT.js → ProcessesListPage-DO5A-OfZ.js} +2 -2
  127. package/dashboard/dist/assets/{ProcessesListPage-DrvjzgWT.js.map → ProcessesListPage-DO5A-OfZ.js.map} +1 -1
  128. package/dashboard/dist/assets/ResolverForm-CqGE5lf-.js +8 -0
  129. package/dashboard/dist/assets/ResolverForm-CqGE5lf-.js.map +1 -0
  130. package/dashboard/dist/assets/{RoleDetailPage-ClYgn-3d.js → RoleDetailPage-DgVp0Hih.js} +2 -2
  131. package/dashboard/dist/assets/{RoleDetailPage-ClYgn-3d.js.map → RoleDetailPage-DgVp0Hih.js.map} +1 -1
  132. package/dashboard/dist/assets/{RolePill-Bw_n7EpR.js → RolePill-CoETDpjF.js} +2 -2
  133. package/dashboard/dist/assets/{RolePill-Bw_n7EpR.js.map → RolePill-CoETDpjF.js.map} +1 -1
  134. package/dashboard/dist/assets/{RolesPage-B_3qWsvQ.js → RolesPage-BmsWq83e.js} +2 -2
  135. package/dashboard/dist/assets/{RolesPage-B_3qWsvQ.js.map → RolesPage-BmsWq83e.js.map} +1 -1
  136. package/dashboard/dist/assets/RosterWidget-DR-T4Izu.js +2 -0
  137. package/dashboard/dist/assets/RosterWidget-DR-T4Izu.js.map +1 -0
  138. package/dashboard/dist/assets/{RunAsSelector-CbJT50Hp.js → RunAsSelector-CyUWGp5P.js} +2 -2
  139. package/dashboard/dist/assets/{RunAsSelector-CbJT50Hp.js.map → RunAsSelector-CyUWGp5P.js.map} +1 -1
  140. package/dashboard/dist/assets/{ScanCodesPage-CIIDuh8w.js → ScanCodesPage-Cy05JOt4.js} +2 -2
  141. package/dashboard/dist/assets/{ScanCodesPage-CIIDuh8w.js.map → ScanCodesPage-Cy05JOt4.js.map} +1 -1
  142. package/dashboard/dist/assets/{ScanSchemeDetailPage-Bd3P3eyh.js → ScanSchemeDetailPage-BX1afzOg.js} +2 -2
  143. package/dashboard/dist/assets/{ScanSchemeDetailPage-Bd3P3eyh.js.map → ScanSchemeDetailPage-BX1afzOg.js.map} +1 -1
  144. package/dashboard/dist/assets/ScanStationPage-DLAB41tb.js +2 -0
  145. package/dashboard/dist/assets/ScanStationPage-DLAB41tb.js.map +1 -0
  146. package/dashboard/dist/assets/{ScopeBadge-CKgfwTy3.js → ScopeBadge-CGsTtqFr.js} +2 -2
  147. package/dashboard/dist/assets/{ScopeBadge-CKgfwTy3.js.map → ScopeBadge-CGsTtqFr.js.map} +1 -1
  148. package/dashboard/dist/assets/{StickyPagination-BNOuYZ1m.js → StickyPagination-BzUTnYYE.js} +2 -2
  149. package/dashboard/dist/assets/{StickyPagination-BNOuYZ1m.js.map → StickyPagination-BzUTnYYE.js.map} +1 -1
  150. package/dashboard/dist/assets/{StreamMessageDetail-ALVUnfF1.js → StreamMessageDetail-D0W1ekgG.js} +2 -2
  151. package/dashboard/dist/assets/{StreamMessageDetail-ALVUnfF1.js.map → StreamMessageDetail-D0W1ekgG.js.map} +1 -1
  152. package/dashboard/dist/assets/{SwimlaneTimeline-B5b8-xqI.js → SwimlaneTimeline-BPBwmwuO.js} +2 -2
  153. package/dashboard/dist/assets/{SwimlaneTimeline-B5b8-xqI.js.map → SwimlaneTimeline-BPBwmwuO.js.map} +1 -1
  154. package/dashboard/dist/assets/{TagInput-B6fMAqxd.js → TagInput-S7UuVT_M.js} +2 -2
  155. package/dashboard/dist/assets/{TagInput-B6fMAqxd.js.map → TagInput-S7UuVT_M.js.map} +1 -1
  156. package/dashboard/dist/assets/{TaskDetailPage-CoV3WcTA.js → TaskDetailPage-VuaIXISy.js} +2 -2
  157. package/dashboard/dist/assets/{TaskDetailPage-CoV3WcTA.js.map → TaskDetailPage-VuaIXISy.js.map} +1 -1
  158. package/dashboard/dist/assets/{TaskQueuePill-BnDp_DE6.js → TaskQueuePill-BlHNpYiZ.js} +2 -2
  159. package/dashboard/dist/assets/{TaskQueuePill-BnDp_DE6.js.map → TaskQueuePill-BlHNpYiZ.js.map} +1 -1
  160. package/dashboard/dist/assets/{TasksListPage-CkMmOYOE.js → TasksListPage-KaUSoqos.js} +2 -2
  161. package/dashboard/dist/assets/{TasksListPage-CkMmOYOE.js.map → TasksListPage-KaUSoqos.js.map} +1 -1
  162. package/dashboard/dist/assets/{TimeAgo-DVkFgECX.js → TimeAgo-C_E6u0fr.js} +2 -2
  163. package/dashboard/dist/assets/{TimeAgo-DVkFgECX.js.map → TimeAgo-C_E6u0fr.js.map} +1 -1
  164. package/dashboard/dist/assets/{TimestampCell-CfTc6Txy.js → TimestampCell-CUJiAmax.js} +2 -2
  165. package/dashboard/dist/assets/{TimestampCell-CfTc6Txy.js.map → TimestampCell-CUJiAmax.js.map} +1 -1
  166. package/dashboard/dist/assets/{ToolPill-BRZWo4l8.js → ToolPill-D40uLM_v.js} +2 -2
  167. package/dashboard/dist/assets/{ToolPill-BRZWo4l8.js.map → ToolPill-D40uLM_v.js.map} +1 -1
  168. package/dashboard/dist/assets/{ToolTestPanel-kvqZqM0A.js → ToolTestPanel-Ch5nQANh.js} +2 -2
  169. package/dashboard/dist/assets/{ToolTestPanel-kvqZqM0A.js.map → ToolTestPanel-Ch5nQANh.js.map} +1 -1
  170. package/dashboard/dist/assets/{TopicDetailPage-CjkAAyy8.js → TopicDetailPage-BprToO7w.js} +2 -2
  171. package/dashboard/dist/assets/{TopicDetailPage-CjkAAyy8.js.map → TopicDetailPage-BprToO7w.js.map} +1 -1
  172. package/dashboard/dist/assets/{TopicsPage-CJZnv50y.js → TopicsPage-8SmCnQ-E.js} +2 -2
  173. package/dashboard/dist/assets/{TopicsPage-CJZnv50y.js.map → TopicsPage-8SmCnQ-E.js.map} +1 -1
  174. package/dashboard/dist/assets/{UserName-CPJPZnN1.js → UserName-BkJryunF.js} +2 -2
  175. package/dashboard/dist/assets/{UserName-CPJPZnN1.js.map → UserName-BkJryunF.js.map} +1 -1
  176. package/dashboard/dist/assets/{WorkflowExecutionPage-46UV5pJd.js → WorkflowExecutionPage-B2S5ODie.js} +2 -2
  177. package/dashboard/dist/assets/{WorkflowExecutionPage-46UV5pJd.js.map → WorkflowExecutionPage-B2S5ODie.js.map} +1 -1
  178. package/dashboard/dist/assets/{WorkflowPill-Cly9Ln_3.js → WorkflowPill-DJLcK_CM.js} +2 -2
  179. package/dashboard/dist/assets/{WorkflowPill-Cly9Ln_3.js.map → WorkflowPill-DJLcK_CM.js.map} +1 -1
  180. package/dashboard/dist/assets/{WorkflowsDashboard-DtxYdQbQ.js → WorkflowsDashboard-CABuRCXp.js} +2 -2
  181. package/dashboard/dist/assets/{WorkflowsDashboard-DtxYdQbQ.js.map → WorkflowsDashboard-CABuRCXp.js.map} +1 -1
  182. package/dashboard/dist/assets/{WorkflowsOverview-Cg4LSfck.js → WorkflowsOverview-BPUHAj8T.js} +2 -2
  183. package/dashboard/dist/assets/{WorkflowsOverview-Cg4LSfck.js.map → WorkflowsOverview-BPUHAj8T.js.map} +1 -1
  184. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Del-RCgi.js → YamlWorkflowDetailPage-DZGjT-Tl.js} +2 -2
  185. package/dashboard/dist/assets/{YamlWorkflowDetailPage-Del-RCgi.js.map → YamlWorkflowDetailPage-DZGjT-Tl.js.map} +1 -1
  186. package/dashboard/dist/assets/{YamlWorkflowsPage-BF6Jtx24.js → YamlWorkflowsPage-DIxHURlM.js} +2 -2
  187. package/dashboard/dist/assets/{YamlWorkflowsPage-BF6Jtx24.js.map → YamlWorkflowsPage-DIxHURlM.js.map} +1 -1
  188. package/dashboard/dist/assets/{agents-wL-3dMOX.js → agents-BnDp2rcb.js} +2 -2
  189. package/dashboard/dist/assets/{agents-wL-3dMOX.js.map → agents-BnDp2rcb.js.map} +1 -1
  190. package/dashboard/dist/assets/{bots-D72EsztP.js → bots-maURYoyr.js} +2 -2
  191. package/dashboard/dist/assets/{bots-D72EsztP.js.map → bots-maURYoyr.js.map} +1 -1
  192. package/dashboard/dist/assets/{capabilities-DXFo6bRb.js → capabilities-5-TakMUh.js} +2 -2
  193. package/dashboard/dist/assets/{capabilities-DXFo6bRb.js.map → capabilities-5-TakMUh.js.map} +1 -1
  194. package/dashboard/dist/assets/{controlplane-gQdOgVtH.js → controlplane-BXVVTWoh.js} +2 -2
  195. package/dashboard/dist/assets/{controlplane-gQdOgVtH.js.map → controlplane-BXVVTWoh.js.map} +1 -1
  196. package/dashboard/dist/assets/escalation-columns-v8gx8wFb.js +2 -0
  197. package/dashboard/dist/assets/{escalation-columns-CSE5wfWQ.js.map → escalation-columns-v8gx8wFb.js.map} +1 -1
  198. package/dashboard/dist/assets/escalation-items-OWntjDaH.js +2 -0
  199. package/dashboard/dist/assets/escalation-items-OWntjDaH.js.map +1 -0
  200. package/dashboard/dist/assets/{index-Btm8FtTQ.js → index-BIfY4mR2.js} +2 -2
  201. package/dashboard/dist/assets/{index-Btm8FtTQ.js.map → index-BIfY4mR2.js.map} +1 -1
  202. package/dashboard/dist/assets/{index-h1Useskt.js → index-BTm3-qwq.js} +2 -2
  203. package/dashboard/dist/assets/{index-h1Useskt.js.map → index-BTm3-qwq.js.map} +1 -1
  204. package/dashboard/dist/assets/{index-Cu0xdX2t.js → index-CR9rhAvN.js} +2 -2
  205. package/dashboard/dist/assets/{index-Cu0xdX2t.js.map → index-CR9rhAvN.js.map} +1 -1
  206. package/dashboard/dist/assets/index-CWKs10VQ.js +13 -0
  207. package/dashboard/dist/assets/{index-D1lfq5iZ.js.map → index-CWKs10VQ.js.map} +1 -1
  208. package/dashboard/dist/assets/index-CvKegIVe.js +3 -0
  209. package/dashboard/dist/assets/index-CvKegIVe.js.map +1 -0
  210. package/dashboard/dist/assets/{index-BaCDL5fh.js → index-D7peGNN0.js} +27 -27
  211. package/dashboard/dist/assets/index-D7peGNN0.js.map +1 -0
  212. package/dashboard/dist/assets/{index-CptTEhWp.js → index-D_ojXTgO.js} +2 -2
  213. package/dashboard/dist/assets/{index-CptTEhWp.js.map → index-D_ojXTgO.js.map} +1 -1
  214. package/dashboard/dist/assets/index-Dafrbwk_.js +2 -0
  215. package/dashboard/dist/assets/{index-BvH8T-jb.js.map → index-Dafrbwk_.js.map} +1 -1
  216. package/dashboard/dist/assets/{index-czgLyfSo.js → index-Dk7nwVpm.js} +2 -2
  217. package/dashboard/dist/assets/{index-czgLyfSo.js.map → index-Dk7nwVpm.js.map} +1 -1
  218. package/dashboard/dist/assets/{index-CDxOQ84B.js → index-DvkcyTE2.js} +2 -2
  219. package/dashboard/dist/assets/{index-CDxOQ84B.js.map → index-DvkcyTE2.js.map} +1 -1
  220. package/dashboard/dist/assets/{index-C1iuZ4Q5.js → index-WPVpyoD3.js} +2 -2
  221. package/dashboard/dist/assets/{index-C1iuZ4Q5.js.map → index-WPVpyoD3.js.map} +1 -1
  222. package/dashboard/dist/assets/{index-C-QQ5rKF.js → index-YGTGxcTF.js} +2 -2
  223. package/dashboard/dist/assets/{index-C-QQ5rKF.js.map → index-YGTGxcTF.js.map} +1 -1
  224. package/dashboard/dist/assets/{index-ujGmmwl6.js → index-vgHzaGmW.js} +2 -2
  225. package/dashboard/dist/assets/{index-ujGmmwl6.js.map → index-vgHzaGmW.js.map} +1 -1
  226. package/dashboard/dist/assets/{knowledge-150lsM68.js → knowledge-L_zY1zmy.js} +2 -2
  227. package/dashboard/dist/assets/{knowledge-150lsM68.js.map → knowledge-L_zY1zmy.js.map} +1 -1
  228. package/dashboard/dist/assets/{mcp-query-CDsSMaYq.js → mcp-query-CFbGudkb.js} +2 -2
  229. package/dashboard/dist/assets/{mcp-query-CDsSMaYq.js.map → mcp-query-CFbGudkb.js.map} +1 -1
  230. package/dashboard/dist/assets/{mcp-CRtY4v5W.js → mcp-wCWFRA0T.js} +2 -2
  231. package/dashboard/dist/assets/{mcp-CRtY4v5W.js.map → mcp-wCWFRA0T.js.map} +1 -1
  232. package/dashboard/dist/assets/{personas-C2Wm4ng1.js → personas-B_VIacZJ.js} +2 -2
  233. package/dashboard/dist/assets/{personas-C2Wm4ng1.js.map → personas-B_VIacZJ.js.map} +1 -1
  234. package/dashboard/dist/assets/{pipelines-BH0F9-jf.js → pipelines-Bv0Z8xQA.js} +2 -2
  235. package/dashboard/dist/assets/{pipelines-BH0F9-jf.js.map → pipelines-Bv0Z8xQA.js.map} +1 -1
  236. package/dashboard/dist/assets/{tasks-BkUVpaOa.js → tasks-DP6yaNZs.js} +2 -2
  237. package/dashboard/dist/assets/{tasks-BkUVpaOa.js.map → tasks-DP6yaNZs.js.map} +1 -1
  238. package/dashboard/dist/assets/{topics-Crl8HKHq.js → topics-UBSIcpSR.js} +2 -2
  239. package/dashboard/dist/assets/{topics-Crl8HKHq.js.map → topics-UBSIcpSR.js.map} +1 -1
  240. package/dashboard/dist/assets/{useDebouncedValue-Dk3r5xo-.js → useDebouncedValue-R62q3Xpx.js} +2 -2
  241. package/dashboard/dist/assets/{useDebouncedValue-Dk3r5xo-.js.map → useDebouncedValue-R62q3Xpx.js.map} +1 -1
  242. package/dashboard/dist/assets/{useNamespace-BXuyHKAs.js → useNamespace-CAaszJDE.js} +2 -2
  243. package/dashboard/dist/assets/{useNamespace-BXuyHKAs.js.map → useNamespace-CAaszJDE.js.map} +1 -1
  244. package/dashboard/dist/assets/{useYamlActivityEvents-DSlkjQfb.js → useYamlActivityEvents-emCp9U69.js} +2 -2
  245. package/dashboard/dist/assets/{useYamlActivityEvents-DSlkjQfb.js.map → useYamlActivityEvents-emCp9U69.js.map} +1 -1
  246. package/dashboard/dist/assets/validate-C7yskdEn.js +2 -0
  247. package/dashboard/dist/assets/validate-C7yskdEn.js.map +1 -0
  248. package/dashboard/dist/assets/{vendor-icons-C_DQEeBy.js → vendor-icons-DUYcKTjP.js} +2 -2
  249. package/dashboard/dist/assets/{vendor-icons-C_DQEeBy.js.map → vendor-icons-DUYcKTjP.js.map} +1 -1
  250. package/dashboard/dist/assets/{yaml-workflows-B230v5Za.js → yaml-workflows-C2sOwz1p.js} +2 -2
  251. package/dashboard/dist/assets/{yaml-workflows-B230v5Za.js.map → yaml-workflows-C2sOwz1p.js.map} +1 -1
  252. package/dashboard/dist/index.html +2 -2
  253. package/docs/accumulator.md +1 -1
  254. package/docs/api/http/escalations.md +33 -0
  255. package/docs/api/sdk/escalations.md +26 -1
  256. package/docs/code-owned-configuration.md +2 -2
  257. package/docs/domain-dictionary.md +19 -3
  258. package/docs/faceted-routing.md +4 -3
  259. package/docs/hitl/escalation.md +9 -0
  260. package/docs/hitl/x-lt-display.md +1 -1
  261. package/docs/hitl/x-lt-embed.md +2 -0
  262. package/docs/hitl/x-lt-roster.md +32 -8
  263. package/docs/scan-codes.md +45 -3
  264. package/package.json +2 -2
  265. package/dashboard/dist/assets/AvailableEscalationsPage-D1mCqj8Z.js +0 -2
  266. package/dashboard/dist/assets/EscalationTimeline-D6jrDcBb.js +0 -2
  267. package/dashboard/dist/assets/FormattedValue-CUtv1g3k.js +0 -2
  268. package/dashboard/dist/assets/FormattedValue-CUtv1g3k.js.map +0 -1
  269. package/dashboard/dist/assets/OperatorDashboard-BoeZIyup.js +0 -2
  270. package/dashboard/dist/assets/PortalPage-DjfjerpF.js +0 -2
  271. package/dashboard/dist/assets/ResolverForm-Bl8Pibyz.js +0 -8
  272. package/dashboard/dist/assets/ResolverForm-Bl8Pibyz.js.map +0 -1
  273. package/dashboard/dist/assets/ScanStationPage-BiO34nov.js +0 -2
  274. package/dashboard/dist/assets/ScanStationPage-BiO34nov.js.map +0 -1
  275. package/dashboard/dist/assets/escalation-columns-CSE5wfWQ.js +0 -2
  276. package/dashboard/dist/assets/escalation-items-BIgBWbaw.js +0 -2
  277. package/dashboard/dist/assets/escalation-items-BIgBWbaw.js.map +0 -1
  278. package/dashboard/dist/assets/index-BaCDL5fh.js.map +0 -1
  279. package/dashboard/dist/assets/index-BvH8T-jb.js +0 -2
  280. package/dashboard/dist/assets/index-CED9cLE2.js +0 -3
  281. package/dashboard/dist/assets/index-CED9cLE2.js.map +0 -1
  282. package/dashboard/dist/assets/index-D1lfq5iZ.js +0 -13
@@ -0,0 +1,19 @@
1
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
2
+ /** True when the row's wait declared `wakeOnFlag` (stored on its envelope at creation). */
3
+ export declare function wakesOnFlag(envelope: unknown): boolean;
4
+ /**
5
+ * Flag one pending key of a batch escalation (for example, `Missing`). The
6
+ * key stays pending and still fills. When the row's wait declared
7
+ * `wakeOnFlag`, the flag ends the wait and the row records its resolver.
8
+ */
9
+ export declare function flagBatchItem(input: {
10
+ id: string;
11
+ itemKey: string;
12
+ label: string;
13
+ payload?: Record<string, any>;
14
+ }, auth: LTApiAuth): Promise<LTApiResult>;
15
+ /** Clear one key's flag while the row is pending. */
16
+ export declare function unflagBatchItem(input: {
17
+ id: string;
18
+ itemKey: string;
19
+ }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,138 @@
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.wakesOnFlag = wakesOnFlag;
37
+ exports.flagBatchItem = flagBatchItem;
38
+ exports.unflagBatchItem = unflagBatchItem;
39
+ const escalationService = __importStar(require("../../services/escalation"));
40
+ const escalation_1 = require("../../types/escalation");
41
+ const helpers_1 = require("./helpers");
42
+ const resolve_1 = require("./resolve");
43
+ const LABEL_MAX = 128;
44
+ /** True when the row's wait declared `wakeOnFlag` (stored on its envelope at creation). */
45
+ function wakesOnFlag(envelope) {
46
+ let parsed = envelope;
47
+ if (typeof envelope === 'string') {
48
+ try {
49
+ parsed = JSON.parse(envelope);
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ return !!parsed && typeof parsed === 'object'
56
+ && parsed[escalation_1.ESCALATION_BATCH_KEYS.WAKE_ON_FLAG] === true;
57
+ }
58
+ /** Read and write gates shared by flag and unflag: 404 for a row the caller cannot see, 403 for one they cannot act on. */
59
+ async function loadWritable(id, auth) {
60
+ const row = await escalationService.getEscalation(id);
61
+ if (!row || (await (0, helpers_1.assertReadAccess)(auth.userId, row)))
62
+ return { status: 404, error: 'Escalation not found' };
63
+ const denied = await (0, helpers_1.assertWriteAccess)(auth.userId, row);
64
+ if (denied)
65
+ return denied;
66
+ return { row };
67
+ }
68
+ /**
69
+ * Flag one pending key of a batch escalation (for example, `Missing`). The
70
+ * key stays pending and still fills. When the row's wait declared
71
+ * `wakeOnFlag`, the flag ends the wait and the row records its resolver.
72
+ */
73
+ async function flagBatchItem(input, auth) {
74
+ try {
75
+ const { id, itemKey, label, payload } = input;
76
+ if (!itemKey || typeof itemKey !== 'string')
77
+ return { status: 400, error: 'itemKey is required' };
78
+ if (!label || typeof label !== 'string' || label.length > LABEL_MAX) {
79
+ return { status: 400, error: `label is required (at most ${LABEL_MAX} characters)` };
80
+ }
81
+ if (payload !== undefined && (!payload || typeof payload !== 'object' || Array.isArray(payload))) {
82
+ return { status: 400, error: 'payload must be an object' };
83
+ }
84
+ const gate = await loadWritable(id, auth);
85
+ if (!('row' in gate))
86
+ return gate;
87
+ const wakes = wakesOnFlag(gate.row.envelope);
88
+ const result = await escalationService.flagBatchItem(id, itemKey, {
89
+ label,
90
+ ...(payload ? { payload } : {}),
91
+ actor: auth.userId,
92
+ ...(wakes ? { metadata: { resolved_by: auth.userId }, resolvedBy: await (0, resolve_1.resolverIdentity)(auth) } : {}),
93
+ });
94
+ return flagResult(result.outcome, itemKey, id, gate.row.workflow_id);
95
+ }
96
+ catch (err) {
97
+ return { status: 500, error: err.message };
98
+ }
99
+ }
100
+ /** Clear one key's flag while the row is pending. */
101
+ async function unflagBatchItem(input, auth) {
102
+ try {
103
+ const { id, itemKey } = input;
104
+ if (!itemKey || typeof itemKey !== 'string')
105
+ return { status: 400, error: 'itemKey is required' };
106
+ const gate = await loadWritable(id, auth);
107
+ if (!('row' in gate))
108
+ return gate;
109
+ const result = await escalationService.unflagBatchItem(id, itemKey);
110
+ return flagResult(result.outcome, itemKey, id, gate.row.workflow_id);
111
+ }
112
+ catch (err) {
113
+ return { status: 500, error: err.message };
114
+ }
115
+ }
116
+ /** Maps the flag outcome vocabulary onto HTTP results. */
117
+ function flagResult(outcome, itemKey, id, workflowId) {
118
+ const refuse = (status, error) => ({ status, error, data: { error, outcome, itemKey } });
119
+ switch (outcome) {
120
+ case 'flagged':
121
+ case 'unflagged':
122
+ return { status: 200, data: { outcome, itemKey, escalationId: id } };
123
+ case 'completed':
124
+ return { status: 200, data: { outcome, itemKey, escalationId: id, workflowId } };
125
+ case 'not-found':
126
+ return refuse(404, 'Escalation not found');
127
+ case 'not-batch':
128
+ return refuse(400, 'Escalation is not a batch');
129
+ case 'unknown-item':
130
+ return refuse(400, 'itemKey is not in the declared batch');
131
+ case 'already-filled':
132
+ return refuse(409, 'This item is already in');
133
+ case 'not-flagged':
134
+ return refuse(409, 'This item has no flag');
135
+ default:
136
+ return refuse(409, 'Escalation is no longer pending');
137
+ }
138
+ }
@@ -6,6 +6,8 @@ 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
8
  export { resolveBatchItem, resolveBatchItemBySignalKey, resolveBatchItemByMetadata } from './resolve-batch';
9
+ export { flagBatchItem, unflagBatchItem } from './batch-flag';
10
+ export { runRosterAction, ROSTER_ACTION_OUTCOMES } from './roster-action';
9
11
  export { accumulateItem, accumulateItemBySignalKey, accumulateItemByMetadata, removeItem, removeItemBySignalKey, removeItemByMetadata, getEscalationItems, getEscalationItemsBySignalKey, itemsView, } from './accumulate';
10
12
  export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
11
13
  export { cancelSingleEscalation, bulkCancel } from './cancel';
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getRelatedRows = exports.getRelatedAggregates = exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = 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.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
3
+ exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.ROSTER_ACTION_OUTCOMES = exports.runRosterAction = exports.unflagBatchItem = exports.flagBatchItem = 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.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
4
+ exports.getRelatedRows = exports.getRelatedAggregates = exports.timelineByFacet = void 0;
4
5
  var create_1 = require("./create");
5
6
  Object.defineProperty(exports, "createEscalation", { enumerable: true, get: function () { return create_1.createEscalation; } });
6
7
  var list_1 = require("./list");
@@ -37,6 +38,12 @@ var resolve_batch_1 = require("./resolve-batch");
37
38
  Object.defineProperty(exports, "resolveBatchItem", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItem; } });
38
39
  Object.defineProperty(exports, "resolveBatchItemBySignalKey", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemBySignalKey; } });
39
40
  Object.defineProperty(exports, "resolveBatchItemByMetadata", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemByMetadata; } });
41
+ var batch_flag_1 = require("./batch-flag");
42
+ Object.defineProperty(exports, "flagBatchItem", { enumerable: true, get: function () { return batch_flag_1.flagBatchItem; } });
43
+ Object.defineProperty(exports, "unflagBatchItem", { enumerable: true, get: function () { return batch_flag_1.unflagBatchItem; } });
44
+ var roster_action_1 = require("./roster-action");
45
+ Object.defineProperty(exports, "runRosterAction", { enumerable: true, get: function () { return roster_action_1.runRosterAction; } });
46
+ Object.defineProperty(exports, "ROSTER_ACTION_OUTCOMES", { enumerable: true, get: function () { return roster_action_1.ROSTER_ACTION_OUTCOMES; } });
40
47
  var accumulate_1 = require("./accumulate");
41
48
  Object.defineProperty(exports, "accumulateItem", { enumerable: true, get: function () { return accumulate_1.accumulateItem; } });
42
49
  Object.defineProperty(exports, "accumulateItemBySignalKey", { enumerable: true, get: function () { return accumulate_1.accumulateItemBySignalKey; } });
@@ -0,0 +1,37 @@
1
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
2
+ /** Outcomes a roster action answers with besides the act's own result. */
3
+ export declare const ROSTER_ACTION_OUTCOMES: {
4
+ /** The action is limited to roles the person acting does not hold, and no badge rode the request. */
5
+ readonly NEEDS_BADGE: "needs_badge";
6
+ /** A badge rode the request, and its person does not hold the action's roles. */
7
+ readonly ROLE_REFUSED: "role_refused";
8
+ /** The badge expired or was spent; scan it again. */
9
+ readonly NOT_PRIMED: "not_primed";
10
+ };
11
+ export interface RosterActionInput {
12
+ /** The host row: the escalation whose form declares the roster. */
13
+ id: string;
14
+ /** The roster field. */
15
+ field: string;
16
+ /** The action's index among the field's actions. */
17
+ action: number;
18
+ /** The entry's key. */
19
+ entry: string;
20
+ /** A key-in's entered code. */
21
+ code?: string;
22
+ /** A badge grant: the act runs as its person. */
23
+ actingToken?: string;
24
+ }
25
+ /**
26
+ * Run one action a roster entry offers. The request is a pointer (field,
27
+ * action index, entry key) and never authority: the action is re-read from
28
+ * the host row's pinned form schema, the entry must be on the roster the
29
+ * server computes, the payload is built here from the declaration, and a
30
+ * role limit is checked against the person acting. The act then runs
31
+ * through the endpoint it names (resolve, batch fill, flag, unflag) under
32
+ * that person's own RBAC and `enforce_schema`.
33
+ *
34
+ * A badge is read first and spent only once the act is about to run; an
35
+ * act that does not land returns the use.
36
+ */
37
+ export declare function runRosterAction(input: RosterActionInput, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,179 @@
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.ROSTER_ACTION_OUTCOMES = void 0;
37
+ exports.runRosterAction = runRosterAction;
38
+ const escalationService = __importStar(require("../../services/escalation"));
39
+ const userService = __importStar(require("../../services/user"));
40
+ const roster_1 = require("../../services/escalation/roster");
41
+ const acting_identity_1 = require("../../services/iam/acting-identity");
42
+ const form_validation_1 = require("../../shared/form-validation");
43
+ const batch_flag_1 = require("./batch-flag");
44
+ const helpers_1 = require("./helpers");
45
+ const resolve_1 = require("./resolve");
46
+ const resolve_batch_1 = require("./resolve-batch");
47
+ /** Outcomes a roster action answers with besides the act's own result. */
48
+ exports.ROSTER_ACTION_OUTCOMES = {
49
+ /** The action is limited to roles the person acting does not hold, and no badge rode the request. */
50
+ NEEDS_BADGE: 'needs_badge',
51
+ /** A badge rode the request, and its person does not hold the action's roles. */
52
+ ROLE_REFUSED: 'role_refused',
53
+ /** The badge expired or was spent; scan it again. */
54
+ NOT_PRIMED: 'not_primed',
55
+ };
56
+ /** The roster's context on the server: the host row's own domains. */
57
+ function hostContext(row) {
58
+ const { escalation, metadata, envelope, payload } = (0, form_validation_1.rosterRowContext)(row);
59
+ return { escalation, metadata, envelope, payload };
60
+ }
61
+ /**
62
+ * Run one action a roster entry offers. The request is a pointer (field,
63
+ * action index, entry key) and never authority: the action is re-read from
64
+ * the host row's pinned form schema, the entry must be on the roster the
65
+ * server computes, the payload is built here from the declaration, and a
66
+ * role limit is checked against the person acting. The act then runs
67
+ * through the endpoint it names (resolve, batch fill, flag, unflag) under
68
+ * that person's own RBAC and `enforce_schema`.
69
+ *
70
+ * A badge is read first and spent only once the act is about to run; an
71
+ * act that does not land returns the use.
72
+ */
73
+ async function runRosterAction(input, auth) {
74
+ try {
75
+ if (!input?.id || typeof input.field !== 'string' || !Number.isInteger(input.action)
76
+ || typeof input.entry !== 'string' || !input.entry) {
77
+ return { status: 400, error: 'id, field, action and entry are required' };
78
+ }
79
+ // 1. The host row and its form, as the page that offered the action read them
80
+ const detail = await escalationService.getEscalationWithFormSchema(input.id);
81
+ if (!detail || (await (0, helpers_1.assertReadAccess)(auth.userId, detail.escalation))) {
82
+ return { status: 404, error: 'Escalation not found' };
83
+ }
84
+ const host = detail.escalation;
85
+ const embedded = host.metadata?.form_schema;
86
+ const schema = (embedded && typeof embedded === 'object' ? embedded : detail.form_schema);
87
+ const fieldSchema = schema?.properties?.[input.field];
88
+ const def = (0, form_validation_1.readRosterDef)(fieldSchema);
89
+ const action = (0, form_validation_1.readRosterActions)(fieldSchema)[input.action];
90
+ if (!def || !action)
91
+ return { status: 409, error: 'This action is no longer offered' };
92
+ // 2. The entry, on the roster the server computes
93
+ const ctx = hostContext(host);
94
+ const roster = await (0, roster_1.loadRoster)(def, ctx);
95
+ const entry = roster.entries.find((e) => e.key === input.entry);
96
+ const kind = (0, form_validation_1.rosterActionKind)(action);
97
+ const batch = 'batch' in def.expected;
98
+ if (!entry || (kind === form_validation_1.ROSTER_ACTION_KINDS.RESOLVE ? !entry.row : !batch)) {
99
+ return { status: 409, error: 'This entry no longer offers that action' };
100
+ }
101
+ if (kind === form_validation_1.ROSTER_ACTION_KINDS.FILL && action.fill?.enterCode
102
+ && !(0, form_validation_1.enteredCodeMatches)(String(input.code ?? ''), entry.key, def.countedBy)) {
103
+ const error = `That code is not ${(0, form_validation_1.printedKeyCode)(entry.key, def.countedBy)}.`;
104
+ return { status: 422, error, data: { error, outcome: 'code_mismatch' } };
105
+ }
106
+ // 3. The person acting: the badge's person when one rides the request, read without spending it
107
+ let actor = auth;
108
+ if (input.actingToken) {
109
+ const peeked = await (0, acting_identity_1.peekActingAuth)(input.actingToken);
110
+ if (!peeked.ok)
111
+ return refusal(401, exports.ROSTER_ACTION_OUTCOMES.NOT_PRIMED, peeked.error);
112
+ actor = peeked.auth;
113
+ }
114
+ if (!(await holdsRole(action, actor.userId))) {
115
+ return input.actingToken
116
+ ? refusal(403, exports.ROSTER_ACTION_OUTCOMES.ROLE_REFUSED, (0, form_validation_1.actionRefusal)(action))
117
+ : refusal(403, exports.ROSTER_ACTION_OUTCOMES.NEEDS_BADGE, (0, form_validation_1.actionRefusal)(action));
118
+ }
119
+ // 4. Spend the badge, run the act, and return the use when it does not land
120
+ let remaining;
121
+ if (input.actingToken) {
122
+ const spent = await (0, acting_identity_1.consumeActingGrant)(input.actingToken);
123
+ if (!spent.ok)
124
+ return refusal(401, exports.ROSTER_ACTION_OUTCOMES.NOT_PRIMED, spent.error);
125
+ remaining = spent.grant.remaining;
126
+ }
127
+ const result = await runAct(kind, action, entry, host.id, ctx, input.code, actor);
128
+ if (input.actingToken && result.status >= 300) {
129
+ await (0, acting_identity_1.refundActingGrant)(input.actingToken, false);
130
+ return result;
131
+ }
132
+ if (input.actingToken && result.data && typeof result.data === 'object') {
133
+ result.data = { ...result.data, acting: { remaining } };
134
+ }
135
+ return result;
136
+ }
137
+ catch (err) {
138
+ return { status: 500, error: err.message };
139
+ }
140
+ }
141
+ async function holdsRole(action, userId) {
142
+ if (!action.roles?.length)
143
+ return true;
144
+ const [roles, superadmin] = await Promise.all([
145
+ userService.getUserRoles(userId),
146
+ userService.isSuperAdmin(userId),
147
+ ]);
148
+ return (0, form_validation_1.holdsActionRole)(action, roles.map((r) => r.role), superadmin);
149
+ }
150
+ function runAct(kind, action, entry, hostId, ctx, code, actor) {
151
+ switch (kind) {
152
+ case form_validation_1.ROSTER_ACTION_KINDS.RESOLVE:
153
+ return (0, resolve_1.resolveEscalation)({
154
+ id: String(entry.row.escalation.id),
155
+ resolverPayload: (0, form_validation_1.interpolatePayload)(action.resolverPayload, entry.row),
156
+ }, actor);
157
+ case form_validation_1.ROSTER_ACTION_KINDS.FILL:
158
+ return (0, resolve_batch_1.resolveBatchItem)({
159
+ id: hostId,
160
+ itemKey: entry.key,
161
+ resolverPayload: {
162
+ ...(0, form_validation_1.interpolatePayload)(action.fill?.payload ?? {}, ctx),
163
+ ...(action.fill?.enterCode ? { [form_validation_1.ENTERED_CODE_KEY]: String(code).trim() } : {}),
164
+ },
165
+ }, actor);
166
+ case form_validation_1.ROSTER_ACTION_KINDS.FLAG:
167
+ return (0, batch_flag_1.flagBatchItem)({
168
+ id: hostId,
169
+ itemKey: entry.key,
170
+ label: action.flag.label,
171
+ ...(action.flag.payload ? { payload: (0, form_validation_1.interpolatePayload)(action.flag.payload, ctx) } : {}),
172
+ }, actor);
173
+ default:
174
+ return (0, batch_flag_1.unflagBatchItem)({ id: hostId, itemKey: entry.key }, actor);
175
+ }
176
+ }
177
+ function refusal(status, outcome, error) {
178
+ return { status, error, data: { error, outcome } };
179
+ }
@@ -0,0 +1,3 @@
1
+ import type { ScanChoice } from '../../types';
2
+ /** True when the person may run the choice: it names no roles, or they hold one (superadmin always). */
3
+ export declare function holdsChoiceRole(choice: Pick<ScanChoice, 'roles'>, userId: string): Promise<boolean>;
@@ -0,0 +1,48 @@
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.holdsChoiceRole = holdsChoiceRole;
37
+ const userService = __importStar(require("../../services/user"));
38
+ const x_lt_actions_1 = require("../../shared/form-validation/x-lt-actions");
39
+ /** True when the person may run the choice: it names no roles, or they hold one (superadmin always). */
40
+ async function holdsChoiceRole(choice, userId) {
41
+ if (!choice.roles?.length)
42
+ return true;
43
+ const [roles, superadmin] = await Promise.all([
44
+ userService.getUserRoles(userId),
45
+ userService.isSuperAdmin(userId),
46
+ ]);
47
+ return (0, x_lt_actions_1.holdsActionRole)(choice, roles.map((r) => r.role), superadmin);
48
+ }
@@ -41,6 +41,8 @@ const identity_1 = require("./identity");
41
41
  const grant_1 = require("./grant");
42
42
  const helpers_1 = require("../escalations/helpers");
43
43
  const context_1 = require("./context");
44
+ const choice_roles_1 = require("./choice-roles");
45
+ const x_lt_actions_1 = require("../../shared/form-validation/x-lt-actions");
44
46
  const locate_1 = require("./locate");
45
47
  const verbs_1 = require("./verbs");
46
48
  /**
@@ -85,6 +87,12 @@ async function executeScanChoice(input, auth) {
85
87
  effectiveAuth = peeked.auth;
86
88
  grant = peeked.grant;
87
89
  }
90
+ // 2b. A choice limited to roles runs only for a person holding one: with
91
+ // no badge it parks for one, and a badge without the role is refused
92
+ // without spending it.
93
+ if (choice.roles?.length && !(await (0, choice_roles_1.holdsChoiceRole)(choice, effectiveAuth.userId))) {
94
+ return stampPointer(grant ? (0, context_1.refused)((0, x_lt_actions_1.actionRefusal)(choice)) : (0, context_1.notPrimed)({ rule }, (0, x_lt_actions_1.actionRefusal)(choice)), rule, input);
95
+ }
88
96
  // 3. With no live grant, a choice that needs a badge parks for the next
89
97
  // badge scan before any row is read, whatever the station may read.
90
98
  if (!grant && choice.requireActingIdentity
@@ -0,0 +1,15 @@
1
+ import { type LTEscalationRecord, type ScanFillParams, type ScanScheme } from '../../types';
2
+ /** How a batch entry reads: its label from the row's per-key map, or its code. */
3
+ export type EntryLabeler = (key: string, code: string) => string;
4
+ /** The code as the package prints it on a GTIN scheme, as scanned otherwise. */
5
+ export declare function printedCode(code: string, scheme: ScanScheme): string;
6
+ /**
7
+ * The labeler a fill step declares, or null without `labels`. The map is
8
+ * read from the batch row (`envelope.<map>` or `metadata.<map>`) and keyed by
9
+ * batch key. With a `label` template, `{label.<path>}` reads the entry's map
10
+ * value and `{code}` its printed code; without one, a text value is the
11
+ * label. An entry the map does not name reads as its code.
12
+ */
13
+ export declare function entryLabeler(fill: ScanFillParams, row: LTEscalationRecord, scheme: ScanScheme): EntryLabeler | null;
14
+ /** Each open entry's label, in batch order, one per distinct label. */
15
+ export declare function pendingLabels(pending: string[], codeOf: (key: string) => string, label: EntryLabeler): string[];
@@ -0,0 +1,99 @@
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.printedCode = printedCode;
37
+ exports.entryLabeler = entryLabeler;
38
+ exports.pendingLabels = pendingLabels;
39
+ const scanCodeService = __importStar(require("../../services/scan-code"));
40
+ const ctx_path_1 = require("../../shared/form-validation/ctx-path");
41
+ const x_lt_bind_1 = require("../../shared/form-validation/x-lt-bind");
42
+ const types_1 = require("../../types");
43
+ const LABEL_TOKEN = /\{label\.([^}]+)\}/g;
44
+ const CODE_TOKEN = '{code}';
45
+ function isRecord(v) {
46
+ return !!v && typeof v === 'object' && !Array.isArray(v);
47
+ }
48
+ /** A JSON column as an object: the row's envelope arrives as text. */
49
+ function asObject(v) {
50
+ if (isRecord(v))
51
+ return v;
52
+ if (typeof v !== 'string' || !v)
53
+ return null;
54
+ try {
55
+ const parsed = JSON.parse(v);
56
+ return isRecord(parsed) ? parsed : null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /** The code as the package prints it on a GTIN scheme, as scanned otherwise. */
63
+ function printedCode(code, scheme) {
64
+ return scheme.encoding === types_1.SCAN_ENCODINGS.GTIN ? scanCodeService.displayGtin(code) : code;
65
+ }
66
+ /**
67
+ * The labeler a fill step declares, or null without `labels`. The map is
68
+ * read from the batch row (`envelope.<map>` or `metadata.<map>`) and keyed by
69
+ * batch key. With a `label` template, `{label.<path>}` reads the entry's map
70
+ * value and `{code}` its printed code; without one, a text value is the
71
+ * label. An entry the map does not name reads as its code.
72
+ */
73
+ function entryLabeler(fill, row, scheme) {
74
+ if (!fill.labels)
75
+ return null;
76
+ const map = (0, ctx_path_1.resolveCtxPath)(fill.labels, { envelope: asObject(row.envelope), metadata: asObject(row.metadata) });
77
+ const labels = isRecord(map) ? map : {};
78
+ return (key, code) => {
79
+ const printed = printedCode(code, scheme);
80
+ const value = labels[key];
81
+ if (value === undefined || value === null)
82
+ return printed;
83
+ if (fill.label) {
84
+ const text = fill.label
85
+ .split(CODE_TOKEN).join(printed)
86
+ .replace(LABEL_TOKEN, (_t, path) => {
87
+ const v = isRecord(value) ? (0, x_lt_bind_1.getDeep)(value, path) : undefined;
88
+ return v === undefined || v === null || typeof v === 'object' ? '' : String(v);
89
+ })
90
+ .trim();
91
+ return text || printed;
92
+ }
93
+ return typeof value === 'string' && value ? value : printed;
94
+ };
95
+ }
96
+ /** Each open entry's label, in batch order, one per distinct label. */
97
+ function pendingLabels(pending, codeOf, label) {
98
+ return [...new Set(pending.map((key) => label(key, codeOf(key))))];
99
+ }
@@ -78,6 +78,7 @@ async function heldSubject(step, ctx, row) {
78
78
  },
79
79
  } : {}),
80
80
  ...(claimant ? { claimedBy: claimant } : {}),
81
+ ...(hold.show ? { show: hold.show } : {}),
81
82
  };
82
83
  }
83
84
  /** The canonical code for the held row, as the station would scan it. */
@@ -37,6 +37,7 @@ exports.presentStep = presentStep;
37
37
  const scanCodeService = __importStar(require("../../services/scan-code"));
38
38
  const types_1 = require("../../types");
39
39
  const identity_1 = require("./identity");
40
+ const choice_roles_1 = require("./choice-roles");
40
41
  const locate_1 = require("./locate");
41
42
  const verbs_1 = require("./verbs");
42
43
  const context_1 = require("./context");
@@ -77,9 +78,12 @@ async function presentStep(step, ctx) {
77
78
  // configured — presenting a one-button screen would be a pointless tap. An
78
79
  // unsatisfied identity requirement still presents (the client's badge
79
80
  // stop-over), never a silent or misattributed execution.
81
+ // A choice limited to roles is withheld from a person without one of them,
82
+ // so the station asks for a badge of that role.
83
+ const roleHeld = await Promise.all((step.choices ?? []).map((choice) => (0, choice_roles_1.holdsChoiceRole)(choice, ctx.auth.userId)));
80
84
  const only = step.choices?.length === 1 ? step.choices[0] : undefined;
81
85
  const autoSelect = step.autoSelectSingle === true && only !== undefined && !only.confirm;
82
- if (autoSelect && (!only.requireActingIdentity || satisfied)) {
86
+ if (autoSelect && (!only.requireActingIdentity || satisfied) && roleHeld[0]) {
83
87
  return (0, verbs_1.dispatchChoiceVerb)({ query: step.query, verb: only.verb, params: only.params }, ctx, escalation);
84
88
  }
85
89
  const choices = (step.choices ?? []).map((choice, index) => ({
@@ -88,8 +92,9 @@ async function presentStep(step, ctx) {
88
92
  verb: choice.verb,
89
93
  ...(choice.confirm ? { confirm: choice.confirm } : {}),
90
94
  ...(choice.requireActingIdentity ? { requireActingIdentity: true } : {}),
95
+ ...(choice.roles?.length ? { roles: choice.roles } : {}),
91
96
  ...(choice.code ? { code: choice.code } : {}),
92
- withheld: !!choice.requireActingIdentity && !satisfied,
97
+ withheld: (!!choice.requireActingIdentity && !satisfied) || !roleHeld[index],
93
98
  }));
94
99
  return {
95
100
  status: 200,