@hotmeshio/long-tail 0.19.1 → 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 (393) 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/api/workflows/config.d.ts +3 -0
  12. package/build/api/workflows/config.js +15 -0
  13. package/build/api/workflows/index.d.ts +1 -0
  14. package/build/api/workflows/index.js +3 -1
  15. package/build/api/workflows/input-lookups.d.ts +16 -0
  16. package/build/api/workflows/input-lookups.js +69 -0
  17. package/build/api/workflows/input-validation.d.ts +4 -3
  18. package/build/api/workflows/input-validation.js +7 -4
  19. package/build/api/workflows/invocable.js +1 -0
  20. package/build/api/workflows/invocation.js +1 -1
  21. package/build/index.js +60 -0
  22. package/build/lib/db/schemas/035_workflow_input_lookups.sql +9 -0
  23. package/build/lib/db/schemas/036_role_portals.sql +12 -0
  24. package/build/routes/escalations/accumulate.d.ts +7 -0
  25. package/build/routes/escalations/accumulate.js +150 -0
  26. package/build/routes/escalations/index.js +5 -0
  27. package/build/routes/workflows/config.js +10 -0
  28. package/build/sdk/index.d.ts +25 -0
  29. package/build/sdk/index.js +8 -0
  30. package/build/services/config/cache.js +1 -0
  31. package/build/services/config/read.js +2 -0
  32. package/build/services/config/sql.d.ts +2 -2
  33. package/build/services/config/sql.js +6 -5
  34. package/build/services/config/write.js +10 -1
  35. package/build/services/escalation/accumulate.d.ts +81 -0
  36. package/build/services/escalation/accumulate.js +154 -0
  37. package/build/services/escalation/index.d.ts +1 -0
  38. package/build/services/escalation/index.js +1 -0
  39. package/build/services/knowledge/index.d.ts +1 -0
  40. package/build/services/knowledge/index.js +1 -0
  41. package/build/services/knowledge/lookup-refs.d.ts +7 -0
  42. package/build/services/knowledge/lookup-refs.js +26 -0
  43. package/build/services/mcp/db-server/schemas.d.ts +2 -2
  44. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  45. package/build/services/orchestrator/condition.d.ts +40 -3
  46. package/build/services/orchestrator/condition.js +42 -2
  47. package/build/services/role/index.js +1 -0
  48. package/build/services/role/seed.js +6 -1
  49. package/build/services/role/sql.d.ts +6 -3
  50. package/build/services/role/sql.js +7 -2
  51. package/build/services/role/types.d.ts +38 -10
  52. package/build/services/role/types.js +10 -1
  53. package/build/services/scan-code/validate.js +16 -0
  54. package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
  55. package/build/shared/form-validation/display-only-widgets.js +25 -0
  56. package/build/shared/form-validation/field-validator.d.ts +1 -0
  57. package/build/shared/form-validation/field-validator.js +94 -6
  58. package/build/shared/form-validation/index.d.ts +2 -0
  59. package/build/shared/form-validation/index.js +2 -0
  60. package/build/shared/form-validation/invoke-context.d.ts +4 -3
  61. package/build/shared/form-validation/invoke-context.js +5 -4
  62. package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
  63. package/build/shared/form-validation/x-lt-bind.js +12 -8
  64. package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
  65. package/build/shared/form-validation/x-lt-invoke.js +103 -0
  66. package/build/shared/form-validation/x-lt-options.d.ts +3 -3
  67. package/build/shared/form-validation/x-lt-options.js +19 -5
  68. package/build/shared/form-validation/x-lt-show-if.d.ts +5 -0
  69. package/build/shared/form-validation/x-lt-show-if.js +10 -0
  70. package/build/start/workers.js +10 -0
  71. package/build/system/mcp-servers/admin/escalations.js +39 -0
  72. package/build/system/mcp-servers/admin/schemas.d.ts +256 -33
  73. package/build/system/mcp-servers/admin/schemas.js +55 -3
  74. package/build/system/mcp-servers/admin/users.js +1 -0
  75. package/build/system/mcp-servers/admin/workflow-config.js +54 -9
  76. package/build/system/mcp-servers/admin/workflows.js +9 -7
  77. package/build/system/mcp-servers/db-query/schemas.d.ts +2 -2
  78. package/build/system/mcp-servers/docs.js +4 -0
  79. package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
  80. package/build/system/mcp-servers/human-queue-schemas.js +19 -1
  81. package/build/system/mcp-servers/human-queue.d.ts +2 -0
  82. package/build/system/mcp-servers/human-queue.js +77 -0
  83. package/build/system/seed/tool-manifests-admin.d.ts +1509 -227
  84. package/build/system/seed/tool-manifests-admin.js +8 -4
  85. package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
  86. package/build/system/seed/tool-manifests-escalation.js +56 -0
  87. package/build/tsconfig.tsbuildinfo +1 -1
  88. package/build/types/config.d.ts +4 -0
  89. package/build/types/escalation.d.ts +52 -0
  90. package/build/types/escalation.js +29 -1
  91. package/build/types/index.d.ts +2 -2
  92. package/build/types/index.js +3 -1
  93. package/build/types/scan-code.d.ts +24 -0
  94. package/build/types/scan-code.js +9 -0
  95. package/build/types/startup.d.ts +26 -0
  96. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js → AdminDashboard-uarpHB88.js} +2 -2
  97. package/dashboard/dist/assets/{AdminDashboard-Drs-9TRM.js.map → AdminDashboard-uarpHB88.js.map} +1 -1
  98. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js → AgentConfigPage-BcUaDD5E.js} +6 -6
  99. package/dashboard/dist/assets/{AgentConfigPage-BDPDZ7-v.js.map → AgentConfigPage-BcUaDD5E.js.map} +1 -1
  100. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js → AgentDetailPage-BaZBhK6i.js} +3 -3
  101. package/dashboard/dist/assets/{AgentDetailPage-CGBulM4_.js.map → AgentDetailPage-BaZBhK6i.js.map} +1 -1
  102. package/dashboard/dist/assets/AgentsPage-CuVFSDc4.js +2 -0
  103. package/dashboard/dist/assets/{AgentsPage-D77JeViQ.js.map → AgentsPage-CuVFSDc4.js.map} +1 -1
  104. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js +2 -0
  105. package/dashboard/dist/assets/AvailableEscalationsPage-iO5NyyIK.js.map +1 -0
  106. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js → BotPicker-CClMby6B.js} +2 -2
  107. package/dashboard/dist/assets/{BotPicker-CC5vI_Sv.js.map → BotPicker-CClMby6B.js.map} +1 -1
  108. package/dashboard/dist/assets/BulkAssignModal-BL8FRgkN.js +2 -0
  109. package/dashboard/dist/assets/{BulkAssignModal-BXiJnlqt.js.map → BulkAssignModal-BL8FRgkN.js.map} +1 -1
  110. package/dashboard/dist/assets/CapabilitiesPage-D53ogPor.js +2 -0
  111. package/dashboard/dist/assets/{CapabilitiesPage-D9TC2iKy.js.map → CapabilitiesPage-D53ogPor.js.map} +1 -1
  112. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js → CollapsibleSection-ow8jpbtD.js} +2 -2
  113. package/dashboard/dist/assets/{CollapsibleSection-D10lGw_u.js.map → CollapsibleSection-ow8jpbtD.js.map} +1 -1
  114. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js → ConfirmDeleteModal-CeEDt9iJ.js} +2 -2
  115. package/dashboard/dist/assets/{ConfirmDeleteModal-BJdLN6No.js.map → ConfirmDeleteModal-CeEDt9iJ.js.map} +1 -1
  116. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js → CountdownTimer-CSqyZMCG.js} +2 -2
  117. package/dashboard/dist/assets/{CountdownTimer-D9B-BjQ7.js.map → CountdownTimer-CSqyZMCG.js.map} +1 -1
  118. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js → CredentialsPage-Dx7SxA23.js} +2 -2
  119. package/dashboard/dist/assets/{CredentialsPage-hniUAFBK.js.map → CredentialsPage-Dx7SxA23.js.map} +1 -1
  120. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js → CronLabel-LYPxpvNN.js} +2 -2
  121. package/dashboard/dist/assets/{CronLabel-v9DCD2FX.js.map → CronLabel-LYPxpvNN.js.map} +1 -1
  122. package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
  123. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
  124. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
  125. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
  126. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js → ElapsedCell-BZJTSm9N.js} +2 -2
  127. package/dashboard/dist/assets/{ElapsedCell-_xvVTK8N.js.map → ElapsedCell-BZJTSm9N.js.map} +1 -1
  128. package/dashboard/dist/assets/EntityTimelinePanel-0wIIW2en.js +2 -0
  129. package/dashboard/dist/assets/{EntityTimelinePanel-1lT3jkCM.js.map → EntityTimelinePanel-0wIIW2en.js.map} +1 -1
  130. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js → EscalationListSchemaPage-CoYvtMzj.js} +3 -3
  131. package/dashboard/dist/assets/{EscalationListSchemaPage-BeQUTUEO.js.map → EscalationListSchemaPage-CoYvtMzj.js.map} +1 -1
  132. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js +2 -0
  133. package/dashboard/dist/assets/EscalationListView-DWFHPufv.js.map +1 -0
  134. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js → EscalationSchemaPage-C9Xu_A25.js} +3 -3
  135. package/dashboard/dist/assets/{EscalationSchemaPage-D4VlEwyS.js.map → EscalationSchemaPage-C9Xu_A25.js.map} +1 -1
  136. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js +2 -0
  137. package/dashboard/dist/assets/EscalationTimeline-D8W2LNNk.js.map +1 -0
  138. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js +2 -0
  139. package/dashboard/dist/assets/EscalationTitleSelect-DLK8NWMp.js.map +1 -0
  140. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js → EscalationsOverview-CW57FaP9.js} +2 -2
  141. package/dashboard/dist/assets/{EscalationsOverview-Bx6Zrzm-.js.map → EscalationsOverview-CW57FaP9.js.map} +1 -1
  142. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js → EventTable-D1ctWhKf.js} +2 -2
  143. package/dashboard/dist/assets/{EventTable-KEC3YWBf.js.map → EventTable-D1ctWhKf.js.map} +1 -1
  144. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js → FilterBar-C-iur-Nj.js} +2 -2
  145. package/dashboard/dist/assets/{FilterBar-xwN_b5fj.js.map → FilterBar-C-iur-Nj.js.map} +1 -1
  146. package/dashboard/dist/assets/GraphInvokePage-CcA_44M4.js +2 -0
  147. package/dashboard/dist/assets/{GraphInvokePage-DV7Y0fe2.js.map → GraphInvokePage-CcA_44M4.js.map} +1 -1
  148. package/dashboard/dist/assets/HomePage-Dc085ghJ.js +2 -0
  149. package/dashboard/dist/assets/{HomePage-G785SWcW.js.map → HomePage-Dc085ghJ.js.map} +1 -1
  150. package/dashboard/dist/assets/ListToolbar-h_ziBt4O.js +2 -0
  151. package/dashboard/dist/assets/{ListToolbar-zPVYPg3W.js.map → ListToolbar-h_ziBt4O.js.map} +1 -1
  152. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js → McpOverview-qXXhbNWV.js} +2 -2
  153. package/dashboard/dist/assets/{McpOverview-CMGUq8hx.js.map → McpOverview-qXXhbNWV.js.map} +1 -1
  154. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js → McpQueryDetailPage-SEzSbZrd.js} +2 -2
  155. package/dashboard/dist/assets/{McpQueryDetailPage-CdhLhaKn.js.map → McpQueryDetailPage-SEzSbZrd.js.map} +1 -1
  156. package/dashboard/dist/assets/McpQueryPage-Cy0V0kv9.js +2 -0
  157. package/dashboard/dist/assets/{McpQueryPage-CNSNMagY.js.map → McpQueryPage-Cy0V0kv9.js.map} +1 -1
  158. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js → McpRunDetailPage-DjJO5vSb.js} +2 -2
  159. package/dashboard/dist/assets/{McpRunDetailPage-DBm8hUaW.js.map → McpRunDetailPage-DjJO5vSb.js.map} +1 -1
  160. package/dashboard/dist/assets/McpRunsPage-BfjiJ8mM.js +2 -0
  161. package/dashboard/dist/assets/{McpRunsPage-B6rb5QBf.js.map → McpRunsPage-BfjiJ8mM.js.map} +1 -1
  162. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
  163. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
  164. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js +3 -0
  165. package/dashboard/dist/assets/OperationsPage-dJcER0T_.js.map +1 -0
  166. package/dashboard/dist/assets/OperatorDashboard-zCkW4eqk.js +2 -0
  167. package/dashboard/dist/assets/{OperatorDashboard-DBOscDnf.js.map → OperatorDashboard-zCkW4eqk.js.map} +1 -1
  168. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
  169. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
  170. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
  171. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
  172. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js → PersonaDetailPage-Cx6L3Jvu.js} +2 -2
  173. package/dashboard/dist/assets/{PersonaDetailPage-BGRdGpeR.js.map → PersonaDetailPage-Cx6L3Jvu.js.map} +1 -1
  174. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js → PersonasPage-DOgGUlJl.js} +2 -2
  175. package/dashboard/dist/assets/{PersonasPage-DRzOZcVa.js.map → PersonasPage-DOgGUlJl.js.map} +1 -1
  176. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js +2 -0
  177. package/dashboard/dist/assets/PortalPage-BKuL1BeJ.js.map +1 -0
  178. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js → ProcessDetailPage-BFcFSDUv.js} +2 -2
  179. package/dashboard/dist/assets/{ProcessDetailPage-BLGjZXpM.js.map → ProcessDetailPage-BFcFSDUv.js.map} +1 -1
  180. package/dashboard/dist/assets/ProcessesListPage-BaHV2cXp.js +2 -0
  181. package/dashboard/dist/assets/{ProcessesListPage-5NnysKFC.js.map → ProcessesListPage-BaHV2cXp.js.map} +1 -1
  182. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js +7 -0
  183. package/dashboard/dist/assets/ResolverForm-Bgc0Zrya.js.map +1 -0
  184. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js +8 -0
  185. package/dashboard/dist/assets/RoleDetailPage-BPY6i3CU.js.map +1 -0
  186. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
  187. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
  188. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js → RolesPage-DSqqKPbv.js} +2 -2
  189. package/dashboard/dist/assets/{RolesPage-BmW1LzkU.js.map → RolesPage-DSqqKPbv.js.map} +1 -1
  190. package/dashboard/dist/assets/RunAsSelector-B29iWwel.js +2 -0
  191. package/dashboard/dist/assets/{RunAsSelector-BwZTJ4Yj.js.map → RunAsSelector-B29iWwel.js.map} +1 -1
  192. package/dashboard/dist/assets/ScanCodesPage-S8aAJfnC.js +2 -0
  193. package/dashboard/dist/assets/{ScanCodesPage-FiYIYB-m.js.map → ScanCodesPage-S8aAJfnC.js.map} +1 -1
  194. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js → ScanSchemeDetailPage-CUBRAtmJ.js} +2 -2
  195. package/dashboard/dist/assets/{ScanSchemeDetailPage-BiAqtD-a.js.map → ScanSchemeDetailPage-CUBRAtmJ.js.map} +1 -1
  196. package/dashboard/dist/assets/ScanStationPage-R9t1-CeQ.js +2 -0
  197. package/dashboard/dist/assets/{ScanStationPage-8CdOtbCD.js.map → ScanStationPage-R9t1-CeQ.js.map} +1 -1
  198. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
  199. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
  200. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js → StickyPagination-CkW_A507.js} +2 -2
  201. package/dashboard/dist/assets/{StickyPagination-DRuqKhZt.js.map → StickyPagination-CkW_A507.js.map} +1 -1
  202. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js → StreamMessageDetail-yzWX0wac.js} +2 -2
  203. package/dashboard/dist/assets/{StreamMessageDetail-JwlbRiMn.js.map → StreamMessageDetail-yzWX0wac.js.map} +1 -1
  204. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js → SwimlaneTimeline-Cf4DXFxj.js} +2 -2
  205. package/dashboard/dist/assets/{SwimlaneTimeline-hu3c4bCJ.js.map → SwimlaneTimeline-Cf4DXFxj.js.map} +1 -1
  206. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
  207. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
  208. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js → TaskDetailPage-DCDcEps9.js} +2 -2
  209. package/dashboard/dist/assets/{TaskDetailPage-NqVZF3jW.js.map → TaskDetailPage-DCDcEps9.js.map} +1 -1
  210. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
  211. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
  212. package/dashboard/dist/assets/TasksListPage-BBATgpf7.js +2 -0
  213. package/dashboard/dist/assets/{TasksListPage-BQNaSzCn.js.map → TasksListPage-BBATgpf7.js.map} +1 -1
  214. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js → TimeAgo-CSNVEjch.js} +2 -2
  215. package/dashboard/dist/assets/{TimeAgo-Cv35DOiI.js.map → TimeAgo-CSNVEjch.js.map} +1 -1
  216. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js → TimestampCell-Du1nBrPn.js} +2 -2
  217. package/dashboard/dist/assets/{TimestampCell-DHUXey9s.js.map → TimestampCell-Du1nBrPn.js.map} +1 -1
  218. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
  219. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
  220. package/dashboard/dist/assets/ToolTestPanel-CF-h_5Rg.js +2 -0
  221. package/dashboard/dist/assets/{ToolTestPanel-DvuLFWqQ.js.map → ToolTestPanel-CF-h_5Rg.js.map} +1 -1
  222. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js → TopicDetailPage-Dr1UmWcp.js} +3 -3
  223. package/dashboard/dist/assets/{TopicDetailPage-TXX3QNSo.js.map → TopicDetailPage-Dr1UmWcp.js.map} +1 -1
  224. package/dashboard/dist/assets/TopicsPage-CUUo-Ylf.js +2 -0
  225. package/dashboard/dist/assets/{TopicsPage-h-oyTeEJ.js.map → TopicsPage-CUUo-Ylf.js.map} +1 -1
  226. package/dashboard/dist/assets/{UserName-BceRCeDF.js → UserName-kBh1dc39.js} +2 -2
  227. package/dashboard/dist/assets/{UserName-BceRCeDF.js.map → UserName-kBh1dc39.js.map} +1 -1
  228. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js → WorkflowExecutionPage-CCRSbnDx.js} +2 -2
  229. package/dashboard/dist/assets/{WorkflowExecutionPage-CmHGcaN9.js.map → WorkflowExecutionPage-CCRSbnDx.js.map} +1 -1
  230. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
  231. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
  232. package/dashboard/dist/assets/WorkflowsDashboard-BNQVvyek.js +2 -0
  233. package/dashboard/dist/assets/{WorkflowsDashboard-B0r2lQXk.js.map → WorkflowsDashboard-BNQVvyek.js.map} +1 -1
  234. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js → WorkflowsOverview-DswubNJN.js} +2 -2
  235. package/dashboard/dist/assets/{WorkflowsOverview-BTMc2PJ_.js.map → WorkflowsOverview-DswubNJN.js.map} +1 -1
  236. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js → YamlWorkflowDetailPage-Cw9Dlmup.js} +11 -11
  237. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DUiCVnZp.js.map → YamlWorkflowDetailPage-Cw9Dlmup.js.map} +1 -1
  238. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js → YamlWorkflowsPage-DB8xnIXy.js} +2 -2
  239. package/dashboard/dist/assets/{YamlWorkflowsPage-BAuXfwi0.js.map → YamlWorkflowsPage-DB8xnIXy.js.map} +1 -1
  240. package/dashboard/dist/assets/{agents-BvmLCk4h.js → agents-BwEnf6N9.js} +2 -2
  241. package/dashboard/dist/assets/{agents-BvmLCk4h.js.map → agents-BwEnf6N9.js.map} +1 -1
  242. package/dashboard/dist/assets/{bots-f_tyhl4I.js → bots-CCmJTT2u.js} +2 -2
  243. package/dashboard/dist/assets/{bots-f_tyhl4I.js.map → bots-CCmJTT2u.js.map} +1 -1
  244. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js → capabilities-BZHgp_nh.js} +2 -2
  245. package/dashboard/dist/assets/{capabilities-DNo5bqLx.js.map → capabilities-BZHgp_nh.js.map} +1 -1
  246. package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
  247. package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
  248. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js → controlplane-CyfwUlFA.js} +2 -2
  249. package/dashboard/dist/assets/{controlplane-Dyyj2Irb.js.map → controlplane-CyfwUlFA.js.map} +1 -1
  250. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js +2 -0
  251. package/dashboard/dist/assets/escalation-columns-BJPTNmLW.js.map +1 -0
  252. package/dashboard/dist/assets/index-3gbd5neL.js +67 -0
  253. package/dashboard/dist/assets/index-3gbd5neL.js.map +1 -0
  254. package/dashboard/dist/assets/index-BAAVTyZ-.js +2 -0
  255. package/dashboard/dist/assets/{index-DL83W7Gu.js.map → index-BAAVTyZ-.js.map} +1 -1
  256. package/dashboard/dist/assets/{index-CsKiRyhy.js → index-BC6Jenlo.js} +2 -2
  257. package/dashboard/dist/assets/{index-CsKiRyhy.js.map → index-BC6Jenlo.js.map} +1 -1
  258. package/dashboard/dist/assets/index-C7KHqOTQ.js +2 -0
  259. package/dashboard/dist/assets/{index-D7ESqn22.js.map → index-C7KHqOTQ.js.map} +1 -1
  260. package/dashboard/dist/assets/index-CDrqqbSR.js +3 -0
  261. package/dashboard/dist/assets/index-CDrqqbSR.js.map +1 -0
  262. package/dashboard/dist/assets/index-CVwzCZ43.js +2 -0
  263. package/dashboard/dist/assets/{index-DvxxrFBo.js.map → index-CVwzCZ43.js.map} +1 -1
  264. package/dashboard/dist/assets/index-CaGF6TCC.js +2 -0
  265. package/dashboard/dist/assets/index-CaGF6TCC.js.map +1 -0
  266. package/dashboard/dist/assets/index-ClVbfe4z.js +13 -0
  267. package/dashboard/dist/assets/index-ClVbfe4z.js.map +1 -0
  268. package/dashboard/dist/assets/{index-DWse7ERF.js → index-CuVkSmj5.js} +2 -2
  269. package/dashboard/dist/assets/{index-DWse7ERF.js.map → index-CuVkSmj5.js.map} +1 -1
  270. package/dashboard/dist/assets/{index-PcyGjmBm.js → index-DAuX_PlL.js} +2 -2
  271. package/dashboard/dist/assets/{index-PcyGjmBm.js.map → index-DAuX_PlL.js.map} +1 -1
  272. package/dashboard/dist/assets/{index-e2X-s0EQ.js → index-DBWS5QL8.js} +2 -2
  273. package/dashboard/dist/assets/{index-e2X-s0EQ.js.map → index-DBWS5QL8.js.map} +1 -1
  274. package/dashboard/dist/assets/index-DIWCI6HC.js +2 -0
  275. package/dashboard/dist/assets/{index-BNZknxFY.js.map → index-DIWCI6HC.js.map} +1 -1
  276. package/dashboard/dist/assets/{index-C-Xr2V3F.js → index-DZ8X_Gp4.js} +2 -2
  277. package/dashboard/dist/assets/{index-C-Xr2V3F.js.map → index-DZ8X_Gp4.js.map} +1 -1
  278. package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
  279. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js → knowledge-CqyLhUMg.js} +2 -2
  280. package/dashboard/dist/assets/{knowledge-Coo6CKzo.js.map → knowledge-CqyLhUMg.js.map} +1 -1
  281. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js → mcp-Cvu6bFYH.js} +2 -2
  282. package/dashboard/dist/assets/{mcp-Cz5eFnP_.js.map → mcp-Cvu6bFYH.js.map} +1 -1
  283. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js → mcp-query-qC6A3e9l.js} +2 -2
  284. package/dashboard/dist/assets/{mcp-query-BtnuO4LF.js.map → mcp-query-qC6A3e9l.js.map} +1 -1
  285. package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
  286. package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
  287. package/dashboard/dist/assets/{personas-C2-LgpHQ.js → personas-BKN_lJuV.js} +2 -2
  288. package/dashboard/dist/assets/{personas-C2-LgpHQ.js.map → personas-BKN_lJuV.js.map} +1 -1
  289. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js → pipelines-BldIfv85.js} +2 -2
  290. package/dashboard/dist/assets/{pipelines-TuXQvUA-.js.map → pipelines-BldIfv85.js.map} +1 -1
  291. package/dashboard/dist/assets/{tasks-OUzpu__z.js → tasks-B-Uay8uL.js} +2 -2
  292. package/dashboard/dist/assets/{tasks-OUzpu__z.js.map → tasks-B-Uay8uL.js.map} +1 -1
  293. package/dashboard/dist/assets/{topics-B8bdrBaW.js → topics-438EQogt.js} +2 -2
  294. package/dashboard/dist/assets/{topics-B8bdrBaW.js.map → topics-438EQogt.js.map} +1 -1
  295. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
  296. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
  297. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js → useDebouncedValue-Cw8hYZ8y.js} +2 -2
  298. package/dashboard/dist/assets/{useDebouncedValue-Cp5ZOtVE.js.map → useDebouncedValue-Cw8hYZ8y.js.map} +1 -1
  299. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js → useNamespace-D1218GQ8.js} +2 -2
  300. package/dashboard/dist/assets/{useNamespace-DtQe3wZ5.js.map → useNamespace-D1218GQ8.js.map} +1 -1
  301. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js → useYamlActivityEvents-BAQf_y_U.js} +2 -2
  302. package/dashboard/dist/assets/{useYamlActivityEvents-CS22c15X.js.map → useYamlActivityEvents-BAQf_y_U.js.map} +1 -1
  303. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
  304. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
  305. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js → yaml-workflows-CN01gEB0.js} +2 -2
  306. package/dashboard/dist/assets/{yaml-workflows-HQIki3hI.js.map → yaml-workflows-CN01gEB0.js.map} +1 -1
  307. package/dashboard/dist/index.html +3 -3
  308. package/docs/accumulator.md +113 -0
  309. package/docs/api/http/escalations.md +89 -0
  310. package/docs/api/http/roles.md +1 -0
  311. package/docs/api/http/workflows.md +28 -1
  312. package/docs/api/mcp/admin.md +40 -4
  313. package/docs/api/sdk/escalations.md +91 -0
  314. package/docs/api/sdk/roles.md +2 -0
  315. package/docs/architecture.md +1 -1
  316. package/docs/code-owned-configuration.md +3 -2
  317. package/docs/dashboard.md +11 -5
  318. package/docs/hitl/design.md +1 -1
  319. package/docs/hitl/escalation.md +37 -1
  320. package/docs/hitl/form.md +12 -7
  321. package/docs/hitl/invoke-form.md +10 -3
  322. package/docs/hitl/lookups.md +21 -0
  323. package/docs/hitl/pinned-views.md +4 -0
  324. package/docs/hitl/portal.md +97 -0
  325. package/docs/hitl/resolution.md +41 -0
  326. package/docs/hitl/x-lt-embed.md +1 -1
  327. package/docs/hitl/x-lt-invoke.md +95 -0
  328. package/docs/hitl/x-lt-list-schema.md +3 -1
  329. package/docs/hitl/x-lt-validation.md +50 -3
  330. package/docs/hitl/x-lt-widget.md +22 -0
  331. package/docs/hitl-guide.md +12 -2
  332. package/docs/scan-codes.md +15 -2
  333. package/docs/sdk.md +1 -1
  334. package/docs/workflows.md +2 -2
  335. package/package.json +4 -2
  336. package/dashboard/dist/assets/AgentsPage-D77JeViQ.js +0 -2
  337. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js +0 -2
  338. package/dashboard/dist/assets/AvailableEscalationsPage-CqM_MOMy.js.map +0 -1
  339. package/dashboard/dist/assets/BulkAssignModal-BXiJnlqt.js +0 -2
  340. package/dashboard/dist/assets/CapabilitiesPage-D9TC2iKy.js +0 -2
  341. package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
  342. package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
  343. package/dashboard/dist/assets/EntityTimelinePanel-1lT3jkCM.js +0 -2
  344. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js +0 -2
  345. package/dashboard/dist/assets/EscalationListView-uuZRMSLB.js.map +0 -1
  346. package/dashboard/dist/assets/GraphInvokePage-DV7Y0fe2.js +0 -2
  347. package/dashboard/dist/assets/HomePage-G785SWcW.js +0 -2
  348. package/dashboard/dist/assets/ListToolbar-zPVYPg3W.js +0 -2
  349. package/dashboard/dist/assets/McpQueryPage-CNSNMagY.js +0 -2
  350. package/dashboard/dist/assets/McpRunsPage-B6rb5QBf.js +0 -2
  351. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js +0 -3
  352. package/dashboard/dist/assets/OperationsPage-Dxk1fAMg.js.map +0 -1
  353. package/dashboard/dist/assets/OperatorDashboard-DBOscDnf.js +0 -2
  354. package/dashboard/dist/assets/ProcessesListPage-5NnysKFC.js +0 -2
  355. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js +0 -2
  356. package/dashboard/dist/assets/ResolverForm-Dy0yirtP.js.map +0 -1
  357. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js +0 -8
  358. package/dashboard/dist/assets/RoleDetailPage-C_LIoe1j.js.map +0 -1
  359. package/dashboard/dist/assets/RunAsSelector-BwZTJ4Yj.js +0 -2
  360. package/dashboard/dist/assets/ScanCodesPage-FiYIYB-m.js +0 -2
  361. package/dashboard/dist/assets/ScanStationPage-8CdOtbCD.js +0 -2
  362. package/dashboard/dist/assets/TasksListPage-BQNaSzCn.js +0 -2
  363. package/dashboard/dist/assets/ToolTestPanel-DvuLFWqQ.js +0 -2
  364. package/dashboard/dist/assets/TopicsPage-h-oyTeEJ.js +0 -2
  365. package/dashboard/dist/assets/WorkflowsDashboard-B0r2lQXk.js +0 -2
  366. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js +0 -2
  367. package/dashboard/dist/assets/escalation-columns-DIigeTOK.js.map +0 -1
  368. package/dashboard/dist/assets/index-BMlQYOE1.js +0 -67
  369. package/dashboard/dist/assets/index-BMlQYOE1.js.map +0 -1
  370. package/dashboard/dist/assets/index-BNZknxFY.js +0 -2
  371. package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
  372. package/dashboard/dist/assets/index-CegPUKpc.js +0 -3
  373. package/dashboard/dist/assets/index-CegPUKpc.js.map +0 -1
  374. package/dashboard/dist/assets/index-D7ESqn22.js +0 -2
  375. package/dashboard/dist/assets/index-DL83W7Gu.js +0 -2
  376. package/dashboard/dist/assets/index-DPLssnMW.js +0 -6
  377. package/dashboard/dist/assets/index-DPLssnMW.js.map +0 -1
  378. package/dashboard/dist/assets/index-DoETPlJP.js +0 -11
  379. package/dashboard/dist/assets/index-DoETPlJP.js.map +0 -1
  380. package/dashboard/dist/assets/index-DvxxrFBo.js +0 -2
  381. package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
  382. package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
  383. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js +0 -2
  384. package/dashboard/dist/assets/resolver-payload-C1dXB3n6.js.map +0 -1
  385. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js +0 -2
  386. package/dashboard/dist/assets/seed-form-json-DvPsISxD.js.map +0 -1
  387. package/docs/compilation.md +0 -152
  388. package/docs/compiler.md +0 -311
  389. package/docs/contributing.md +0 -56
  390. package/docs/design-principles.md +0 -244
  391. package/docs/schema-exchange.md +0 -173
  392. package/docs/self-test.md +0 -106
  393. package/docs/story.md +0 -184
