@hotmeshio/long-tail 0.20.0 → 0.21.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 (351) hide show
  1. package/README.md +4 -4
  2. package/build/api/escalations/accumulate.d.ts +96 -0
  3. package/build/api/escalations/accumulate.js +516 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +10 -1
  6. package/build/api/roles.d.ts +4 -5
  7. package/build/api/roles.js +53 -4
  8. package/build/api/scan-codes/execute.js +2 -0
  9. package/build/api/scan-codes/verbs.d.ts +15 -0
  10. package/build/api/scan-codes/verbs.js +65 -0
  11. package/build/index.js +60 -0
  12. package/build/lib/db/schemas/036_role_portals.sql +12 -0
  13. package/build/routes/escalations/accumulate.d.ts +7 -0
  14. package/build/routes/escalations/accumulate.js +150 -0
  15. package/build/routes/escalations/index.js +5 -0
  16. package/build/sdk/index.d.ts +25 -0
  17. package/build/sdk/index.js +8 -0
  18. package/build/services/escalation/accumulate.d.ts +81 -0
  19. package/build/services/escalation/accumulate.js +154 -0
  20. package/build/services/escalation/index.d.ts +1 -0
  21. package/build/services/escalation/index.js +1 -0
  22. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  23. package/build/services/orchestrator/condition.d.ts +40 -3
  24. package/build/services/orchestrator/condition.js +42 -2
  25. package/build/services/role/index.js +1 -0
  26. package/build/services/role/seed.js +6 -1
  27. package/build/services/role/sql.d.ts +6 -3
  28. package/build/services/role/sql.js +7 -2
  29. package/build/services/role/types.d.ts +38 -10
  30. package/build/services/role/types.js +10 -1
  31. package/build/services/scan-code/validate.js +16 -0
  32. package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
  33. package/build/shared/form-validation/display-only-widgets.js +25 -0
  34. package/build/shared/form-validation/index.d.ts +2 -0
  35. package/build/shared/form-validation/index.js +2 -0
  36. package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
  37. package/build/shared/form-validation/x-lt-bind.js +12 -8
  38. package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
  39. package/build/shared/form-validation/x-lt-invoke.js +103 -0
  40. package/build/system/mcp-servers/admin/escalations.js +39 -0
  41. package/build/system/mcp-servers/admin/schemas.d.ts +192 -13
  42. package/build/system/mcp-servers/admin/schemas.js +39 -3
  43. package/build/system/mcp-servers/admin/users.js +1 -0
  44. package/build/system/mcp-servers/docs.js +4 -0
  45. package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
  46. package/build/system/mcp-servers/human-queue-schemas.js +19 -1
  47. package/build/system/mcp-servers/human-queue.d.ts +2 -0
  48. package/build/system/mcp-servers/human-queue.js +77 -0
  49. package/build/system/seed/tool-manifests-admin.d.ts +922 -103
  50. package/build/system/seed/tool-manifests-admin.js +4 -1
  51. package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
  52. package/build/system/seed/tool-manifests-escalation.js +56 -0
  53. package/build/tsconfig.tsbuildinfo +1 -1
  54. package/build/types/escalation.d.ts +52 -0
  55. package/build/types/escalation.js +29 -1
  56. package/build/types/index.d.ts +2 -2
  57. package/build/types/index.js +3 -1
  58. package/build/types/scan-code.d.ts +24 -0
  59. package/build/types/scan-code.js +9 -0
  60. package/build/types/startup.d.ts +20 -0
  61. package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js → AdminDashboard-uarpHB88.js} +2 -2
  62. package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
  63. package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js → AgentConfigPage-BcUaDD5E.js} +6 -6
  64. package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
  65. package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js → AgentDetailPage-BaZBhK6i.js} +3 -3
  66. package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
  67. package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
  68. package/dashboard/dist/assets/{AgentsPage-7JJBHku8.js.map → AgentsPage-CuVFSDc4.js.map} +1 -1
  69. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js +2 -0
  70. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js.map +1 -0
  71. package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js → BotPicker-CClMby6B.js} +2 -2
  72. package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js.map → BotPicker-CClMby6B.js.map} +1 -1
  73. package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
  74. package/dashboard/dist/assets/{BulkAssignModal-NJBcoj-f.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
  75. package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
  76. package/dashboard/dist/assets/{CapabilitiesPage-F8dpNn9B.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
  77. package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js → CollapsibleSection-ow8jpbtD.js} +2 -2
  78. package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
  79. package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
  80. package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
  81. package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js → CountdownTimer-CSqyZMCG.js} +2 -2
  82. package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
  83. package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js → CredentialsPage-Dx7SxA23.js} +2 -2
  84. package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
  85. package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js → CronLabel-LYPxpvNN.js} +2 -2
  86. package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js.map → CronLabel-LYPxpvNN.js.map} +1 -1
  87. package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
  88. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
  89. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
  90. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
  91. package/dashboard/dist/assets/{ElapsedCell-CwO4ufd0.js → ElapsedCell-BZJTSm9N.js} +2 -2
  92. package/dashboard/dist/assets/{ElapsedCell-CwO4ufd0.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
  93. package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
  94. package/dashboard/dist/assets/{EntityTimelinePanel-CkF-oW-m.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
  95. package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
  96. package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js.map → EscalationListSchemaPage-CoYvtMzj.js.map} +1 -1
  97. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js +2 -0
  98. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js.map +1 -0
  99. package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
  100. package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js.map → EscalationSchemaPage-C9Xu_A25.js.map} +1 -1
  101. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js +2 -0
  102. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js.map +1 -0
  103. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js +2 -0
  104. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js.map +1 -0
  105. package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js → EscalationsOverview-CW57FaP9.js} +2 -2
  106. package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
  107. package/dashboard/dist/assets/{EventTable-Ike2xchn.js → EventTable-D1ctWhKf.js} +2 -2
  108. package/dashboard/dist/assets/{EventTable-Ike2xchn.js.map → EventTable-D1ctWhKf.js.map} +1 -1
  109. package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js → FilterBar-C-iur-Nj.js} +2 -2
  110. package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js.map → FilterBar-C-iur-Nj.js.map} +1 -1
  111. package/dashboard/dist/assets/GraphInvokePage-CcA_44M4.js +2 -0
  112. package/dashboard/dist/assets/{GraphInvokePage-CKtvWowP.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
  113. package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
  114. package/dashboard/dist/assets/{HomePage-BQ3Q791Q.js.map → HomePage-Dc085ghJ.js.map} +1 -1
  115. package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
  116. package/dashboard/dist/assets/{ListToolbar-DdJzj472.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
  117. package/dashboard/dist/assets/{McpOverview-BbtrduWn.js → McpOverview-qXXhbNWV.js} +2 -2
  118. package/dashboard/dist/assets/{McpOverview-BbtrduWn.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
  119. package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
  120. package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
  121. package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
  122. package/dashboard/dist/assets/{McpQueryPage-CfJy7HZ7.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
  123. package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
  124. package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
  125. package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
  126. package/dashboard/dist/assets/{McpRunsPage-D7QXjW9z.js.map → McpRunsPage-BfjiJ8mM.js.map} +1 -1
  127. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
  128. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
  129. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js +3 -0
  130. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js.map +1 -0
  131. package/dashboard/dist/assets/OperatorDashboard-zCkW4eqk.js +2 -0
  132. package/dashboard/dist/assets/{OperatorDashboard-sXNDh1Ph.js.map → OperatorDashboard-zCkW4eqk.js.map} +1 -1
  133. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
  134. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
  135. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
  136. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
  137. package/dashboard/dist/assets/{PersonaDetailPage-NeHD-Gra.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
  138. package/dashboard/dist/assets/{PersonaDetailPage-NeHD-Gra.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
  139. package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js → PersonasPage-DOgGUlJl.js} +2 -2
  140. package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js.map → PersonasPage-DOgGUlJl.js.map} +1 -1
  141. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js +2 -0
  142. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js.map +1 -0
  143. package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
  144. package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
  145. package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
  146. package/dashboard/dist/assets/{ProcessesListPage-CjwVKe32.js.map → ProcessesListPage-BaHV2cXp.js.map} +1 -1
  147. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js +7 -0
  148. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js.map +1 -0
  149. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js +8 -0
  150. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js.map +1 -0
  151. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
  152. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
  153. package/dashboard/dist/assets/{RolesPage-OM9KM8Pg.js → RolesPage-DSqqKPbv.js} +2 -2
  154. package/dashboard/dist/assets/{RolesPage-OM9KM8Pg.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
  155. package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
  156. package/dashboard/dist/assets/{RunAsSelector-fFMt1bGe.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
  157. package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js → ScanCodesPage-S8aAJfnC.js} +2 -2
  158. package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
  159. package/dashboard/dist/assets/{ScanSchemeDetailPage-eKQpmsC_.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
  160. package/dashboard/dist/assets/{ScanSchemeDetailPage-eKQpmsC_.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
  161. package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
  162. package/dashboard/dist/assets/{ScanStationPage-C1_ppDoZ.js.map → ScanStationPage-R9t1-CeQ.js.map} +1 -1
  163. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
  164. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
  165. package/dashboard/dist/assets/{StickyPagination-B91Pk9xh.js → StickyPagination-CkW_A507.js} +2 -2
  166. package/dashboard/dist/assets/{StickyPagination-B91Pk9xh.js.map → StickyPagination-CkW_A507.js.map} +1 -1
  167. package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js → StreamMessageDetail-yzWX0wac.js} +2 -2
  168. package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
  169. package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
  170. package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js.map → SwimlaneTimeline-Cf4DXFxj.js.map} +1 -1
  171. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
  172. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
  173. package/dashboard/dist/assets/{TaskDetailPage-Bqj0I_I0.js → TaskDetailPage-DCDcEps9.js} +2 -2
  174. package/dashboard/dist/assets/{TaskDetailPage-Bqj0I_I0.js.map → TaskDetailPage-DCDcEps9.js.map} +1 -1
  175. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
  176. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
  177. package/dashboard/dist/assets/TasksListPage-BBATgpf7.js +2 -0
  178. package/dashboard/dist/assets/{TasksListPage-BB1f79lL.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
  179. package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js → TimeAgo-CSNVEjch.js} +2 -2
  180. package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
  181. package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js → TimestampCell-Du1nBrPn.js} +2 -2
  182. package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js.map → TimestampCell-Du1nBrPn.js.map} +1 -1
  183. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
  184. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
  185. package/dashboard/dist/assets/ToolTestPanel-CF-h_5Rg.js +2 -0
  186. package/dashboard/dist/assets/{ToolTestPanel-Bwe3J5lj.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
  187. package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
  188. package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
  189. package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
  190. package/dashboard/dist/assets/{TopicsPage-C1gxBUap.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
  191. package/dashboard/dist/assets/{UserName-BzXJUE6q.js → UserName-kBh1dc39.js} +2 -2
  192. package/dashboard/dist/assets/{UserName-BzXJUE6q.js.map → UserName-kBh1dc39.js.map} +1 -1
  193. package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
  194. package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js.map → WorkflowExecutionPage-CCRSbnDx.js.map} +1 -1
  195. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
  196. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
  197. package/dashboard/dist/assets/WorkflowsDashboard-BNQVvyek.js +2 -0
  198. package/dashboard/dist/assets/{WorkflowsDashboard-CZAqRk1N.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
  199. package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js → WorkflowsOverview-DswubNJN.js} +2 -2
  200. package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
  201. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
  202. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
  203. package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
  204. package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
  205. package/dashboard/dist/assets/{agents-gV0Ys-sY.js → agents-BwEnf6N9.js} +2 -2
  206. package/dashboard/dist/assets/{agents-gV0Ys-sY.js.map → agents-BwEnf6N9.js.map} +1 -1
  207. package/dashboard/dist/assets/{bots-B97itB3I.js → bots-CCmJTT2u.js} +2 -2
  208. package/dashboard/dist/assets/{bots-B97itB3I.js.map → bots-CCmJTT2u.js.map} +1 -1
  209. package/dashboard/dist/assets/{capabilities-CR9xZgGd.js → capabilities-BZHgp_nh.js} +2 -2
  210. package/dashboard/dist/assets/{capabilities-CR9xZgGd.js.map → capabilities-BZHgp_nh.js.map} +1 -1
  211. package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
  212. package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
  213. package/dashboard/dist/assets/{controlplane-YxvP1KCa.js → controlplane-CyfwUlFA.js} +2 -2
  214. package/dashboard/dist/assets/{controlplane-YxvP1KCa.js.map → controlplane-CyfwUlFA.js.map} +1 -1
  215. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js +2 -0
  216. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js.map +1 -0
  217. package/dashboard/dist/assets/index-3gbd5neL.js +67 -0
  218. package/dashboard/dist/assets/index-3gbd5neL.js.map +1 -0
  219. package/dashboard/dist/assets/index-BAAVTyZ-.js +2 -0
  220. package/dashboard/dist/assets/{index-BQpV-DTG.js.map → index-BAAVTyZ-.js.map} +1 -1
  221. package/dashboard/dist/assets/{index-B9BBCqLI.js → index-BC6Jenlo.js} +2 -2
  222. package/dashboard/dist/assets/{index-B9BBCqLI.js.map → index-BC6Jenlo.js.map} +1 -1
  223. package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
  224. package/dashboard/dist/assets/{index-Bp9KBLT5.js.map → index-C7KHqOTQ.js.map} +1 -1
  225. package/dashboard/dist/assets/index-CDrqqbSR.js +3 -0
  226. package/dashboard/dist/assets/index-CDrqqbSR.js.map +1 -0
  227. package/dashboard/dist/assets/index-CVwzCZ43.js +2 -0
  228. package/dashboard/dist/assets/{index-CFbo9FU9.js.map → index-CVwzCZ43.js.map} +1 -1
  229. package/dashboard/dist/assets/index-CaGF6TCC.js +2 -0
  230. package/dashboard/dist/assets/index-CaGF6TCC.js.map +1 -0
  231. package/dashboard/dist/assets/index-ClVbfe4z.js +13 -0
  232. package/dashboard/dist/assets/{index-Cfvkl2J0.js.map → index-ClVbfe4z.js.map} +1 -1
  233. package/dashboard/dist/assets/{index-DMeaiKgf.js → index-CuVkSmj5.js} +2 -2
  234. package/dashboard/dist/assets/{index-DMeaiKgf.js.map → index-CuVkSmj5.js.map} +1 -1
  235. package/dashboard/dist/assets/{index-ipqwPavs.js → index-DAuX_PlL.js} +2 -2
  236. package/dashboard/dist/assets/{index-ipqwPavs.js.map → index-DAuX_PlL.js.map} +1 -1
  237. package/dashboard/dist/assets/{index-CIpHj4di.js → index-DBWS5QL8.js} +2 -2
  238. package/dashboard/dist/assets/{index-CIpHj4di.js.map → index-DBWS5QL8.js.map} +1 -1
  239. package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
  240. package/dashboard/dist/assets/{index-CUZ6LYye.js.map → index-DIWCI6HC.js.map} +1 -1
  241. package/dashboard/dist/assets/{index-DwOnWeu8.js → index-DZ8X_Gp4.js} +2 -2
  242. package/dashboard/dist/assets/{index-DwOnWeu8.js.map → index-DZ8X_Gp4.js.map} +1 -1
  243. package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
  244. package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js → knowledge-CqyLhUMg.js} +2 -2
  245. package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js.map → knowledge-CqyLhUMg.js.map} +1 -1
  246. package/dashboard/dist/assets/{mcp-CH13hNH2.js → mcp-Cvu6bFYH.js} +2 -2
  247. package/dashboard/dist/assets/{mcp-CH13hNH2.js.map → mcp-Cvu6bFYH.js.map} +1 -1
  248. package/dashboard/dist/assets/{mcp-query-Duydd3JA.js → mcp-query-qC6A3e9l.js} +2 -2
  249. package/dashboard/dist/assets/{mcp-query-Duydd3JA.js.map → mcp-query-qC6A3e9l.js.map} +1 -1
  250. package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
  251. package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
  252. package/dashboard/dist/assets/{personas-mDk4lLQS.js → personas-BKN_lJuV.js} +2 -2
  253. package/dashboard/dist/assets/{personas-mDk4lLQS.js.map → personas-BKN_lJuV.js.map} +1 -1
  254. package/dashboard/dist/assets/{pipelines-B5GcgCeF.js → pipelines-BldIfv85.js} +2 -2
  255. package/dashboard/dist/assets/{pipelines-B5GcgCeF.js.map → pipelines-BldIfv85.js.map} +1 -1
  256. package/dashboard/dist/assets/{tasks-CItmNsRp.js → tasks-B-Uay8uL.js} +2 -2
  257. package/dashboard/dist/assets/{tasks-CItmNsRp.js.map → tasks-B-Uay8uL.js.map} +1 -1
  258. package/dashboard/dist/assets/{topics-CJYG7BX5.js → topics-438EQogt.js} +2 -2
  259. package/dashboard/dist/assets/{topics-CJYG7BX5.js.map → topics-438EQogt.js.map} +1 -1
  260. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
  261. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
  262. package/dashboard/dist/assets/{useDebouncedValue-BrwgXcp8.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
  263. package/dashboard/dist/assets/{useDebouncedValue-BrwgXcp8.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
  264. package/dashboard/dist/assets/{useNamespace-CHty0HAS.js → useNamespace-D1218GQ8.js} +2 -2
  265. package/dashboard/dist/assets/{useNamespace-CHty0HAS.js.map → useNamespace-D1218GQ8.js.map} +1 -1
  266. package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
  267. package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js.map → useYamlActivityEvents-BAQf_y_U.js.map} +1 -1
  268. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
  269. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
  270. package/dashboard/dist/assets/{yaml-workflows-CiWwx5rM.js → yaml-workflows-CN01gEB0.js} +2 -2
  271. package/dashboard/dist/assets/{yaml-workflows-CiWwx5rM.js.map → yaml-workflows-CN01gEB0.js.map} +1 -1
  272. package/dashboard/dist/index.html +3 -3
  273. package/docs/accumulator.md +113 -0
  274. package/docs/api/http/escalations.md +89 -0
  275. package/docs/api/http/roles.md +1 -0
  276. package/docs/api/sdk/escalations.md +91 -0
  277. package/docs/api/sdk/roles.md +2 -0
  278. package/docs/architecture.md +1 -1
  279. package/docs/code-owned-configuration.md +2 -1
  280. package/docs/dashboard.md +10 -4
  281. package/docs/hitl/design.md +1 -1
  282. package/docs/hitl/escalation.md +37 -1
  283. package/docs/hitl/invoke-form.md +4 -0
  284. package/docs/hitl/pinned-views.md +4 -0
  285. package/docs/hitl/portal.md +97 -0
  286. package/docs/hitl/resolution.md +41 -0
  287. package/docs/hitl/x-lt-embed.md +1 -1
  288. package/docs/hitl/x-lt-invoke.md +95 -0
  289. package/docs/hitl/x-lt-list-schema.md +3 -1
  290. package/docs/hitl/x-lt-widget.md +1 -0
  291. package/docs/hitl-guide.md +8 -1
  292. package/docs/scan-codes.md +15 -2
  293. package/docs/sdk.md +1 -1
  294. package/docs/workflows.md +2 -2
  295. package/package.json +4 -2
  296. package/dashboard/dist/assets/AgentsPage-7JJBHku8.js +0 -2
  297. package/dashboard/dist/assets/AvailableEscalationsPage-lz5qwSjg.js +0 -2
  298. package/dashboard/dist/assets/AvailableEscalationsPage-lz5qwSjg.js.map +0 -1
  299. package/dashboard/dist/assets/BulkAssignModal-NJBcoj-f.js +0 -2
  300. package/dashboard/dist/assets/CapabilitiesPage-F8dpNn9B.js +0 -2
  301. package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
  302. package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
  303. package/dashboard/dist/assets/EntityTimelinePanel-CkF-oW-m.js +0 -2
  304. package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js +0 -2
  305. package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js.map +0 -1
  306. package/dashboard/dist/assets/GraphInvokePage-CKtvWowP.js +0 -2
  307. package/dashboard/dist/assets/HomePage-BQ3Q791Q.js +0 -2
  308. package/dashboard/dist/assets/ListToolbar-DdJzj472.js +0 -2
  309. package/dashboard/dist/assets/McpQueryPage-CfJy7HZ7.js +0 -2
  310. package/dashboard/dist/assets/McpRunsPage-D7QXjW9z.js +0 -2
  311. package/dashboard/dist/assets/OperationsPage-aLHHAP2X.js +0 -3
  312. package/dashboard/dist/assets/OperationsPage-aLHHAP2X.js.map +0 -1
  313. package/dashboard/dist/assets/OperatorDashboard-sXNDh1Ph.js +0 -2
  314. package/dashboard/dist/assets/ProcessesListPage-CjwVKe32.js +0 -2
  315. package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js +0 -3
  316. package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js.map +0 -1
  317. package/dashboard/dist/assets/RoleDetailPage-WQt0y5l7.js +0 -8
  318. package/dashboard/dist/assets/RoleDetailPage-WQt0y5l7.js.map +0 -1
  319. package/dashboard/dist/assets/RunAsSelector-fFMt1bGe.js +0 -2
  320. package/dashboard/dist/assets/ScanStationPage-C1_ppDoZ.js +0 -2
  321. package/dashboard/dist/assets/TasksListPage-BB1f79lL.js +0 -2
  322. package/dashboard/dist/assets/ToolTestPanel-Bwe3J5lj.js +0 -2
  323. package/dashboard/dist/assets/TopicsPage-C1gxBUap.js +0 -2
  324. package/dashboard/dist/assets/WorkflowsDashboard-CZAqRk1N.js +0 -2
  325. package/dashboard/dist/assets/escalation-columns-uq-IV2aj.js +0 -2
  326. package/dashboard/dist/assets/escalation-columns-uq-IV2aj.js.map +0 -1
  327. package/dashboard/dist/assets/index-3ezfWLkE.js +0 -6
  328. package/dashboard/dist/assets/index-3ezfWLkE.js.map +0 -1
  329. package/dashboard/dist/assets/index-BQpV-DTG.js +0 -2
  330. package/dashboard/dist/assets/index-Bp9KBLT5.js +0 -2
  331. package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
  332. package/dashboard/dist/assets/index-CFbo9FU9.js +0 -2
  333. package/dashboard/dist/assets/index-CIwlVfvV.js +0 -67
  334. package/dashboard/dist/assets/index-CIwlVfvV.js.map +0 -1
  335. package/dashboard/dist/assets/index-CUZ6LYye.js +0 -2
  336. package/dashboard/dist/assets/index-Cfvkl2J0.js +0 -13
  337. package/dashboard/dist/assets/index-SGyrXGp8.js +0 -3
  338. package/dashboard/dist/assets/index-SGyrXGp8.js.map +0 -1
  339. package/dashboard/dist/assets/invoke-context-DrVyUEfs.js +0 -2
  340. package/dashboard/dist/assets/invoke-context-DrVyUEfs.js.map +0 -1
  341. package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
  342. package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
  343. package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js +0 -2
  344. package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js.map +0 -1
  345. package/docs/compilation.md +0 -152
  346. package/docs/compiler.md +0 -311
  347. package/docs/contributing.md +0 -56
  348. package/docs/design-principles.md +0 -245
  349. package/docs/schema-exchange.md +0 -173
  350. package/docs/self-test.md +0 -106
  351. package/docs/story.md +0 -184
@@ -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.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.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = 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;
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");
@@ -37,6 +37,15 @@ var resolve_batch_1 = require("./resolve-batch");
37
37
  Object.defineProperty(exports, "resolveBatchItem", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItem; } });
38
38
  Object.defineProperty(exports, "resolveBatchItemBySignalKey", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemBySignalKey; } });
