@hotmeshio/long-tail 0.20.0 → 0.21.1

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 (361) hide show
  1. package/README.md +4 -4
  2. package/build/api/escalations/accumulate.d.ts +104 -0
  3. package/build/api/escalations/accumulate.js +541 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +11 -1
  6. package/build/api/roles.d.ts +4 -5
  7. package/build/api/roles.js +53 -4
  8. package/build/api/scan-codes/context.d.ts +14 -1
  9. package/build/api/scan-codes/context.js +30 -2
  10. package/build/api/scan-codes/execute.js +2 -0
  11. package/build/api/scan-codes/identity.js +1 -0
  12. package/build/api/scan-codes/verbs.d.ts +21 -0
  13. package/build/api/scan-codes/verbs.js +122 -3
  14. package/build/index.d.ts +2 -1
  15. package/build/index.js +63 -2
  16. package/build/lib/db/schemas/036_role_portals.sql +12 -0
  17. package/build/routes/escalations/accumulate.d.ts +7 -0
  18. package/build/routes/escalations/accumulate.js +158 -0
  19. package/build/routes/escalations/index.js +5 -0
  20. package/build/sdk/index.d.ts +28 -0
  21. package/build/sdk/index.js +9 -0
  22. package/build/services/escalation/accumulate.d.ts +81 -0
  23. package/build/services/escalation/accumulate.js +154 -0
  24. package/build/services/escalation/index.d.ts +1 -0
  25. package/build/services/escalation/index.js +1 -0
  26. package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
  27. package/build/services/orchestrator/condition.d.ts +40 -3
  28. package/build/services/orchestrator/condition.js +42 -2
  29. package/build/services/role/index.js +1 -0
  30. package/build/services/role/seed.js +6 -1
  31. package/build/services/role/sql.d.ts +6 -3
  32. package/build/services/role/sql.js +7 -2
  33. package/build/services/role/types.d.ts +38 -10
  34. package/build/services/role/types.js +10 -1
  35. package/build/services/scan-code/index.d.ts +1 -1
  36. package/build/services/scan-code/index.js +3 -1
  37. package/build/services/scan-code/parse.d.ts +17 -3
  38. package/build/services/scan-code/parse.js +37 -4
  39. package/build/services/scan-code/validate.js +35 -0
  40. package/build/shared/form-validation/display-only-widgets.d.ts +16 -0
  41. package/build/shared/form-validation/display-only-widgets.js +25 -0
  42. package/build/shared/form-validation/index.d.ts +2 -0
  43. package/build/shared/form-validation/index.js +2 -0
  44. package/build/shared/form-validation/x-lt-bind.d.ts +2 -14
  45. package/build/shared/form-validation/x-lt-bind.js +12 -8
  46. package/build/shared/form-validation/x-lt-invoke.d.ts +38 -0
  47. package/build/shared/form-validation/x-lt-invoke.js +103 -0
  48. package/build/system/mcp-servers/admin/escalations.js +44 -0
  49. package/build/system/mcp-servers/admin/schemas.d.ts +195 -13
  50. package/build/system/mcp-servers/admin/schemas.js +40 -3
  51. package/build/system/mcp-servers/admin/users.js +1 -0
  52. package/build/system/mcp-servers/docs.js +4 -0
  53. package/build/system/mcp-servers/human-queue-schemas.d.ts +85 -0
  54. package/build/system/mcp-servers/human-queue-schemas.js +19 -1
  55. package/build/system/mcp-servers/human-queue.d.ts +2 -0
  56. package/build/system/mcp-servers/human-queue.js +77 -0
  57. package/build/system/seed/tool-manifests-admin.d.ts +1108 -100
  58. package/build/system/seed/tool-manifests-admin.js +4 -1
  59. package/build/system/seed/tool-manifests-escalation.d.ts +174 -0
  60. package/build/system/seed/tool-manifests-escalation.js +56 -0
  61. package/build/tsconfig.tsbuildinfo +1 -1
  62. package/build/types/escalation.d.ts +52 -0
  63. package/build/types/escalation.js +29 -1
  64. package/build/types/index.d.ts +4 -4
  65. package/build/types/index.js +4 -1
  66. package/build/types/scan-code.d.ts +55 -1
  67. package/build/types/scan-code.js +29 -2
  68. package/build/types/startup.d.ts +20 -0
  69. package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js → AdminDashboard-Covdam48.js} +2 -2
  70. package/dashboard/dist/assets/{AdminDashboard-DplvDBti.js.map → AdminDashboard-Covdam48.js.map} +1 -1
  71. package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js → AgentConfigPage-CE1k6J5r.js} +6 -6
  72. package/dashboard/dist/assets/{AgentConfigPage-D8Bf6YxO.js.map → AgentConfigPage-CE1k6J5r.js.map} +1 -1
  73. package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js → AgentDetailPage-CWJZIZP1.js} +3 -3
  74. package/dashboard/dist/assets/{AgentDetailPage-BN8g0Y2G.js.map → AgentDetailPage-CWJZIZP1.js.map} +1 -1
  75. package/dashboard/dist/assets/AgentsPage---Dg5ufF.js +2 -0
  76. package/dashboard/dist/assets/{AgentsPage-7JJBHku8.js.map → AgentsPage---Dg5ufF.js.map} +1 -1
  77. package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js +2 -0
  78. package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js.map +1 -0
  79. package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js → BotPicker-D3drO3-T.js} +2 -2
  80. package/dashboard/dist/assets/{BotPicker-CGCnIz8I.js.map → BotPicker-D3drO3-T.js.map} +1 -1
  81. package/dashboard/dist/assets/BulkAssignModal-BOAWsViq.js +2 -0
  82. package/dashboard/dist/assets/{BulkAssignModal-NJBcoj-f.js.map → BulkAssignModal-BOAWsViq.js.map} +1 -1
  83. package/dashboard/dist/assets/CapabilitiesPage-RGgD3YZO.js +2 -0
  84. package/dashboard/dist/assets/{CapabilitiesPage-F8dpNn9B.js.map → CapabilitiesPage-RGgD3YZO.js.map} +1 -1
  85. package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js → CollapsibleSection-DNkZn87n.js} +2 -2
  86. package/dashboard/dist/assets/{CollapsibleSection-BZW6VpCU.js.map → CollapsibleSection-DNkZn87n.js.map} +1 -1
  87. package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js → ConfirmDeleteModal-BqzOwhPr.js} +2 -2
  88. package/dashboard/dist/assets/{ConfirmDeleteModal-64adXLdq.js.map → ConfirmDeleteModal-BqzOwhPr.js.map} +1 -1
  89. package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js → CountdownTimer-BaexQMK6.js} +2 -2
  90. package/dashboard/dist/assets/{CountdownTimer-BxDub9d2.js.map → CountdownTimer-BaexQMK6.js.map} +1 -1
  91. package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js → CredentialsPage-D7abp0aS.js} +2 -2
  92. package/dashboard/dist/assets/{CredentialsPage-CnLzopLL.js.map → CredentialsPage-D7abp0aS.js.map} +1 -1
  93. package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js → CronLabel-DZiWmTwJ.js} +2 -2
  94. package/dashboard/dist/assets/{CronLabel-CAD5UYDT.js.map → CronLabel-DZiWmTwJ.js.map} +1 -1
  95. package/dashboard/dist/assets/DataTable-spX1dFyb.js +2 -0
  96. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +1 -0
  97. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js → DropZone-f1o-GLM8.js} +2 -2
  98. package/dashboard/dist/assets/{DropZone-XlcY8hEH.js.map → DropZone-f1o-GLM8.js.map} +1 -1
  99. package/dashboard/dist/assets/{ElapsedCell-CwO4ufd0.js → ElapsedCell-BdGO_w4v.js} +2 -2
  100. package/dashboard/dist/assets/{ElapsedCell-CwO4ufd0.js.map → ElapsedCell-BdGO_w4v.js.map} +1 -1
  101. package/dashboard/dist/assets/EntityTimelinePanel-DIDcF5Yu.js +2 -0
  102. package/dashboard/dist/assets/{EntityTimelinePanel-CkF-oW-m.js.map → EntityTimelinePanel-DIDcF5Yu.js.map} +1 -1
  103. package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js → EscalationListSchemaPage-C28rn9XC.js} +3 -3
  104. package/dashboard/dist/assets/{EscalationListSchemaPage-h9JO_q5f.js.map → EscalationListSchemaPage-C28rn9XC.js.map} +1 -1
  105. package/dashboard/dist/assets/EscalationListView-CkBnkpDJ.js +2 -0
  106. package/dashboard/dist/assets/EscalationListView-CkBnkpDJ.js.map +1 -0
  107. package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js → EscalationSchemaPage-W5r0A1kj.js} +3 -3
  108. package/dashboard/dist/assets/{EscalationSchemaPage-mJFL5_Se.js.map → EscalationSchemaPage-W5r0A1kj.js.map} +1 -1
  109. package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js +2 -0
  110. package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js.map +1 -0
  111. package/dashboard/dist/assets/EscalationTitleSelect-CzKfavri.js +2 -0
  112. package/dashboard/dist/assets/EscalationTitleSelect-CzKfavri.js.map +1 -0
  113. package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js → EscalationsOverview-Tdu3Yx2c.js} +2 -2
  114. package/dashboard/dist/assets/{EscalationsOverview-DlXUFqWJ.js.map → EscalationsOverview-Tdu3Yx2c.js.map} +1 -1
  115. package/dashboard/dist/assets/{EventTable-Ike2xchn.js → EventTable-DiIxOJwO.js} +2 -2
  116. package/dashboard/dist/assets/{EventTable-Ike2xchn.js.map → EventTable-DiIxOJwO.js.map} +1 -1
  117. package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js → FilterBar-CvMBCVIo.js} +2 -2
  118. package/dashboard/dist/assets/{FilterBar-DMOR-O1c.js.map → FilterBar-CvMBCVIo.js.map} +1 -1
  119. package/dashboard/dist/assets/GraphInvokePage-DO-yyhi6.js +2 -0
  120. package/dashboard/dist/assets/{GraphInvokePage-CKtvWowP.js.map → GraphInvokePage-DO-yyhi6.js.map} +1 -1
  121. package/dashboard/dist/assets/HomePage-DSS3eHR2.js +2 -0
  122. package/dashboard/dist/assets/{HomePage-BQ3Q791Q.js.map → HomePage-DSS3eHR2.js.map} +1 -1
  123. package/dashboard/dist/assets/ListToolbar-C3-Tqqub.js +2 -0
  124. package/dashboard/dist/assets/{ListToolbar-DdJzj472.js.map → ListToolbar-C3-Tqqub.js.map} +1 -1
  125. package/dashboard/dist/assets/{McpOverview-BbtrduWn.js → McpOverview-DEJmsdVi.js} +2 -2
  126. package/dashboard/dist/assets/{McpOverview-BbtrduWn.js.map → McpOverview-DEJmsdVi.js.map} +1 -1
  127. package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js → McpQueryDetailPage-DYJr16l7.js} +2 -2
  128. package/dashboard/dist/assets/{McpQueryDetailPage-C1L4T-Wt.js.map → McpQueryDetailPage-DYJr16l7.js.map} +1 -1
  129. package/dashboard/dist/assets/McpQueryPage-BBcG_UuU.js +2 -0
  130. package/dashboard/dist/assets/{McpQueryPage-CfJy7HZ7.js.map → McpQueryPage-BBcG_UuU.js.map} +1 -1
  131. package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js → McpRunDetailPage-C6xw0kBg.js} +2 -2
  132. package/dashboard/dist/assets/{McpRunDetailPage-CA9yv7he.js.map → McpRunDetailPage-C6xw0kBg.js.map} +1 -1
  133. package/dashboard/dist/assets/McpRunsPage-CRQqrF4Q.js +2 -0
  134. package/dashboard/dist/assets/{McpRunsPage-D7QXjW9z.js.map → McpRunsPage-CRQqrF4Q.js.map} +1 -1
  135. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js → NamespacePill-DADRJOUl.js} +2 -2
  136. package/dashboard/dist/assets/{NamespacePill-Bb3revqD.js.map → NamespacePill-DADRJOUl.js.map} +1 -1
  137. package/dashboard/dist/assets/OperationsPage-Dlfwzf-0.js +3 -0
  138. package/dashboard/dist/assets/OperationsPage-Dlfwzf-0.js.map +1 -0
  139. package/dashboard/dist/assets/OperatorDashboard-DoiDGZ9R.js +2 -0
  140. package/dashboard/dist/assets/{OperatorDashboard-sXNDh1Ph.js.map → OperatorDashboard-DoiDGZ9R.js.map} +1 -1
  141. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js → PageHeader-Csq434-v.js} +2 -2
  142. package/dashboard/dist/assets/{PageHeader-Di5Sz3an.js.map → PageHeader-Csq434-v.js.map} +1 -1
  143. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js → PageHeaderWithStats-CSnk1p5A.js} +2 -2
  144. package/dashboard/dist/assets/{PageHeaderWithStats-DutKJ-h2.js.map → PageHeaderWithStats-CSnk1p5A.js.map} +1 -1
  145. package/dashboard/dist/assets/{PersonaDetailPage-NeHD-Gra.js → PersonaDetailPage-BzbA4Prr.js} +2 -2
  146. package/dashboard/dist/assets/{PersonaDetailPage-NeHD-Gra.js.map → PersonaDetailPage-BzbA4Prr.js.map} +1 -1
  147. package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js → PersonasPage-B36yn4hU.js} +2 -2
  148. package/dashboard/dist/assets/{PersonasPage-DavKXRWX.js.map → PersonasPage-B36yn4hU.js.map} +1 -1
  149. package/dashboard/dist/assets/PortalPage-BkD4YfDf.js +2 -0
  150. package/dashboard/dist/assets/PortalPage-BkD4YfDf.js.map +1 -0
  151. package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js → ProcessDetailPage-BT0eiBWY.js} +2 -2
  152. package/dashboard/dist/assets/{ProcessDetailPage-DkdKJGe6.js.map → ProcessDetailPage-BT0eiBWY.js.map} +1 -1
  153. package/dashboard/dist/assets/ProcessesListPage-BEqeeNae.js +2 -0
  154. package/dashboard/dist/assets/{ProcessesListPage-CjwVKe32.js.map → ProcessesListPage-BEqeeNae.js.map} +1 -1
  155. package/dashboard/dist/assets/ResolverForm-BwgjIX97.js +7 -0
  156. package/dashboard/dist/assets/ResolverForm-BwgjIX97.js.map +1 -0
  157. package/dashboard/dist/assets/RoleDetailPage-BFuLNJXa.js +8 -0
  158. package/dashboard/dist/assets/RoleDetailPage-BFuLNJXa.js.map +1 -0
  159. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js → RolePill-BafrASDX.js} +2 -2
  160. package/dashboard/dist/assets/{RolePill-DhnVPK4q.js.map → RolePill-BafrASDX.js.map} +1 -1
  161. package/dashboard/dist/assets/{RolesPage-OM9KM8Pg.js → RolesPage-80quJU5-.js} +2 -2
  162. package/dashboard/dist/assets/{RolesPage-OM9KM8Pg.js.map → RolesPage-80quJU5-.js.map} +1 -1
  163. package/dashboard/dist/assets/RunAsSelector-BoePhWVD.js +2 -0
  164. package/dashboard/dist/assets/{RunAsSelector-fFMt1bGe.js.map → RunAsSelector-BoePhWVD.js.map} +1 -1
  165. package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js → ScanCodesPage-Cu1bKEix.js} +2 -2
  166. package/dashboard/dist/assets/{ScanCodesPage-AujH-pPQ.js.map → ScanCodesPage-Cu1bKEix.js.map} +1 -1
  167. package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js +2 -0
  168. package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js.map +1 -0
  169. package/dashboard/dist/assets/ScanStationPage-gcZGefvT.js +2 -0
  170. package/dashboard/dist/assets/{ScanStationPage-C1_ppDoZ.js.map → ScanStationPage-gcZGefvT.js.map} +1 -1
  171. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js → ScopeBadge-b6MIBiYD.js} +2 -2
  172. package/dashboard/dist/assets/{ScopeBadge-CXUg0FHo.js.map → ScopeBadge-b6MIBiYD.js.map} +1 -1
  173. package/dashboard/dist/assets/{StickyPagination-B91Pk9xh.js → StickyPagination-9ITrei_d.js} +2 -2
  174. package/dashboard/dist/assets/{StickyPagination-B91Pk9xh.js.map → StickyPagination-9ITrei_d.js.map} +1 -1
  175. package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js → StreamMessageDetail-BkYvEHFY.js} +2 -2
  176. package/dashboard/dist/assets/{StreamMessageDetail-C7SPqaJt.js.map → StreamMessageDetail-BkYvEHFY.js.map} +1 -1
  177. package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js → SwimlaneTimeline-B1rotFix.js} +2 -2
  178. package/dashboard/dist/assets/{SwimlaneTimeline-BcHR8ylf.js.map → SwimlaneTimeline-B1rotFix.js.map} +1 -1
  179. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js → TagInput-ZrIIrEUP.js} +2 -2
  180. package/dashboard/dist/assets/{TagInput-BZ8vb2oW.js.map → TagInput-ZrIIrEUP.js.map} +1 -1
  181. package/dashboard/dist/assets/{TaskDetailPage-Bqj0I_I0.js → TaskDetailPage-zhn_U_eC.js} +2 -2
  182. package/dashboard/dist/assets/{TaskDetailPage-Bqj0I_I0.js.map → TaskDetailPage-zhn_U_eC.js.map} +1 -1
  183. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js → TaskQueuePill-DkQ1uc6y.js} +2 -2
  184. package/dashboard/dist/assets/{TaskQueuePill-Bxir8WRl.js.map → TaskQueuePill-DkQ1uc6y.js.map} +1 -1
  185. package/dashboard/dist/assets/TasksListPage-CNbNeagx.js +2 -0
  186. package/dashboard/dist/assets/{TasksListPage-BB1f79lL.js.map → TasksListPage-CNbNeagx.js.map} +1 -1
  187. package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js → TimeAgo-0YVMBwls.js} +2 -2
  188. package/dashboard/dist/assets/{TimeAgo-BFnODmNe.js.map → TimeAgo-0YVMBwls.js.map} +1 -1
  189. package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js → TimestampCell-DB7r3np8.js} +2 -2
  190. package/dashboard/dist/assets/{TimestampCell-BXgLOBsr.js.map → TimestampCell-DB7r3np8.js.map} +1 -1
  191. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js → ToolPill-Baxm02L6.js} +2 -2
  192. package/dashboard/dist/assets/{ToolPill-FkgTXIhq.js.map → ToolPill-Baxm02L6.js.map} +1 -1
  193. package/dashboard/dist/assets/ToolTestPanel-BLfA02wv.js +2 -0
  194. package/dashboard/dist/assets/{ToolTestPanel-Bwe3J5lj.js.map → ToolTestPanel-BLfA02wv.js.map} +1 -1
  195. package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js → TopicDetailPage-eAqPKShq.js} +3 -3
  196. package/dashboard/dist/assets/{TopicDetailPage-DAF07vZ9.js.map → TopicDetailPage-eAqPKShq.js.map} +1 -1
  197. package/dashboard/dist/assets/TopicsPage-BNNWD-zl.js +2 -0
  198. package/dashboard/dist/assets/{TopicsPage-C1gxBUap.js.map → TopicsPage-BNNWD-zl.js.map} +1 -1
  199. package/dashboard/dist/assets/{UserName-BzXJUE6q.js → UserName-Pw46tO_k.js} +2 -2
  200. package/dashboard/dist/assets/{UserName-BzXJUE6q.js.map → UserName-Pw46tO_k.js.map} +1 -1
  201. package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js → WorkflowExecutionPage-DvA51lT3.js} +2 -2
  202. package/dashboard/dist/assets/{WorkflowExecutionPage-SkRU5cRX.js.map → WorkflowExecutionPage-DvA51lT3.js.map} +1 -1
  203. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js → WorkflowPill-ZepbO_ny.js} +2 -2
  204. package/dashboard/dist/assets/{WorkflowPill--AYMW7u_.js.map → WorkflowPill-ZepbO_ny.js.map} +1 -1
  205. package/dashboard/dist/assets/WorkflowsDashboard-DFDTwnhn.js +2 -0
  206. package/dashboard/dist/assets/{WorkflowsDashboard-CZAqRk1N.js.map → WorkflowsDashboard-DFDTwnhn.js.map} +1 -1
  207. package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js → WorkflowsOverview-5i2Tcy-p.js} +2 -2
  208. package/dashboard/dist/assets/{WorkflowsOverview-BoN44VTE.js.map → WorkflowsOverview-5i2Tcy-p.js.map} +1 -1
  209. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js → YamlWorkflowDetailPage-p4VEYZS0.js} +11 -11
  210. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CqjhtdJf.js.map → YamlWorkflowDetailPage-p4VEYZS0.js.map} +1 -1
  211. package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js → YamlWorkflowsPage-Cq-hMVxl.js} +2 -2
  212. package/dashboard/dist/assets/{YamlWorkflowsPage-CwnJkzyb.js.map → YamlWorkflowsPage-Cq-hMVxl.js.map} +1 -1
  213. package/dashboard/dist/assets/{agents-gV0Ys-sY.js → agents-EyBPJMYa.js} +2 -2
  214. package/dashboard/dist/assets/{agents-gV0Ys-sY.js.map → agents-EyBPJMYa.js.map} +1 -1
  215. package/dashboard/dist/assets/{bots-B97itB3I.js → bots-DX6jjqtF.js} +2 -2
  216. package/dashboard/dist/assets/{bots-B97itB3I.js.map → bots-DX6jjqtF.js.map} +1 -1
  217. package/dashboard/dist/assets/{capabilities-CR9xZgGd.js → capabilities-ZdLv9xBQ.js} +2 -2
  218. package/dashboard/dist/assets/{capabilities-CR9xZgGd.js.map → capabilities-ZdLv9xBQ.js.map} +1 -1
  219. package/dashboard/dist/assets/{constants-BHkpVaqx.js → constants-CeBBTzf5.js} +2 -2
  220. package/dashboard/dist/assets/{constants-BHkpVaqx.js.map → constants-CeBBTzf5.js.map} +1 -1
  221. package/dashboard/dist/assets/{controlplane-YxvP1KCa.js → controlplane-CpvZaJuw.js} +2 -2
  222. package/dashboard/dist/assets/{controlplane-YxvP1KCa.js.map → controlplane-CpvZaJuw.js.map} +1 -1
  223. package/dashboard/dist/assets/escalation-columns-Mvsze5eV.js +2 -0
  224. package/dashboard/dist/assets/escalation-columns-Mvsze5eV.js.map +1 -0
  225. package/dashboard/dist/assets/index-B_GT23TE.js +3 -0
  226. package/dashboard/dist/assets/index-B_GT23TE.js.map +1 -0
  227. package/dashboard/dist/assets/index-BbCjGO3M.js +2 -0
  228. package/dashboard/dist/assets/{index-CFbo9FU9.js.map → index-BbCjGO3M.js.map} +1 -1
  229. package/dashboard/dist/assets/{index-DMeaiKgf.js → index-Bhb89oHH.js} +2 -2
  230. package/dashboard/dist/assets/{index-DMeaiKgf.js.map → index-Bhb89oHH.js.map} +1 -1
  231. package/dashboard/dist/assets/index-CgUcYveM.js +67 -0
  232. package/dashboard/dist/assets/index-CgUcYveM.js.map +1 -0
  233. package/dashboard/dist/assets/index-Cn8uJsd7.js +2 -0
  234. package/dashboard/dist/assets/{index-BQpV-DTG.js.map → index-Cn8uJsd7.js.map} +1 -1
  235. package/dashboard/dist/assets/index-D-Xs4rAW.js +2 -0
  236. package/dashboard/dist/assets/{index-Bp9KBLT5.js.map → index-D-Xs4rAW.js.map} +1 -1
  237. package/dashboard/dist/assets/{index-DwOnWeu8.js → index-DGmzBY9D.js} +2 -2
  238. package/dashboard/dist/assets/{index-DwOnWeu8.js.map → index-DGmzBY9D.js.map} +1 -1
  239. package/dashboard/dist/assets/{index-CIpHj4di.js → index-DZhtP2Ok.js} +2 -2
  240. package/dashboard/dist/assets/{index-CIpHj4di.js.map → index-DZhtP2Ok.js.map} +1 -1
  241. package/dashboard/dist/assets/index-Dh8MJl3L.css +1 -0
  242. package/dashboard/dist/assets/index-DkrBFFSO.js +13 -0
  243. package/dashboard/dist/assets/{index-Cfvkl2J0.js.map → index-DkrBFFSO.js.map} +1 -1
  244. package/dashboard/dist/assets/{index-B9BBCqLI.js → index-Eo-l3Lqo.js} +2 -2
  245. package/dashboard/dist/assets/{index-B9BBCqLI.js.map → index-Eo-l3Lqo.js.map} +1 -1
  246. package/dashboard/dist/assets/index-PfSRKerc.js +2 -0
  247. package/dashboard/dist/assets/{index-CUZ6LYye.js.map → index-PfSRKerc.js.map} +1 -1
  248. package/dashboard/dist/assets/{index-ipqwPavs.js → index-oFKUFGQL.js} +2 -2
  249. package/dashboard/dist/assets/{index-ipqwPavs.js.map → index-oFKUFGQL.js.map} +1 -1
  250. package/dashboard/dist/assets/index-z5Hpeidu.js +2 -0
  251. package/dashboard/dist/assets/index-z5Hpeidu.js.map +1 -0
  252. package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js → knowledge-CgloEkaf.js} +2 -2
  253. package/dashboard/dist/assets/{knowledge-XX6cW4Ob.js.map → knowledge-CgloEkaf.js.map} +1 -1
  254. package/dashboard/dist/assets/{mcp-CH13hNH2.js → mcp-Bix7QYO7.js} +2 -2
  255. package/dashboard/dist/assets/{mcp-CH13hNH2.js.map → mcp-Bix7QYO7.js.map} +1 -1
  256. package/dashboard/dist/assets/{mcp-query-Duydd3JA.js → mcp-query-o-sGX2ST.js} +2 -2
  257. package/dashboard/dist/assets/{mcp-query-Duydd3JA.js.map → mcp-query-o-sGX2ST.js.map} +1 -1
  258. package/dashboard/dist/assets/metadata-display-COo3mMCr.js +2 -0
  259. package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +1 -0
  260. package/dashboard/dist/assets/{personas-mDk4lLQS.js → personas-30azkJ_s.js} +2 -2
  261. package/dashboard/dist/assets/{personas-mDk4lLQS.js.map → personas-30azkJ_s.js.map} +1 -1
  262. package/dashboard/dist/assets/{pipelines-B5GcgCeF.js → pipelines-Bfk2GFK7.js} +2 -2
  263. package/dashboard/dist/assets/{pipelines-B5GcgCeF.js.map → pipelines-Bfk2GFK7.js.map} +1 -1
  264. package/dashboard/dist/assets/{tasks-CItmNsRp.js → tasks-CpdopewW.js} +2 -2
  265. package/dashboard/dist/assets/{tasks-CItmNsRp.js.map → tasks-CpdopewW.js.map} +1 -1
  266. package/dashboard/dist/assets/{topics-CJYG7BX5.js → topics--bvCV9Yp.js} +2 -2
  267. package/dashboard/dist/assets/{topics-CJYG7BX5.js.map → topics--bvCV9Yp.js.map} +1 -1
  268. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js +2 -0
  269. package/dashboard/dist/assets/useContainerWidth-DSLp1gEm.js.map +1 -0
  270. package/dashboard/dist/assets/{useDebouncedValue-BrwgXcp8.js → useDebouncedValue-Da0lPmj3.js} +2 -2
  271. package/dashboard/dist/assets/{useDebouncedValue-BrwgXcp8.js.map → useDebouncedValue-Da0lPmj3.js.map} +1 -1
  272. package/dashboard/dist/assets/{useNamespace-CHty0HAS.js → useNamespace-DD_Esl6n.js} +2 -2
  273. package/dashboard/dist/assets/{useNamespace-CHty0HAS.js.map → useNamespace-DD_Esl6n.js.map} +1 -1
  274. package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js → useYamlActivityEvents-AeAhZJJk.js} +2 -2
  275. package/dashboard/dist/assets/{useYamlActivityEvents-CoTsia7t.js.map → useYamlActivityEvents-AeAhZJJk.js.map} +1 -1
  276. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js → vendor-icons-B7OcUM6b.js} +2 -2
  277. package/dashboard/dist/assets/{vendor-icons-DeBdvyKJ.js.map → vendor-icons-B7OcUM6b.js.map} +1 -1
  278. package/dashboard/dist/assets/{yaml-workflows-CiWwx5rM.js → yaml-workflows-BHAOOGvn.js} +2 -2
  279. package/dashboard/dist/assets/{yaml-workflows-CiWwx5rM.js.map → yaml-workflows-BHAOOGvn.js.map} +1 -1
  280. package/dashboard/dist/index.html +3 -3
  281. package/docs/accumulator.md +113 -0
  282. package/docs/api/http/escalations.md +90 -0
  283. package/docs/api/http/roles.md +1 -0
  284. package/docs/api/sdk/escalations.md +92 -0
  285. package/docs/api/sdk/roles.md +2 -0
  286. package/docs/architecture.md +1 -1
  287. package/docs/code-owned-configuration.md +2 -1
  288. package/docs/dashboard.md +10 -4
  289. package/docs/hitl/design.md +1 -1
  290. package/docs/hitl/escalation.md +37 -1
  291. package/docs/hitl/invoke-form.md +4 -0
  292. package/docs/hitl/pinned-views.md +4 -0
  293. package/docs/hitl/portal.md +97 -0
  294. package/docs/hitl/resolution.md +41 -0
  295. package/docs/hitl/x-lt-embed.md +1 -1
  296. package/docs/hitl/x-lt-invoke.md +95 -0
  297. package/docs/hitl/x-lt-list-schema.md +3 -1
  298. package/docs/hitl/x-lt-widget.md +1 -0
  299. package/docs/hitl-guide.md +8 -1
  300. package/docs/scan-codes.md +33 -9
  301. package/docs/sdk.md +1 -1
  302. package/docs/workflows.md +2 -2
  303. package/package.json +4 -2
  304. package/dashboard/dist/assets/AgentsPage-7JJBHku8.js +0 -2
  305. package/dashboard/dist/assets/AvailableEscalationsPage-lz5qwSjg.js +0 -2
  306. package/dashboard/dist/assets/AvailableEscalationsPage-lz5qwSjg.js.map +0 -1
  307. package/dashboard/dist/assets/BulkAssignModal-NJBcoj-f.js +0 -2
  308. package/dashboard/dist/assets/CapabilitiesPage-F8dpNn9B.js +0 -2
  309. package/dashboard/dist/assets/DataTable-7C7riavf.js +0 -2
  310. package/dashboard/dist/assets/DataTable-7C7riavf.js.map +0 -1
  311. package/dashboard/dist/assets/EntityTimelinePanel-CkF-oW-m.js +0 -2
  312. package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js +0 -2
  313. package/dashboard/dist/assets/EscalationListView-AHW2xtlr.js.map +0 -1
  314. package/dashboard/dist/assets/GraphInvokePage-CKtvWowP.js +0 -2
  315. package/dashboard/dist/assets/HomePage-BQ3Q791Q.js +0 -2
  316. package/dashboard/dist/assets/ListToolbar-DdJzj472.js +0 -2
  317. package/dashboard/dist/assets/McpQueryPage-CfJy7HZ7.js +0 -2
  318. package/dashboard/dist/assets/McpRunsPage-D7QXjW9z.js +0 -2
  319. package/dashboard/dist/assets/OperationsPage-aLHHAP2X.js +0 -3
  320. package/dashboard/dist/assets/OperationsPage-aLHHAP2X.js.map +0 -1
  321. package/dashboard/dist/assets/OperatorDashboard-sXNDh1Ph.js +0 -2
  322. package/dashboard/dist/assets/ProcessesListPage-CjwVKe32.js +0 -2
  323. package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js +0 -3
  324. package/dashboard/dist/assets/ResolverForm-Bk-wDkN-.js.map +0 -1
  325. package/dashboard/dist/assets/RoleDetailPage-WQt0y5l7.js +0 -8
  326. package/dashboard/dist/assets/RoleDetailPage-WQt0y5l7.js.map +0 -1
  327. package/dashboard/dist/assets/RunAsSelector-fFMt1bGe.js +0 -2
  328. package/dashboard/dist/assets/ScanSchemeDetailPage-eKQpmsC_.js +0 -2
  329. package/dashboard/dist/assets/ScanSchemeDetailPage-eKQpmsC_.js.map +0 -1
  330. package/dashboard/dist/assets/ScanStationPage-C1_ppDoZ.js +0 -2
  331. package/dashboard/dist/assets/TasksListPage-BB1f79lL.js +0 -2
  332. package/dashboard/dist/assets/ToolTestPanel-Bwe3J5lj.js +0 -2
  333. package/dashboard/dist/assets/TopicsPage-C1gxBUap.js +0 -2
  334. package/dashboard/dist/assets/WorkflowsDashboard-CZAqRk1N.js +0 -2
  335. package/dashboard/dist/assets/escalation-columns-uq-IV2aj.js +0 -2
  336. package/dashboard/dist/assets/escalation-columns-uq-IV2aj.js.map +0 -1
  337. package/dashboard/dist/assets/index-3ezfWLkE.js +0 -6
  338. package/dashboard/dist/assets/index-3ezfWLkE.js.map +0 -1
  339. package/dashboard/dist/assets/index-BQpV-DTG.js +0 -2
  340. package/dashboard/dist/assets/index-Bp9KBLT5.js +0 -2
  341. package/dashboard/dist/assets/index-Bpvfr4OW.css +0 -1
  342. package/dashboard/dist/assets/index-CFbo9FU9.js +0 -2
  343. package/dashboard/dist/assets/index-CIwlVfvV.js +0 -67
  344. package/dashboard/dist/assets/index-CIwlVfvV.js.map +0 -1
  345. package/dashboard/dist/assets/index-CUZ6LYye.js +0 -2
  346. package/dashboard/dist/assets/index-Cfvkl2J0.js +0 -13
  347. package/dashboard/dist/assets/index-SGyrXGp8.js +0 -3
  348. package/dashboard/dist/assets/index-SGyrXGp8.js.map +0 -1
  349. package/dashboard/dist/assets/invoke-context-DrVyUEfs.js +0 -2
  350. package/dashboard/dist/assets/invoke-context-DrVyUEfs.js.map +0 -1
  351. package/dashboard/dist/assets/metadata-display--TzK0REC.js +0 -2
  352. package/dashboard/dist/assets/metadata-display--TzK0REC.js.map +0 -1
  353. package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js +0 -2
  354. package/dashboard/dist/assets/resolver-payload-m9AGKZ3a.js.map +0 -1
  355. package/docs/compilation.md +0 -152
  356. package/docs/compiler.md +0 -311
  357. package/docs/contributing.md +0 -56
  358. package/docs/design-principles.md +0 -245
  359. package/docs/schema-exchange.md +0 -173
  360. package/docs/self-test.md +0 -106
  361. package/docs/story.md +0 -184