@@ -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
@@ -54,6 +54,15 @@ router.get('/:type/config', async (req, res) => {
54
54
  const result = await api.getWorkflowConfig({ type: req.params.type });
55
55
  res.status(result.status).json(result.data ?? { error: result.error });
56
56
  });
57
+ /**
58
+ * GET /api/workflows/:type/input-lookups
59
+ * Resolve the versioned knowledge lookups pinned on a workflow config.
60
+ * Open to any caller the invoke gate admits for that workflow.
61
+ */
62
+ router.get('/:type/input-lookups', async (req, res) => {
63
+ const result = await api.getWorkflowInputLookups({ type: req.params.type }, { userId: req.auth?.userId ?? '', role: req.auth?.role, scopes: req.auth?.scopes });
64
+ res.status(result.status).json(result.data ?? { error: result.error });
65
+ });
57
66
  /**
58
67
  * PUT /api/workflows/:type/config
59
68
  * Create or replace a workflow configuration.
@@ -75,6 +84,7 @@ router.put('/:type/config', auth_1.requireAdmin, async (req, res) => {
75
84
  envelope_schema: req.body.envelope_schema,
76
85
  input_schema: req.body.input_schema,
77
86
  icon: req.body.icon,
87
+ input_lookups: req.body.input_lookups,
78
88
  resolver_schema: req.body.resolver_schema,
79
89
  cron_schedule: req.body.cron_schedule,
80
90
  });
@@ -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),
@@ -18,6 +18,7 @@ async function loadAllConfigs() {
18
18
  envelopeSchema: c.envelope_schema ?? null,
19
19
  inputSchema: c.input_schema ?? null,
20
20
  icon: c.icon ?? null,
21
+ inputLookups: c.input_lookups ?? null,
21
22
  resolverSchema: c.resolver_schema ?? null,
22
23
  cronSchedule: c.cron_schedule ?? null,
23
24
  executeAs: c.execute_as ?? null,
@@ -28,6 +28,7 @@ async function getWorkflowConfig(workflowType) {
28
28
  envelope_schema: wf.envelope_schema ?? null,
29
29
  input_schema: wf.input_schema ?? null,
30
30
  icon: wf.icon ?? null,
31
+ input_lookups: wf.input_lookups ?? null,
31
32
  resolver_schema: wf.resolver_schema ?? null,
32
33
  cron_schedule: wf.cron_schedule ?? null,
33
34
  execute_as: wf.execute_as ?? null,
@@ -68,6 +69,7 @@ async function listWorkflowConfigs() {
68
69
  envelope_schema: wf.envelope_schema ?? null,
69
70
  input_schema: wf.input_schema ?? null,
70
71
  icon: wf.icon ?? null,
72
+ input_lookups: wf.input_lookups ?? null,
71
73
  resolver_schema: wf.resolver_schema ?? null,
72
74
  cron_schedule: wf.cron_schedule ?? null,
73
75
  execute_as: wf.execute_as ?? null,
@@ -5,13 +5,13 @@ export declare const LIST_ALL_WORKFLOWS = "SELECT * FROM lt_config_workflows ORD
5
5
  export declare const LIST_ALL_ROLES = "SELECT * FROM lt_config_roles ORDER BY workflow_type, role";
6
6
  export declare const LIST_ALL_INVOCATION_ROLES = "SELECT * FROM lt_config_invocation_roles ORDER BY workflow_type, role";
7
7
  export declare const ENSURE_ROLE_EXISTS = "INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING";
8
- export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as,\n certified = EXCLUDED.certified,\n read_safe = EXCLUDED.read_safe,\n input_schema = EXCLUDED.input_schema,\n icon = EXCLUDED.icon";
8
+ export declare const UPSERT_WORKFLOW = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)\nON CONFLICT (workflow_type) DO UPDATE SET\n invocable = EXCLUDED.invocable,\n task_queue = EXCLUDED.task_queue,\n default_role = EXCLUDED.default_role,\n description = EXCLUDED.description,\n consumes = EXCLUDED.consumes,\n envelope_schema = EXCLUDED.envelope_schema,\n resolver_schema = EXCLUDED.resolver_schema,\n cron_schedule = EXCLUDED.cron_schedule,\n tool_tags = EXCLUDED.tool_tags,\n execute_as = EXCLUDED.execute_as,\n certified = EXCLUDED.certified,\n read_safe = EXCLUDED.read_safe,\n input_schema = EXCLUDED.input_schema,\n icon = EXCLUDED.icon,\n input_lookups = EXCLUDED.input_lookups";
9
9
  export declare const DELETE_CONFIG_ROLES = "DELETE FROM lt_config_roles WHERE workflow_type = $1";
10
10
  export declare const INSERT_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)";
11
11
  export declare const DELETE_INVOCATION_ROLES = "DELETE FROM lt_config_invocation_roles WHERE workflow_type = $1";
12
12
  export declare const INSERT_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)";
13
13
  export declare const DELETE_WORKFLOW = "DELETE FROM lt_config_workflows WHERE workflow_type = $1";
14
- export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (workflow_type) DO NOTHING";
14
+ export declare const SEED_WORKFLOW_CONFIG = "INSERT INTO lt_config_workflows\n (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)\nON CONFLICT (workflow_type) DO NOTHING";
15
15
  export declare const SEED_CONFIG_ROLE = "INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
16
16
  export declare const SEED_INVOCATION_ROLE = "INSERT INTO lt_config_invocation_roles (workflow_type, role) VALUES ($1, $2)\nON CONFLICT (workflow_type, role) DO NOTHING";
17
17
  export declare const GET_PROVIDER_DATA = "SELECT workflow_type, data, completed_at\n FROM lt_tasks\n WHERE origin_id = $1\n AND workflow_type = ANY($2)\n AND status = 'completed'\n ORDER BY completed_at DESC";
@@ -23,8 +23,8 @@ exports.ENSURE_ROLE_EXISTS = `\
23
23
  INSERT INTO lt_roles (role) VALUES ($1) ON CONFLICT DO NOTHING`;
24
24
  exports.UPSERT_WORKFLOW = `\
25
25
  INSERT INTO lt_config_workflows
26
- (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)
27
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
26
+ (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)
27
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
28
28
  ON CONFLICT (workflow_type) DO UPDATE SET
29
29
  invocable = EXCLUDED.invocable,
30
30
  task_queue = EXCLUDED.task_queue,
@@ -39,7 +39,8 @@ ON CONFLICT (workflow_type) DO UPDATE SET
39
39
  certified = EXCLUDED.certified,
40
40
  read_safe = EXCLUDED.read_safe,
41
41
  input_schema = EXCLUDED.input_schema,
42
- icon = EXCLUDED.icon`;
42
+ icon = EXCLUDED.icon,
43
+ input_lookups = EXCLUDED.input_lookups`;
43
44
  exports.DELETE_CONFIG_ROLES = `\
44
45
  DELETE FROM lt_config_roles WHERE workflow_type = $1`;
45
46
  exports.INSERT_CONFIG_ROLE = `\
@@ -55,8 +56,8 @@ DELETE FROM lt_config_workflows WHERE workflow_type = $1`;
55
56
  // ------------------------------------------------------------------ //
56
57
  exports.SEED_WORKFLOW_CONFIG = `\
57
58
  INSERT INTO lt_config_workflows
58
- (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon)
59
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
59
+ (workflow_type, invocable, task_queue, default_role, description, consumes, envelope_schema, resolver_schema, cron_schedule, tool_tags, execute_as, certified, read_safe, input_schema, icon, input_lookups)
60
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
60
61
  ON CONFLICT (workflow_type) DO NOTHING`;
61
62
  exports.SEED_CONFIG_ROLE = `\
62
63
  INSERT INTO lt_config_roles (workflow_type, role) VALUES ($1, $2)
@@ -14,6 +14,10 @@ const sql_1 = require("./sql");
14
14
  * seed blocks without `certified`): derived from roles/consumes presence —
15
15
  * the rule that governed the tier before the flag existed.
16
16
  */