39
39
  Object.defineProperty(exports, "resolveBatchItemByMetadata", { enumerable: true, get: function () { return resolve_batch_1.resolveBatchItemByMetadata; } });
40
+ var accumulate_1 = require("./accumulate");
41
+ Object.defineProperty(exports, "accumulateItem", { enumerable: true, get: function () { return accumulate_1.accumulateItem; } });
42
+ Object.defineProperty(exports, "accumulateItemBySignalKey", { enumerable: true, get: function () { return accumulate_1.accumulateItemBySignalKey; } });
43
+ Object.defineProperty(exports, "accumulateItemByMetadata", { enumerable: true, get: function () { return accumulate_1.accumulateItemByMetadata; } });
44
+ Object.defineProperty(exports, "removeItem", { enumerable: true, get: function () { return accumulate_1.removeItem; } });
45
+ Object.defineProperty(exports, "removeItemBySignalKey", { enumerable: true, get: function () { return accumulate_1.removeItemBySignalKey; } });
46
+ Object.defineProperty(exports, "removeItemByMetadata", { enumerable: true, get: function () { return accumulate_1.removeItemByMetadata; } });
47
+ Object.defineProperty(exports, "getEscalationItems", { enumerable: true, get: function () { return accumulate_1.getEscalationItems; } });
48
+ Object.defineProperty(exports, "itemsView", { enumerable: true, get: function () { return accumulate_1.itemsView; } });
40
49
  var metadata_1 = require("./metadata");