@@ -0,0 +1,158 @@
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
+ * GET /api/escalations/items-by-signal-key?signalKey=…
106
+ * The held items of an accumulator or batch row by its signal_key.
107
+ */
108
+ router.get('/items-by-signal-key', async (req, res) => {
109
+ const result = await api.getEscalationItemsBySignalKey({ signalKey: String(req.query.signalKey ?? '') }, req.auth);
110
+ res.status(result.status).json(result.data ?? { error: result.error });
111
+ });
112
+ /**
113
+ * POST /api/escalations/:id/accumulate
114
+ * Add one item. Interim adds answer { outcome: 'accepted', count, remaining };
115
+ * the add that reaches max answers { outcome: 'completed', signaled } and the
116
+ * waiting workflow resumes with the collection. Claim-agnostic unless
117
+ * assertClaim: true.
118
+ * Body: { itemKey, payload?, metadata?, assertClaim?, reciprocal? }
119
+ */
120
+ router.post('/:id/accumulate', async (req, res) => {
121
+ const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
122
+ if (!auth)
123
+ return;
124
+ const result = await api.accumulateItem({
125
+ id: req.params.id,
126
+ itemKey: req.body?.itemKey,
127
+ payload: req.body?.payload,
128
+ metadata: req.body?.metadata,
129
+ assertClaim: req.body?.assertClaim,
130
+ reciprocal: req.body?.reciprocal,
131
+ }, auth);
132
+ res.status(result.status).json(result.data ?? { error: result.error });
133
+ });
134
+ /**
135
+ * POST /api/escalations/:id/remove-item
136
+ * Remove one held item; the row stays pending and the waiter never wakes.
137
+ * Body: { itemKey, reciprocal? }
138
+ */
139
+ router.post('/:id/remove-item', async (req, res) => {
140
+ const auth = await (0, acting_1.effectiveWorkAuth)(req, res);
141
+ if (!auth)
142
+ return;
143
+ const result = await api.removeItem({
144
+ id: req.params.id,
145
+ itemKey: req.body?.itemKey,
146
+ reciprocal: req.body?.reciprocal,
147
+ }, auth);
148
+ res.status(result.status).json(result.data ?? { error: result.error });
149
+ });
150
+ /**
151
+ * GET /api/escalations/:id/items
152
+ * The held items of an accumulator or batch row in arrival order.
153
+ */
154
+ router.get('/:id/items', async (req, res) => {
155
+ const result = await api.getEscalationItems({ id: req.params.id }, req.auth);
156
+ res.status(result.status).json(result.data ?? { error: result.error });
157
+ });
158
+ }
@@ -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,34 @@ 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>>;
272
+ getItemsBySignalKey: (input: {
273
+ signalKey: string;
274
+ }, auth?: LTApiAuth) => Promise<LTApiResult<import("../api/escalations/accumulate").EscalationItemsView>>;
247
275
  searchByFacets: (input: import("..").FacetQuery, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
248
276
  claimGroups: (input: {
249
277
  query: import("..").FacetQuery;
@@ -146,6 +146,15 @@ 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),
157
+ getItemsBySignalKey: bindAuth(escalationsApi.getEscalationItemsBySignalKey, auth),
149
158
  // Faceted-routing surface (pond search + batch claim), RBAC-scoped to the caller's role.
150
159
  searchByFacets: bindAuth(escalationsApi.searchByFacets, auth),
151
160
  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>;
@@ -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);
@@ -54,12 +54,12 @@ export declare const waitForSchema: z.ZodObject<{
54
54
  timeout: z.ZodOptional<z.ZodNumber>;
55
55
  }, "strip", z.ZodTypeAny, {
56
56
  selector: string;
57
- page_id?: string | undefined;
58
57
  timeout?: number | undefined;
58
+ page_id?: string | undefined;
59
59
  }, {
60
60
  selector: string;
61
- page_id?: string | undefined;
62
61
  timeout?: number | undefined;
62
+ page_id?: string | undefined;
63
63
  }>;
64
64
  export declare const evaluateSchema: z.ZodObject<{
65
65
  page_id: z.ZodOptional<z.ZodString>;
@@ -1,5 +1,5 @@
1
1
  import type { Types } from '@hotmeshio/hotmesh';
2
- import { type EscalationLookupRef } from '../../types/escalation';
2
+ import { type AccumulateConfig, type AccumulatorResult, type EscalationLookupRef } from '../../types/escalation';
3
3
  /**
4
4
  * HotMesh's escalation config plus long-tail sugar. `schemaVersion` pins the
5
5
  * role form version (lt_role_schemas) the resolve UI renders; `lookups` pins
@@ -116,8 +116,32 @@ export type ConditionEscalationConfig = Types.ConditionQueueConfig & {
116
116
  * ```
117
117
  *
118
118
  * `timeout`/cancel semantics are unchanged (`false`/`null`); partially filled
119
- * items persist on the terminal row for audit. A plain resolve on a batch row
120
- * remains an admin override that resolves the whole row with its payload.
119
+ * items persist on the terminal row for audit. Add `partialOnTimeout: true`
120
+ * (hotmesh 0.29.0+) and the timer instead resumes with the items filled so
121
+ * far plus `$trigger: 'timeout'`. A plain resolve on a batch row remains an
122
+ * admin override that resolves the whole row with its payload.
123
+ *
124
+ * **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
125
+ * `accumulate` and the escalation holds items added via `accumulateItem`
126
+ * (HTTP: POST /:id/accumulate, /accumulate-by-signal-key,
127
+ * /accumulate-by-metadata) until `max` items are held, the `timeout` fires,
128
+ * or someone resolves the row. Every path except cancel delivers the ordered
129
+ * collection with the trigger that ended the wait, so a timeout is a
130
+ * delivery window, never a failure. Progress rides `metadata.accumulate_count`
131
+ * / `accumulate_max` / `accumulate_keys` as queryable facets; entries live in
132
+ * `envelope.accumulate_items`. Use {@link conditionalAccumulator} for the
133
+ * typed form:
134
+ *
135
+ * ```typescript
136
+ * const bin = await conditionalAccumulator<BagV1>(signalId, {
137
+ * role: 'bin',
138
+ * metadata: { binKey },
139
+ * accumulate: { max: 12 },
140
+ * timeout: '4h',
141
+ * });
142
+ * if (bin === null) { /* cancelled *​/ }
143
+ * else bin.$trigger; // 'count' | 'timeout' | 'resolve'
144
+ * ```
121
145
  *
122
146
  * **Resolution provenance — the reserved `$resolution` key.** When the resolve
123
147
  * carries the resolver's identity (the API layer supplies it for interactive
@@ -155,3 +179,16 @@ export type ConditionEscalationConfig = Types.ConditionQueueConfig & {
155
179
  export declare function conditional<T = Record<string, any>>(signalId: string, escalation?: ConditionEscalationConfig): Promise<T | false | null>;
156
180
  /** @deprecated Alias of {@link conditional}. */
157
181
  export declare const conditionLT: typeof conditional;
182
+ /** {@link ConditionEscalationConfig} with the accumulator declaration required. */
183
+ export type ConditionAccumulatorConfig = ConditionEscalationConfig & {
184
+ accumulate: AccumulateConfig;
185
+ };
186
+ /**
187
+ * {@link conditional} for an open accumulator: the same wait, typed for the
188
+ * contract an accumulator row keeps. It resolves with the ordered
189
+ * `$accumulated` collection and its `$trigger` on every terminal path
190
+ * (`count`, `timeout`, `resolve`), so `false` is not in the return type;
191
+ * cancellation still yields `null`. `P` types each item's payload, `R` the
192
+ * manual resolver payload merged in on `resolve`.
193
+ */
194
+ export declare function conditionalAccumulator<P = Record<string, any>, R extends Record<string, any> = Record<string, any>>(signalId: string, escalation: ConditionAccumulatorConfig): Promise<AccumulatorResult<P, R> | null>;
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.conditionLT = void 0;
37
37
  exports.conditional = conditional;
38
+ exports.conditionalAccumulator = conditionalAccumulator;
38
39
  const hotmesh_1 = require("@hotmeshio/hotmesh");
39
40
  const escalation_1 = require("../../types/escalation");
40
41
  const interceptorActivities = __importStar(require("../interceptor/activities"));
@@ -162,8 +163,32 @@ function toEngineConfig(escalation) {
162
163
  * ```
163
164
  *
164
165
  * `timeout`/cancel semantics are unchanged (`false`/`null`); partially filled
165
- * items persist on the terminal row for audit. A plain resolve on a batch row
166
- * remains an admin override that resolves the whole row with its payload.
166
+ * items persist on the terminal row for audit. Add `partialOnTimeout: true`
167
+ * (hotmesh 0.29.0+) and the timer instead resumes with the items filled so
168
+ * far plus `$trigger: 'timeout'`. A plain resolve on a batch row remains an
169
+ * admin override that resolves the whole row with its payload.
170
+ *
171
+ * **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
172
+ * `accumulate` and the escalation holds items added via `accumulateItem`
173
+ * (HTTP: POST /:id/accumulate, /accumulate-by-signal-key,
174
+ * /accumulate-by-metadata) until `max` items are held, the `timeout` fires,
175
+ * or someone resolves the row. Every path except cancel delivers the ordered
176
+ * collection with the trigger that ended the wait, so a timeout is a
177
+ * delivery window, never a failure. Progress rides `metadata.accumulate_count`
178
+ * / `accumulate_max` / `accumulate_keys` as queryable facets; entries live in
179
+ * `envelope.accumulate_items`. Use {@link conditionalAccumulator} for the
180
+ * typed form:
181
+ *
182
+ * ```typescript
183
+ * const bin = await conditionalAccumulator<BagV1>(signalId, {
184
+ * role: 'bin',
185
+ * metadata: { binKey },
186
+ * accumulate: { max: 12 },
187
+ * timeout: '4h',
188
+ * });
189
+ * if (bin === null) { /* cancelled *​/ }
190
+ * else bin.$trigger; // 'count' | 'timeout' | 'resolve'
191
+ * ```
167
192
  *
168
193
  * **Resolution provenance — the reserved `$resolution` key.** When the resolve
169
194
  * carries the resolver's identity (the API layer supplies it for interactive
@@ -231,3 +256,18 @@ async function conditional(signalId, escalation) {
231
256
  }
232
257
  /** @deprecated Alias of {@link conditional}. */
233
258
  exports.conditionLT = conditional;
259
+ /**
260
+ * {@link conditional} for an open accumulator: the same wait, typed for the
261
+ * contract an accumulator row keeps. It resolves with the ordered
262
+ * `$accumulated` collection and its `$trigger` on every terminal path
263
+ * (`count`, `timeout`, `resolve`), so `false` is not in the return type;
264
+ * cancellation still yields `null`. `P` types each item's payload, `R` the
265
+ * manual resolver payload merged in on `resolve`.
266
+ */
267
+ async function conditionalAccumulator(signalId, escalation) {
268
+ const result = await conditional(signalId, escalation);
269
+ if (result === false) {
270
+ throw new Error(`Accumulator wait ${signalId} resumed with false; expected a delivered collection`);
271
+ }
272
+ return result;
273
+ }
@@ -153,6 +153,7 @@ async function updateRoleMetadata(role, input) {
153
153
  provided('ops_home_default'), input.ops_home_default ?? null,
154
154
  provided('entity_facet'), input.entity_facet ?? null,
155
155
  provided('entity_state_source'), input.entity_state_source ?? null,
156
+ provided('portals'), input.portals != null ? JSON.stringify(input.portals) : null,
156
157
  ]);
157
158
  if (!rows[0])
158
159
  return null;
@@ -14,10 +14,12 @@ exports.STARTUP_CHANGE_SUMMARY = 'startup apply (code)';
14
14
  const METADATA_FIELDS = [
15
15
  'title', 'description', 'form_schema', 'metadata_schema', 'list_schema',
16
16
  'properties', 'ops_visible', 'ops_home_default', 'parent_role',
17
- 'upstream_roles', 'default_pins', 'enforce_schema', 'sla_minutes',
17
+ 'upstream_roles', 'default_pins', 'portals', 'enforce_schema', 'sla_minutes',
18
18
  'target_per_hour', 'worker_count', 'priority_threshold_minutes',
19
19
  'priority_facet', 'entity_facet', 'entity_state_source',
20
20
  ];
21
+ // Arrays whose order is meaning (portals and their rows), compared as declared.
22
+ const ORDERED_ARRAY_FIELDS = new Set(['portals']);
21
23
  /**
22
24
  * Compare one declared field against the stored row. jsonb round-trips lose
23
25
  * key order, so structured values must be compared as parsed values — never
@@ -25,6 +27,9 @@ const METADATA_FIELDS = [
25
27
  */
26
28
  function fieldDiffers(field, declared, row) {
27
29
  const stored = row[field];
30
+ if (Array.isArray(declared) && ORDERED_ARRAY_FIELDS.has(field)) {
31
+ return !(0, node_util_1.isDeepStrictEqual)(declared, stored ?? null);
32
+ }
28
33
  if (Array.isArray(declared)) {
29
34
  const a = [...declared].sort();
30
35
  const b = Array.isArray(stored) ? [...stored].sort() : [];