17
+ /** pg binds JS arrays as Postgres arrays; jsonb columns take the JSON text. */
18
+ function toJsonb(value) {
19
+ return value == null ? null : JSON.stringify(value);
20
+ }
17
21
  function resolveCertified(config) {
18
22
  return (config.certified ??
19
23
  ((config.roles?.length ?? 0) > 0 || (config.consumes?.length ?? 0) > 0));
@@ -55,6 +59,7 @@ async function replaceWorkflowConfig(config, certified) {
55
59
  config.read_safe ?? false,
56
60
  config.input_schema ?? null,
57
61
  config.icon ?? null,
62
+ toJsonb(config.input_lookups),
58
63
  ]);
59
64
  // Replace roles
60
65
  await client.query(sql_1.DELETE_CONFIG_ROLES, [config.workflow_type]);
@@ -118,6 +123,7 @@ async function seedWorkflowConfig(config) {
118
123
  config.read_safe ?? false,
119
124
  config.input_schema ?? null,
120
125
  config.icon ?? null,
126
+ toJsonb(config.input_lookups),
121
127
  ]);
122
128
  const inserted = (rowCount ?? 0) > 0;
123
129
  if (inserted) {
@@ -152,6 +158,8 @@ async function seedWorkflowConfig(config) {
152
158
  drifts.push('input_schema');
153
159
  if ((config.icon ?? null) !== (existing.icon ?? null))
154
160
  drifts.push('icon');
161
+ if (JSON.stringify(config.input_lookups ?? null) !== JSON.stringify(existing.input_lookups ?? null))
162
+ drifts.push('input_lookups');
155
163
  if (drifts.length) {
156
164
  logger_1.loggerRegistry.warn(`[long-tail] config drift: ${config.workflow_type} — ${drifts.join(', ')} differ between code and DB`);
157
165
  }
@@ -191,7 +199,8 @@ async function applyWorkflowConfig(config) {
191
199
  (0, node_util_1.isDeepStrictEqual)(existing.envelope_schema ?? null, config.envelope_schema ?? null) &&
192
200
  (0, node_util_1.isDeepStrictEqual)(existing.resolver_schema ?? null, config.resolver_schema ?? null) &&
193
201
  (0, node_util_1.isDeepStrictEqual)(existing.input_schema ?? null, config.input_schema ?? null) &&
194
- (existing.icon ?? null) === (config.icon ?? null);
202
+ (existing.icon ?? null) === (config.icon ?? null) &&
203
+ (0, node_util_1.isDeepStrictEqual)(existing.input_lookups ?? null, config.input_lookups ?? null);
195
204
  if (unchanged)
196
205
  return 'unchanged';
197
206
  }
@@ -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>;
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.accumulateItem = accumulateItem;
4
+ exports.accumulateItemBySignalKey = accumulateItemBySignalKey;
5
+ exports.accumulateItemByMetadata = accumulateItemByMetadata;
6
+ exports.removeAccumulatedItem = removeAccumulatedItem;
7
+ exports.removeAccumulatedItemBySignalKey = removeAccumulatedItemBySignalKey;
8
+ exports.removeAccumulatedItemByMetadata = removeAccumulatedItemByMetadata;
9
+ const escalation_wire_1 = require("../../lib/events/escalation-wire");
10
+ const uuid_1 = require("../../lib/uuid");
11
+ const client_1 = require("./client");
12
+ const crud_1 = require("./crud");
13
+ const map_1 = require("./map");
14
+ const NOT_FOUND = { outcome: 'not-found', count: -1, remaining: null, escalation: null };
15
+ const RECIPROCAL_NOT_FOUND = { ...NOT_FOUND, outcome: 'reciprocal-not-found' };
16
+ function reciprocalIdValid(reciprocal) {
17
+ return !reciprocal?.id || (0, uuid_1.isUuid)(reciprocal.id);
18
+ }
19
+ /**
20
+ * Adds one item to an accumulator escalation in a single atomic SDK
21
+ * statement (guarded append + facet recompute + resolve-and-wake at max,
22
+ * with the reciprocal row written in the same statement or not at all).
23
+ * Interim adds publish `escalation.updated` with the count; a completing
24
+ * add publishes the standard `escalation.resolved`. Both rows publish.
25
+ * Failure outcomes publish nothing because no row changed.
26
+ */
27
+ async function accumulateItem(id, input) {
28
+ if (!(0, uuid_1.isUuid)(id))
29
+ return NOT_FOUND;
30
+ if (!reciprocalIdValid(input.reciprocal))
31
+ return RECIPROCAL_NOT_FOUND;
32
+ const client = await (0, client_1.escalations)();
33
+ const result = await client.accumulateItem({ id, ...input });
34
+ return settleAccumulateOutcome(result, input);
35
+ }
36
+ /** Add selecting the container by its `signal_key`, the deterministic home signal id. */
37
+ async function accumulateItemBySignalKey(signalKey, input) {
38
+ if (!reciprocalIdValid(input.reciprocal))
39
+ return RECIPROCAL_NOT_FOUND;
40
+ const client = await (0, client_1.escalations)();
41
+ const result = await client.accumulateItem({ signalKey, ...input });
42
+ return settleAccumulateOutcome(result, input);
43
+ }
44
+ /** Add selecting the container by metadata facet, scoped by `roles`. */
45
+ async function accumulateItemByMetadata(key, value, input) {
46
+ if (!reciprocalIdValid(input.reciprocal))
47
+ return RECIPROCAL_NOT_FOUND;
48
+ const client = await (0, client_1.escalations)();
49
+ const result = await client.accumulateItemByMetadata({ key, value, ...input });
50
+ return settleAccumulateOutcome(result, input);
51
+ }
52
+ /**
53
+ * Removes one held item from a pending accumulator escalation (and the
54
+ * container's id from the reciprocal row) in one guarded statement. The
55
+ * waiter never wakes; both rows publish `escalation.updated`.
56
+ */
57
+ async function removeAccumulatedItem(id, input) {
58
+ if (!(0, uuid_1.isUuid)(id))
59
+ return { outcome: 'not-found', count: -1, escalation: null };
60
+ if (!reciprocalIdValid(input.reciprocal))
61
+ return { outcome: 'reciprocal-not-found', count: -1, escalation: null };
62
+ const client = await (0, client_1.escalations)();
63
+ const result = await client.removeAccumulatedItem({ id, ...input });
64
+ return settleRemoveOutcome(result, input);
65
+ }
66
+ async function removeAccumulatedItemBySignalKey(signalKey, input) {
67
+ if (!reciprocalIdValid(input.reciprocal))
68
+ return { outcome: 'reciprocal-not-found', count: -1, escalation: null };
69
+ const client = await (0, client_1.escalations)();
70
+ const result = await client.removeAccumulatedItem({ signalKey, ...input });
71
+ return settleRemoveOutcome(result, input);
72
+ }
73
+ async function removeAccumulatedItemByMetadata(key, value, input) {
74
+ if (!reciprocalIdValid(input.reciprocal))
75
+ return { outcome: 'reciprocal-not-found', count: -1, escalation: null };
76
+ const client = await (0, client_1.escalations)();
77
+ const result = await client.removeAccumulatedItemByMetadata({ key, value, ...input });
78
+ return settleRemoveOutcome(result, input);
79
+ }
80
+ function publishSide(escalation, completed, data) {
81
+ (0, crud_1.publishEscalationChange)({
82
+ type: completed ? 'escalation.resolved' : 'escalation.updated',
83
+ source: 'service',
84
+ workflowId: escalation.workflow_id || '',
85
+ workflowName: escalation.workflow_type || '',
86
+ taskQueue: escalation.task_queue || '',
87
+ escalationId: escalation.id,
88
+ role: escalation.role,
89
+ status: completed ? 'resolved' : 'pending',
90
+ data: (0, escalation_wire_1.escalationEventData)(escalation, data),
91
+ });
92
+ }
93
+ function settleAccumulateOutcome(result, input) {
94
+ if (!result.ok) {
95
+ return { outcome: result.outcome, count: -1, remaining: null, escalation: null };
96
+ }
97
+ const escalation = (0, map_1.toEscalationRecord)(result.entry);
98
+ const reciprocal = result.reciprocal
99
+ ? {
100
+ outcome: result.reciprocal.outcome,
101
+ count: result.reciprocal.count,
102
+ remaining: result.reciprocal.remaining,
103
+ escalation: (0, map_1.toEscalationRecord)(result.reciprocal.entry),
104
+ }
105
+ : undefined;
106
+ publishSide(escalation, result.outcome === 'completed', {
107
+ item_key: input.itemKey,
108
+ count: result.count,
109
+ remaining: result.remaining,
110
+ actor: input.actor ?? null,
111
+ reciprocal_id: reciprocal?.escalation.id ?? null,
112
+ });
113
+ if (reciprocal) {
114
+ publishSide(reciprocal.escalation, reciprocal.outcome === 'completed', {
115
+ item_key: escalation.id,
116
+ count: reciprocal.count,
117
+ remaining: reciprocal.remaining,
118
+ actor: input.actor ?? null,
119
+ reciprocal_id: escalation.id,
120
+ });
121
+ }
122
+ return {
123
+ outcome: result.outcome,
124
+ count: result.count,
125
+ remaining: result.remaining,
126
+ escalation,
127
+ ...(reciprocal ? { reciprocal } : {}),
128
+ };
129
+ }
130
+ function settleRemoveOutcome(result, input) {
131
+ if (!result.ok)
132
+ return { outcome: result.outcome, count: -1, escalation: null };
133
+ const escalation = (0, map_1.toEscalationRecord)(result.entry);
134
+ const reciprocal = result.reciprocal
135
+ ? { count: result.reciprocal.count, escalation: (0, map_1.toEscalationRecord)(result.reciprocal.entry) }
136
+ : undefined;
137
+ publishSide(escalation, false, {
138
+ item_key: input.itemKey,
139
+ count: result.count,
140
+ removed: true,
141
+ actor: input.actor ?? null,
142
+ reciprocal_id: reciprocal?.escalation.id ?? null,
143
+ });
144
+ if (reciprocal) {
145
+ publishSide(reciprocal.escalation, false, {
146
+ item_key: escalation.id,
147
+ count: reciprocal.count,
148
+ removed: true,
149
+ actor: input.actor ?? null,
150
+ reciprocal_id: escalation.id,
151
+ });
152
+ }
153
+ return { outcome: 'removed', count: result.count, escalation, ...(reciprocal ? { reciprocal } : {}) };
154
+ }
@@ -1,6 +1,7 @@
1
1
  export * from './types';
2
2
  export * from './crud';
3
3
  export * from './batch';
4
+ export * from './accumulate';
4
5
  export * from './bulk';
5
6
  export * from './queries';
6
7
  export * from './resolver-validation';
@@ -18,6 +18,7 @@ exports.AnalyticsInputError = exports.resetAnalyticsCaches = exports.resolveEnti
18
18
  __exportStar(require("./types"), exports);
19
19
  __exportStar(require("./crud"), exports);
20
20
  __exportStar(require("./batch"), exports);
21
+ __exportStar(require("./accumulate"), exports);
21
22
  __exportStar(require("./bulk"), exports);
22
23
  __exportStar(require("./queries"), exports);
23
24
  __exportStar(require("./resolver-validation"), exports);
@@ -1,4 +1,5 @@
1
1
  export * from './lookup-cache';
2
+ export * from './lookup-refs';
2
3
  export interface KnowledgeVersionMeta {
3
4
  version: number;
4
5
  change_summary: string | null;
@@ -24,6 +24,7 @@ exports.listKnowledgeVersions = listKnowledgeVersions;
24
24
  const db_1 = require("../../lib/db");
25
25
  const sql_1 = require("./sql");
26
26
  __exportStar(require("./lookup-cache"), exports);
27
+ __exportStar(require("./lookup-refs"), exports);
27
28
  /** The immutable snapshot at (domain, key, version), uncached full shape. */
28
29
  async function getKnowledgeVersion(domain, key, version) {
29
30
  const pool = (0, db_1.getPool)();
@@ -0,0 +1,7 @@
1
+ import type { EscalationLookupRef } from '../../types/escalation';
2
+ /**
3
+ * One message per ref whose pinned edition does not exist, naming what does.
4
+ * Shape is the caller's job (assertLookupRefs); this answers the second
5
+ * question a saver has: is there an edition behind the pin.
6
+ */
7
+ export declare function describeMissingLookupRefs(refs: EscalationLookupRef[]): Promise<string[]>;