41
50
  Object.defineProperty(exports, "findByMetadata", { enumerable: true, get: function () { return metadata_1.findByMetadata; } });
42
51
  Object.defineProperty(exports, "claimByMetadata", { enumerable: true, get: function () { return metadata_1.claimByMetadata; } });
@@ -1,3 +1,4 @@
1
+ import { type RolePin, type RolePortal } from '../services/role/types';
1
2
  import type { LTApiResult } from '../types/sdk';
2
3
  /**
3
4
  * List all distinct role names in the system.
@@ -89,11 +90,9 @@ export declare function updateRole(input: {
89
90
  /** The escalation LIST schema — rich formatting for this role's list page. */
90
91
  list_schema?: Record<string, any> | null;
91
92
  /** Pinned-view seeds for the role's members: [{ label, url, badge? }] or null to clear. */
92
- default_pins?: {
93
- label: string;
94
- url: string;
95
- badge?: boolean;
96
- }[] | null;
93
+ default_pins?: RolePin[] | null;
94
+ /** The role's named portals, each rows of pin cells; null to clear. */
95
+ portals?: RolePortal[] | null;
97
96
  properties?: Record<string, any> | null;
98
97
  ops_visible?: boolean;
99
98
  /** Make this role's sequence the home Pace Board's default segment (single-holder: setting it clears the previous holder). */
@@ -48,6 +48,7 @@ exports.getRoleListSchema = getRoleListSchema;
48
48
  exports.listRoleListSchemaVersions = listRoleListSchemaVersions;
49
49
  exports.deleteRole = deleteRole;
50
50
  const roleService = __importStar(require("../services/role"));
51
+ const types_1 = require("../services/role/types");
51
52
  const facet_sql_1 = require("../services/escalation/facet-sql");
52
53
  /**
53
54
  * List all distinct role names in the system.
@@ -201,6 +202,50 @@ async function replaceEscalationTargets(input) {
201
202
  return { status: 500, error: err.message };
202
203
  }
203
204
  }
205
+ /** A pinned view: a non-blank label over a dashboard-relative url, optionally badged. */
206
+ function isRolePin(p) {
207
+ if (!p || typeof p !== 'object')
208
+ return false;
209
+ const pin = p;
210
+ return typeof pin.label === 'string' && pin.label.trim() !== ''
211
+ && typeof pin.url === 'string' && pin.url.startsWith('/')
212
+ && (pin.badge === undefined || typeof pin.badge === 'boolean');
213
+ }
214
+ /** Rows of pin cells within the portal bounds; every row carries at least one pin. */
215
+ function isPortalRows(value) {
216
+ return Array.isArray(value)
217
+ && value.length >= 1 && value.length <= types_1.PORTAL_LIMITS.MAX_ROWS
218
+ && value.every((row) => Array.isArray(row)
219
+ && row.length >= 1 && row.length <= types_1.PORTAL_LIMITS.MAX_COLS
220
+ && row.every(isRolePin));
221
+ }
222
+ /** A count tile: a pin plus an optional blurb. */
223
+ function isPortalCount(value) {
224
+ if (!value || typeof value !== 'object')
225
+ return false;
226
+ const blurb = value.blurb;
227
+ return isRolePin(value) && (blurb === undefined || typeof blurb === 'string');
228
+ }
229
+ /** A named portal: slug key, non-blank label, a valid matrix, optional bounded counts. */
230
+ function isRolePortal(value) {
231
+ if (!value || typeof value !== 'object')
232
+ return false;
233
+ const portal = value;
234
+ const countsOk = portal.counts === undefined
235
+ || (Array.isArray(portal.counts) && portal.counts.length <= types_1.PORTAL_LIMITS.MAX_COUNTS && portal.counts.every(isPortalCount));
236
+ return typeof portal.key === 'string' && types_1.PORTAL_KEY.test(portal.key)
237
+ && typeof portal.label === 'string' && portal.label.trim() !== ''
238
+ && isPortalRows(portal.rows)
239
+ && countsOk;
240
+ }
241
+ /** The role's portals: bounded in number, every key unique. */
242
+ function isPortalList(value) {
243
+ if (!Array.isArray(value) || value.length < 1 || value.length > types_1.PORTAL_LIMITS.MAX_PORTALS)
244
+ return false;
245
+ if (!value.every(isRolePortal))
246
+ return false;
247
+ return new Set(value.map((p) => p.key)).size === value.length;
248
+ }
204
249
  /**
205
250
  * Update role metadata. Fields omitted from input are left unchanged.
206
251
  * form_schema, metadata_schema, and parent_role can be set to null to clear them.
@@ -241,14 +286,17 @@ async function updateRole(input) {
241
286
  return { status: 400, error: 'parent_role must reference a different role' };
242
287
  }
243
288
  if (input.default_pins != null) {
244
- const pinsValid = Array.isArray(input.default_pins) && input.default_pins.every((p) => p && typeof p === 'object'
245
- && typeof p.label === 'string' && p.label.trim() !== ''
246
- && typeof p.url === 'string' && p.url.startsWith('/')
247
- && (p.badge === undefined || typeof p.badge === 'boolean'));
289
+ const pinsValid = Array.isArray(input.default_pins) && input.default_pins.every(isRolePin);
248
290
  if (!pinsValid) {
249
291
  return { status: 400, error: 'default_pins must be [{ label, url, badge? }] with dashboard-relative urls' };
250
292
  }
251
293
  }
294
+ if (input.portals != null && !isPortalList(input.portals)) {
295
+ return {
296
+ status: 400,
297
+ error: `portals must be 1..${types_1.PORTAL_LIMITS.MAX_PORTALS} of { key (slug, unique), label, rows, counts? }, rows being 1..${types_1.PORTAL_LIMITS.MAX_ROWS} rows of 1..${types_1.PORTAL_LIMITS.MAX_COLS} pins [{ label, url, badge? }] with dashboard-relative urls, counts up to ${types_1.PORTAL_LIMITS.MAX_COUNTS} of { label, url, blurb? }`,
298
+ };
299
+ }
252
300
  if (input.upstream_roles != null) {
253
301
  if (!Array.isArray(input.upstream_roles) || input.upstream_roles.some((u) => typeof u !== 'string' || !u.trim())) {
254
302
  return { status: 400, error: 'upstream_roles must be an array of role names' };
@@ -269,6 +317,7 @@ async function updateRole(input) {
269
317
  metadata_schema: input.metadata_schema,
270
318
  list_schema: input.list_schema,
271
319
  default_pins: input.default_pins,
320
+ portals: input.portals,
272
321
  properties: input.properties,
273
322
  ops_visible: input.ops_visible,
274
323
  ops_home_default: input.ops_home_default,
@@ -171,6 +171,8 @@ async function executeStep(step, index, ctx) {
171
171
  return (0, verbs_1.releaseStep)(step, ctx);
172
172
  case types_1.SCAN_VERBS.CANCEL:
173
173
  return (0, verbs_1.cancelStep)(step, ctx);
174
+ case types_1.SCAN_VERBS.ACCUMULATE:
175
+ return (0, verbs_1.accumulateStep)(step, ctx);
174
176
  default:
175
177
  throw new Error(`unknown scan verb "${step.verb}"`);
176
178
  }
@@ -13,3 +13,18 @@ export declare function releaseStep(step: ScanStep, ctx: StepContext): Promise<L
13
13
  */
14
14
  export declare function dispatchChoiceVerb(step: ScanStep, ctx: StepContext, row: Record<string, any>): Promise<LTApiResult<ScanExecuteResponse>>;
15
15
  export declare function cancelStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
16
+ /**
17
+ * Adds the scanned item to an accumulator. Two modes, one atomic write:
18
+ *
19
+ * - Item-locate (`params.accumulate.containerFacet`): the scan locates the
20
+ * item's own pending row through the scheme facet, reads the container
21
+ * facet value it carries, and adds the target to the container that shares
22
+ * it, writing the item row as the reciprocal in the same statement. An
23
+ * item with no row, or no container facet, falls through.
24
+ * - Container-locate (no `containerFacet`): the scan locates the container
25
+ * by the scheme facet and adds `params.itemKey` (template).
26
+ *
27
+ * The write is the SDK's guarded statement; the locate only picks ids. A
28
+ * container already holding the item answers conflict, never a second add.
29
+ */
30
+ export declare function accumulateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
@@ -39,14 +39,17 @@ exports.escalateStep = escalateStep;
39
39
  exports.releaseStep = releaseStep;
40
40
  exports.dispatchChoiceVerb = dispatchChoiceVerb;
41
41
  exports.cancelStep = cancelStep;
42
+ exports.accumulateStep = accumulateStep;
42
43
  const scanCodeService = __importStar(require("../../services/scan-code"));
43
44
  const escalationService = __importStar(require("../../services/escalation"));
44
45
  const metadata_1 = require("../escalations/metadata");
46
+ const accumulate_1 = require("../escalations/accumulate");
45
47
  const create_1 = require("../escalations/create");
46
48
  const claim_1 = require("../escalations/claim");
47
49
  const helpers_1 = require("../escalations/helpers");
48
50
  const types_1 = require("../../types");
49
51
  const context_1 = require("./context");
52
+ const locate_1 = require("./locate");
50
53
  // ── Mutating verbs — each a single atomic operation under the ACTOR's RBAC ──
51
54
  // ctx.auth is the effective actor: the badged person when a grant rode the
52
55
  // request, otherwise the authenticated principal. Attribution and write
@@ -203,3 +206,65 @@ async function cancelStep(step, ctx) {
203
206
  return (0, context_1.conflict)('Escalation is not cancellable (already terminal)');
204
207
  return (0, context_1.executed)(cancelled, step);
205
208
  }
209
+ /**
210
+ * Adds the scanned item to an accumulator. Two modes, one atomic write:
211
+ *
212
+ * - Item-locate (`params.accumulate.containerFacet`): the scan locates the
213
+ * item's own pending row through the scheme facet, reads the container
214
+ * facet value it carries, and adds the target to the container that shares
215
+ * it, writing the item row as the reciprocal in the same statement. An
216
+ * item with no row, or no container facet, falls through.
217
+ * - Container-locate (no `containerFacet`): the scan locates the container
218
+ * by the scheme facet and adds `params.itemKey` (template).
219
+ *
220
+ * The write is the SDK's guarded statement; the locate only picks ids. A
221
+ * container already holding the item answers conflict, never a second add.
222
+ */
223
+ async function accumulateStep(step, ctx) {
224
+ const tpl = (0, context_1.templateContext)(ctx);
225
+ const payload = step.params?.resolverPayload
226
+ ? scanCodeService.interpolateScanTemplate(step.params.resolverPayload, tpl)
227
+ : undefined;
228
+ const metadata = { ...(0, context_1.interpolatedMetadata)(step, ctx), ...(0, context_1.provenance)(ctx) };
229
+ const options = step.params?.accumulate;
230
+ let request;
231
+ if (options?.containerFacet) {
232
+ const located = await (0, locate_1.locateForStep)(step, ctx, 1);
233
+ const item = located?.escalations[0];
234
+ if (!item)
235
+ return null;
236
+ const containerValue = item.metadata?.[options.containerFacet];
237
+ if (containerValue === undefined || containerValue === null || containerValue === '')
238
+ return null;
239
+ request = {
240
+ key: options.containerFacet,
241
+ value: String(containerValue),
242
+ itemKey: ctx.parsed.target,
243
+ payload,
244
+ metadata,
245
+ restrictRoles: options.containerRoles,
246
+ ...(options.reciprocal === false ? {} : { reciprocal: { id: item.id } }),
247
+ };
248
+ }
249
+ else {
250
+ request = {
251
+ key: ctx.scheme.target_facet,
252
+ value: ctx.parsed.target,
253
+ itemKey: scanCodeService.interpolateScanTemplate(step.params.itemKey, tpl),
254
+ payload,
255
+ metadata,
256
+ restrictRoles: step.query?.roles,
257
+ };
258
+ }
259
+ const result = await (0, accumulate_1.accumulateItemByMetadata)(request, ctx.auth);
260
+ if (result.status === 404)
261
+ return null;
262
+ if (result.status === 403)
263
+ return (0, context_1.forbidden)(result.error);
264
+ if (result.status === 409)
265
+ return (0, context_1.conflict)(result.error);
266
+ if (result.status !== 200)
267
+ return result;
268
+ const escalation = result.data.escalationId ? { id: result.data.escalationId, ...result.data } : undefined;
269
+ return (0, context_1.executed)(escalation, step);
270
+ }
package/build/index.js CHANGED
@@ -168,6 +168,66 @@ async function main() {
168
168
  },
169
169
  },
170
170
  examples: true,
171
+ // Code-owned declaration for the reviewer queue the examples route to: a
172
+ // portal that leads with the queue's counts and lays its lists beneath.
173
+ // `reset` keeps the declaration applied on every boot.
174
+ roles: [
175
+ {
176
+ role: 'reviewer',
177
+ title: 'Reviewer',
178
+ reset: true,
179
+ portals: [
180
+ {
181
+ key: 'review-desk',
182
+ label: 'Review desk',
183
+ counts: [
184
+ { label: 'Waiting', url: '/escalations/available?role=reviewer', blurb: 'Unclaimed items in the queue' },
185
+ { label: 'In progress', url: '/escalations/available?role=reviewer&status=claimed', blurb: 'Claimed and being worked' },
186
+ { label: 'Resolved', url: '/escalations/available?role=reviewer&status=resolved', blurb: 'Closed out by a reviewer' },
187
+ { label: 'Expired', url: '/escalations/available?role=reviewer&status=expired', blurb: 'Timed out before anyone acted' },
188
+ { label: 'Cancelled', url: '/escalations/available?role=reviewer&status=cancelled', blurb: 'Withdrawn by the workflow' },
189
+ ],
190
+ rows: [
191
+ [
192
+ { label: 'Waiting', url: '/escalations/available?role=reviewer&view=table&layout=compact', badge: true },
193
+ { label: 'In progress', url: '/escalations/available?role=reviewer&status=claimed&view=table&layout=compact', badge: true },
194
+ ],
195
+ ],
196
+ },
197
+ ],
198
+ },
199
+ {
200
+ // The rollup-bin example's container queue: the list shows each
201
+ // bin's fill level from the accumulator facets.
202
+ role: 'bin',
203
+ title: 'Bin',
204
+ description: 'Open containers filling with scanned bags. Ships at max or when the window closes.',
205
+ reset: true,
206
+ list_schema: {
207
+ 'x-lt-layout': 'facet-table',
208
+ 'x-lt-columns': [
209
+ { label: 'Bin', value: '{{metadata.binKey}}' },
210
+ { label: 'Held', value: '{{metadata.accumulate_count}}' },
211
+ { label: 'Max', value: '{{metadata.accumulate_max}}', priority: 2 },
212
+ { label: 'Open since', value: '{{escalation.created_at}}', format: 'age', priority: 2 },
213
+ ],
214
+ },
215
+ },
216
+ {
217
+ role: 'bag',
218
+ title: 'Bag',
219
+ description: 'Bags waiting to be scanned into a bin.',
220
+ reset: true,
221
+ list_schema: {
222
+ 'x-lt-layout': 'facet-table',
223
+ 'x-lt-columns': [
224
+ { label: 'Order', value: '{{metadata.orderId}}' },
225
+ { label: 'Bin', value: '{{metadata.binKey}}', priority: 2 },
226
+ { label: 'Waiting', value: '{{escalation.created_at}}', format: 'age', priority: 2 },
227
+ ],
228
+ },
229
+ },
230
+ ],
171
231
  features: {
172
232
  // The examples ship the full scan demo (schemes 10/11); surface it.
173
233
  scanCodes: true,
@@ -0,0 +1,12 @@
1
+ -- Migration 036: Role portals
2
+ --
3
+ -- portals is a role-owned list of named portal views. Each portal is a matrix
4
+ -- of pins: rows of cells, each cell a pinned view ({ label, url, badge? }).
5
+ -- The dashboard renders a portal as one page of live list panels at
6
+ -- /portal/:role/:portal, the visual form of the role's pinned views: one
7
+ -- portal for urgent items by facility, another for the team's focus of the
8
+ -- day, each cell named for a person and scoped to their facets. Unversioned
9
+ -- config, like default_pins; null means the role declares no portal.
10
+
11
+ ALTER TABLE lt_roles
12
+ ADD COLUMN IF NOT EXISTS portals JSONB;
@@ -0,0 +1,7 @@
1
+ import type { Router } from 'express';
2
+ /**
3
+ * Open-accumulator routes. The literal single-segment paths are registered
4
+ * before the parameterized routes so /:id never shadows them; the /:id/*
5
+ * forms run as the effective work actor (badge continuity at a station).
6
+ */
7
+ export declare function registerAccumulateRoutes(router: Router): void;
@@ -0,0 +1,150 @@
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.registerAccumulateRoutes = registerAccumulateRoutes;
37
+ const api = __importStar(require("../../api/escalations"));
38
+ const acting_1 = require("./acting");
39
+ /**
40
+ * Open-accumulator routes. The literal single-segment paths are registered
41
+ * before the parameterized routes so /:id never shadows them; the /:id/*
42
+ * forms run as the effective work actor (badge continuity at a station).
43
+ */
44
+ function registerAccumulateRoutes(router) {
45
+ /**
46
+ * POST /api/escalations/accumulate-by-signal-key
47
+ * Add one item to an accumulator escalation by its signal_key.
48
+ * Body: { signalKey, itemKey, payload?, metadata?, reciprocal? }
49
+ */
50
+ router.post('/accumulate-by-signal-key', async (req, res) => {
51
+ const result = await api.accumulateItemBySignalKey({
52
+ signalKey: req.body?.signalKey,
53
+ itemKey: req.body?.itemKey,
54
+ payload: req.body?.payload,
55
+ metadata: req.body?.metadata,
56
+ reciprocal: req.body?.reciprocal,
57
+ }, req.auth);
58
+ res.status(result.status).json(result.data ?? { error: result.error });
59
+ });
60
+ /**
61
+ * POST /api/escalations/accumulate-by-metadata
62
+ * Add one item to the highest priority pending accumulator whose metadata
63
+ * contains the key/value.
64
+ * Body: { key, value, itemKey, payload?, metadata?, restrictRoles?, reciprocal? }
65
+ */
66
+ router.post('/accumulate-by-metadata', async (req, res) => {
67
+ const result = await api.accumulateItemByMetadata({
68
+ key: req.body?.key,
69
+ value: req.body?.value,
70
+ itemKey: req.body?.itemKey,
71
+ payload: req.body?.payload,
72
+ metadata: req.body?.metadata,
73
+ restrictRoles: req.body?.restrictRoles,
74
+ reciprocal: req.body?.reciprocal,
75
+ }, req.auth);
76
+ res.status(result.status).json(result.data ?? { error: result.error });
77
+ });
78
+ /**
79
+ * POST /api/escalations/remove-item-by-signal-key
80
+ * Body: { signalKey, itemKey, reciprocal? }
81
+ */
82
+ router.post('/remove-item-by-signal-key', async (req, res) => {
83
+ const result = await api.removeItemBySignalKey({
84
+ signalKey: req.body?.signalKey,
85
+ itemKey: req.body?.itemKey,
86
+ reciprocal: req.body?.reciprocal,
87
+ }, req.auth);
88
+ res.status(result.status).json(result.data ?? { error: result.error });
89
+ });
90
+ /**
91
+ * POST /api/escalations/remove-item-by-metadata
92
+ * Body: { key, value, itemKey, restrictRoles?, reciprocal? }
93
+ */
94
+ router.post('/remove-item-by-metadata', async (req, res) => {
95
+ const result = await api.removeItemByMetadata({
96
+ key: req.body?.key,
97
+ value: req.body?.value,
98
+ itemKey: req.body?.itemKey,
99
+ restrictRoles: req.body?.restrictRoles,
100
+ reciprocal: req.body?.reciprocal,
101
+ }, req.auth);
102
+ res.status(result.status).json(result.data ?? { error: result.error });
103
+ });
104
+ /**
105
+ * POST /api/escalations/:id/accumulate
106
+ * Add one item. Interim adds answer { outcome: 'accepted', count, remaining };
107
+ * the add that reaches max answers { outcome: 'completed', signaled } and the
108
+ * waiting workflow resumes with the collection. Claim-agnostic unless
109
+ * assertClaim: true.
110
+ * Body: { itemKey, payload?, metadata?, assertClaim?, reciprocal? }
111
+ */
112
+ router.post('/:id/accumulate', async (req, res) => {
113
+ const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
114
+ if (!auth)
115
+ return;
116
+ const result = await api.accumulateItem({
117
+ id: req.params.id,
118
+ itemKey: req.body?.itemKey,
119
+ payload: req.body?.payload,
120
+ metadata: req.body?.metadata,
121
+ assertClaim: req.body?.assertClaim,
122
+ reciprocal: req.body?.reciprocal,
123
+ }, auth);
124
+ res.status(result.status).json(result.data ?? { error: result.error });
125
+ });
126
+ /**
127
+ * POST /api/escalations/:id/remove-item
128
+ * Remove one held item; the row stays pending and the waiter never wakes.
129
+ * Body: { itemKey, reciprocal? }
130
+ */
131
+ router.post('/:id/remove-item', async (req, res) => {
132
+ const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
133
+ if (!auth)
134
+ return;
135
+ const result = await api.removeItem({
136
+ id: req.params.id,
137
+ itemKey: req.body?.itemKey,
138
+ reciprocal: req.body?.reciprocal,
139
+ }, auth);
140
+ res.status(result.status).json(result.data ?? { error: result.error });
141
+ });
142
+ /**
143
+ * GET /api/escalations/:id/items
144
+ * The held items of an accumulator or batch row in arrival order.
145
+ */
146
+ router.get('/:id/items', async (req, res) => {
147
+ const result = await api.getEscalationItems({ id: req.params.id }, req.auth);
148
+ res.status(result.status).json(result.data ?? { error: result.error });
149
+ });
150
+ }
@@ -4,6 +4,7 @@ const express_1 = require("express");
4
4
  const list_1 = require("./list");
5
5
  const bulk_1 = require("./bulk");
6
6
  const metadata_1 = require("./metadata");
7
+ const accumulate_1 = require("./accumulate");
7
8
  const single_1 = require("./single");
8
9
  const resolve_1 = require("./resolve");
9
10
  const facets_1 = require("./facets");
@@ -17,6 +18,10 @@ const router = (0, express_1.Router)();
17
18
  (0, bulk_1.registerBulkRoutes)(router);
18
19
  // GET /by-metadata, POST /claim-by-metadata, POST /resolve-by-metadata
19
20
  (0, metadata_1.registerMetadataRoutes)(router);
21
+ // POST /accumulate-by-signal-key, /accumulate-by-metadata,
22
+ // /remove-item-by-signal-key, /remove-item-by-metadata,
23
+ // POST /:id/accumulate, POST /:id/remove-item, GET /:id/items
24
+ (0, accumulate_1.registerAccumulateRoutes)(router);
20
25
  // POST /search-by-facets, /claim-groups, /claim-by-facets
21
26
  (0, facets_1.registerFacetRoutes)(router);
22
27
  // POST /aggregate-by-facets, /timeline-by-facet
@@ -244,6 +244,31 @@ export declare function createClient(options?: LTClientOptions): {
244
244
  metadata?: Record<string, any>;
245
245
  restrictRoles?: string[];
246
246
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
247
+ accumulate: (input: {
248
+ id: string;
249
+ } & import("../api/escalations/accumulate").AccumulateItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
250
+ accumulateBySignalKey: (input: {
251
+ signalKey: string;
252
+ } & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
253
+ accumulateByMetadata: (input: {
254
+ key: string;
255
+ value: string;
256
+ restrictRoles?: string[];
257
+ } & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
258
+ removeItem: (input: {
259
+ id: string;
260
+ } & import("../api/escalations/accumulate").RemoveItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
261
+ removeItemBySignalKey: (input: {
262
+ signalKey: string;
263
+ } & import("../api/escalations/accumulate").RemoveItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
264
+ removeItemByMetadata: (input: {
265
+ key: string;
266
+ value: string;
267
+ restrictRoles?: string[];
268
+ } & import("../api/escalations/accumulate").RemoveItemInput, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
269
+ getItems: (input: {
270
+ id: string;
271
+ }, auth?: LTApiAuth) => Promise<LTApiResult<import("../api/escalations/accumulate").EscalationItemsView>>;
247
272
  searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
248
273
  claimGroups: (input: {
249
274
  query: import("..").FacetQuery;
@@ -146,6 +146,14 @@ function createClient(options = {}) {
146
146
  resolveBatchItem: bindAuth(escalationsApi.resolveBatchItem, auth),
147
147
  resolveBatchItemBySignalKey: bindAuth(escalationsApi.resolveBatchItemBySignalKey, auth),
148
148
  resolveBatchItemByMetadata: bindAuth(escalationsApi.resolveBatchItemByMetadata, auth),
149
+ // Open accumulation: add and remove held items, read the ordered collection.
150
+ accumulate: bindAuth(escalationsApi.accumulateItem, auth),
151
+ accumulateBySignalKey: bindAuth(escalationsApi.accumulateItemBySignalKey, auth),
152
+ accumulateByMetadata: bindAuth(escalationsApi.accumulateItemByMetadata, auth),
153
+ removeItem: bindAuth(escalationsApi.removeItem, auth),
154
+ removeItemBySignalKey: bindAuth(escalationsApi.removeItemBySignalKey, auth),
155
+ removeItemByMetadata: bindAuth(escalationsApi.removeItemByMetadata, auth),
156
+ getItems: bindAuth(escalationsApi.getEscalationItems, auth),
149
157
  // Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
150
158
  searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
151
159
  claimGroups: bindAuth(escalationsApi.claimGroups, auth),
@@ -0,0 +1,81 @@
1
+ import type { AccumulateItemOutcome, LTEscalationRecord, RemoveAccumulatedItemOutcome } from '../../types';
2
+ /** Names the second row of a reciprocal add or removal. Exactly one selector. */
3
+ export interface AccumulateReciprocal {
4
+ id?: string;
5
+ signalKey?: string;
6
+ key?: string;
7
+ value?: unknown;
8
+ roles?: string[];
9
+ /** Stored as the reciprocal entry's payload. */
10
+ payload?: Record<string, any>;
11
+ }
12
+ export interface AccumulateItemInput {
13
+ itemKey: string;
14
+ payload?: Record<string, any>;
15
+ /** Merge patch for the container's GIN-indexed metadata, same statement. */
16
+ metadata?: Record<string, any>;
17
+ /** Recorded on both entries as `actor`. */
18
+ actor?: string;
19
+ /** Claim-lock assertion on the container row (by-id form only). */
20
+ assertClaim?: string;
21
+ resolvedBy?: {
22
+ id: string;
23
+ email?: string;
24
+ };
25
+ reciprocal?: AccumulateReciprocal;
26
+ }
27
+ export interface AccumulateSideOutcome {
28
+ outcome: 'completed' | 'accepted';
29
+ count: number;
30
+ /** `max - count`, or null when the accumulator is unbounded. */
31
+ remaining: number | null;
32
+ escalation: LTEscalationRecord;
33
+ }
34
+ export interface AccumulateItemServiceOutcome {
35
+ outcome: AccumulateItemOutcome;
36
+ /** Items held after the add; -1 on every failure outcome. */
37
+ count: number;
38
+ remaining: number | null;
39
+ /** The post-add container row on `completed`/`accepted`; null on failure. */
40
+ escalation: LTEscalationRecord | null;
41
+ reciprocal?: AccumulateSideOutcome;
42
+ }
43
+ export interface RemoveItemInput {
44
+ itemKey: string;
45
+ actor?: string;
46
+ reciprocal?: Omit<AccumulateReciprocal, 'payload'>;
47
+ }
48
+ export interface RemoveItemServiceOutcome {
49
+ outcome: RemoveAccumulatedItemOutcome;
50
+ count: number;
51
+ escalation: LTEscalationRecord | null;
52
+ reciprocal?: {
53
+ count: number;
54
+ escalation: LTEscalationRecord;
55
+ };
56
+ }
57
+ /**
58
+ * Adds one item to an accumulator escalation in a single atomic SDK
59
+ * statement (guarded append + facet recompute + resolve-and-wake at max,
60
+ * with the reciprocal row written in the same statement or not at all).
61
+ * Interim adds publish `escalation.updated` with the count; a completing
62
+ * add publishes the standard `escalation.resolved`. Both rows publish.
63
+ * Failure outcomes publish nothing because no row changed.
64
+ */
65
+ export declare function accumulateItem(id: string, input: AccumulateItemInput): Promise<AccumulateItemServiceOutcome>;
66
+ /** Add selecting the container by its `signal_key`, the deterministic home signal id. */
67
+ export declare function accumulateItemBySignalKey(signalKey: string, input: Omit<AccumulateItemInput, 'assertClaim'>): Promise<AccumulateItemServiceOutcome>;
68
+ /** Add selecting the container by metadata facet, scoped by `roles`. */
69
+ export declare function accumulateItemByMetadata(key: string, value: unknown, input: Omit<AccumulateItemInput, 'assertClaim'> & {
70
+ roles?: string[];
71
+ }): Promise<AccumulateItemServiceOutcome>;
72
+ /**
73
+ * Removes one held item from a pending accumulator escalation (and the
74
+ * container's id from the reciprocal row) in one guarded statement. The
75
+ * waiter never wakes; both rows publish `escalation.updated`.
76
+ */
77
+ export declare function removeAccumulatedItem(id: string, input: RemoveItemInput): Promise<RemoveItemServiceOutcome>;
78
+ export declare function removeAccumulatedItemBySignalKey(signalKey: string, input: RemoveItemInput): Promise<RemoveItemServiceOutcome>;
79
+ export declare function removeAccumulatedItemByMetadata(key: string, value: unknown, input: RemoveItemInput & {
80
+ roles?: string[];
81
+ }): Promise<RemoveItemServiceOutcome>;