@hotmeshio/long-tail 0.23.1 → 0.23.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/build/api/escalations/index.d.ts +1 -0
  2. package/build/api/escalations/index.js +4 -1
  3. package/build/api/escalations/list.d.ts +5 -0
  4. package/build/api/escalations/list.js +19 -5
  5. package/build/api/escalations/related.d.ts +18 -0
  6. package/build/api/escalations/related.js +205 -0
  7. package/build/api/roles.js +4 -0
  8. package/build/api/scan-codes/present.js +5 -1
  9. package/build/api/settings.d.ts +1 -1
  10. package/build/api/settings.js +3 -1
  11. package/build/modules/display.d.ts +15 -0
  12. package/build/modules/display.js +27 -0
  13. package/build/routes/escalations/index.js +3 -0
  14. package/build/routes/escalations/list.js +2 -0
  15. package/build/routes/escalations/related.d.ts +7 -0
  16. package/build/routes/escalations/related.js +60 -0
  17. package/build/scripts/consolidation-sim.d.ts +25 -0
  18. package/build/scripts/consolidation-sim.js +141 -0
  19. package/build/sdk/index.d.ts +12 -0
  20. package/build/sdk/index.js +2 -0
  21. package/build/services/escalation/grouped-list.d.ts +19 -0
  22. package/build/services/escalation/grouped-list.js +54 -0
  23. package/build/services/escalation/index.d.ts +4 -0
  24. package/build/services/escalation/index.js +9 -1
  25. package/build/services/escalation/queries.d.ts +17 -13
  26. package/build/services/escalation/queries.js +31 -40
  27. package/build/services/escalation/read-scope-sql.d.ts +13 -0
  28. package/build/services/escalation/read-scope-sql.js +19 -0
  29. package/build/services/escalation/related.d.ts +58 -0
  30. package/build/services/escalation/related.js +196 -0
  31. package/build/services/role/index.js +6 -0
  32. package/build/services/role/seed.js +4 -0
  33. package/build/services/scan-code/validate-facts.d.ts +1 -1
  34. package/build/services/scan-code/validate-facts.js +12 -1
  35. package/build/shared/form-validation/x-lt-scan.d.ts +8 -0
  36. package/build/shared/form-validation/x-lt-scan.js +20 -1
  37. package/build/shared/list-schema/index.d.ts +3 -0
  38. package/build/shared/list-schema/index.js +27 -0
  39. package/build/shared/list-schema/template.d.ts +14 -0
  40. package/build/shared/list-schema/template.js +85 -0
  41. package/build/shared/list-schema/types.d.ts +154 -0
  42. package/build/shared/list-schema/types.js +55 -0
  43. package/build/shared/list-schema/validate.d.ts +12 -0
  44. package/build/shared/list-schema/validate.js +204 -0
  45. package/build/shared/roles/segment.d.ts +22 -0
  46. package/build/shared/roles/segment.js +42 -0
  47. package/build/start/adapters.js +2 -0
  48. package/build/system/mcp-servers/admin/users.js +8 -0
  49. package/build/tsconfig.tsbuildinfo +1 -1
  50. package/build/types/index.d.ts +2 -2
  51. package/build/types/index.js +2 -1
  52. package/build/types/scan-code/constants.d.ts +7 -0
  53. package/build/types/scan-code/constants.js +7 -1
  54. package/build/types/scan-code/response.d.ts +3 -2
  55. package/build/types/scan-code/rule.d.ts +6 -1
  56. package/build/types/startup.d.ts +8 -0
  57. package/dashboard/dist/assets/{AdminDashboard-DKrqLGjn.js → AdminDashboard-BPWsgMfZ.js} +2 -2
  58. package/dashboard/dist/assets/{AdminDashboard-DKrqLGjn.js.map → AdminDashboard-BPWsgMfZ.js.map} +1 -1
  59. package/dashboard/dist/assets/{AgentConfigPage-BoQhRW6U.js → AgentConfigPage-De9imyo5.js} +2 -2
  60. package/dashboard/dist/assets/{AgentConfigPage-BoQhRW6U.js.map → AgentConfigPage-De9imyo5.js.map} +1 -1
  61. package/dashboard/dist/assets/{AgentDetailPage-DZhzuZmO.js → AgentDetailPage-B6o96Y5G.js} +3 -3
  62. package/dashboard/dist/assets/{AgentDetailPage-DZhzuZmO.js.map → AgentDetailPage-B6o96Y5G.js.map} +1 -1
  63. package/dashboard/dist/assets/{AgentsPage-5MynmbWX.js → AgentsPage-DMEmiK_W.js} +2 -2
  64. package/dashboard/dist/assets/{AgentsPage-5MynmbWX.js.map → AgentsPage-DMEmiK_W.js.map} +1 -1
  65. package/dashboard/dist/assets/AvailableEscalationsPage-DeYMngwE.js +2 -0
  66. package/dashboard/dist/assets/AvailableEscalationsPage-DeYMngwE.js.map +1 -0
  67. package/dashboard/dist/assets/{BotPicker-C3LR6Sqy.js → BotPicker-DDmpgGHZ.js} +2 -2
  68. package/dashboard/dist/assets/{BotPicker-C3LR6Sqy.js.map → BotPicker-DDmpgGHZ.js.map} +1 -1
  69. package/dashboard/dist/assets/{BulkAssignModal-COjoOIIH.js → BulkAssignModal-BqlklomG.js} +2 -2
  70. package/dashboard/dist/assets/{BulkAssignModal-COjoOIIH.js.map → BulkAssignModal-BqlklomG.js.map} +1 -1
  71. package/dashboard/dist/assets/CapabilitiesPage-DOtjDTbK.js +2 -0
  72. package/dashboard/dist/assets/{CapabilitiesPage-DKxLvOfB.js.map → CapabilitiesPage-DOtjDTbK.js.map} +1 -1
  73. package/dashboard/dist/assets/{CollapsibleSection-Cz5sRx-r.js → CollapsibleSection-CLr8LP0V.js} +2 -2
  74. package/dashboard/dist/assets/{CollapsibleSection-Cz5sRx-r.js.map → CollapsibleSection-CLr8LP0V.js.map} +1 -1
  75. package/dashboard/dist/assets/{ConfirmDeleteModal-Beq1vQtY.js → ConfirmDeleteModal-DW4DrPur.js} +2 -2
  76. package/dashboard/dist/assets/{ConfirmDeleteModal-Beq1vQtY.js.map → ConfirmDeleteModal-DW4DrPur.js.map} +1 -1
  77. package/dashboard/dist/assets/CountdownTimer-DxX72PwV.js +2 -0
  78. package/dashboard/dist/assets/CountdownTimer-DxX72PwV.js.map +1 -0
  79. package/dashboard/dist/assets/{CredentialsPage-DhiHiPsG.js → CredentialsPage-CObc9Rs5.js} +2 -2
  80. package/dashboard/dist/assets/{CredentialsPage-DhiHiPsG.js.map → CredentialsPage-CObc9Rs5.js.map} +1 -1
  81. package/dashboard/dist/assets/{CronLabel-C9SkawB-.js → CronLabel-Bb8GoNY5.js} +2 -2
  82. package/dashboard/dist/assets/{CronLabel-C9SkawB-.js.map → CronLabel-Bb8GoNY5.js.map} +1 -1
  83. package/dashboard/dist/assets/DataTable-FjFhx0SE.js +2 -0
  84. package/dashboard/dist/assets/DataTable-FjFhx0SE.js.map +1 -0
  85. package/dashboard/dist/assets/{ElapsedCell-BeK1SUDK.js → ElapsedCell-CmGhVlYl.js} +2 -2
  86. package/dashboard/dist/assets/{ElapsedCell-BeK1SUDK.js.map → ElapsedCell-CmGhVlYl.js.map} +1 -1
  87. package/dashboard/dist/assets/{EntityTimelinePanel-BThdefKj.js → EntityTimelinePanel-B4Jwy1w3.js} +2 -2
  88. package/dashboard/dist/assets/{EntityTimelinePanel-BThdefKj.js.map → EntityTimelinePanel-B4Jwy1w3.js.map} +1 -1
  89. package/dashboard/dist/assets/{EscalationListSchemaPage-DlDIYb-p.js → EscalationListSchemaPage-CZZbZ4Aa.js} +2 -2
  90. package/dashboard/dist/assets/{EscalationListSchemaPage-DlDIYb-p.js.map → EscalationListSchemaPage-CZZbZ4Aa.js.map} +1 -1
  91. package/dashboard/dist/assets/{EscalationSchemaPage-CQt-Embr.js → EscalationSchemaPage-D0ko59_S.js} +3 -3
  92. package/dashboard/dist/assets/{EscalationSchemaPage-CQt-Embr.js.map → EscalationSchemaPage-D0ko59_S.js.map} +1 -1
  93. package/dashboard/dist/assets/EscalationTimeline-BcnJEKFD.js +2 -0
  94. package/dashboard/dist/assets/EscalationTimeline-BcnJEKFD.js.map +1 -0
  95. package/dashboard/dist/assets/{EscalationTitleSelect-Dewrv8wX.js → EscalationTitleSelect-P0q5sck4.js} +2 -2
  96. package/dashboard/dist/assets/{EscalationTitleSelect-Dewrv8wX.js.map → EscalationTitleSelect-P0q5sck4.js.map} +1 -1
  97. package/dashboard/dist/assets/{EscalationsOverview-BzH-Y-5x.js → EscalationsOverview-BLPmh4AF.js} +2 -2
  98. package/dashboard/dist/assets/{EscalationsOverview-BzH-Y-5x.js.map → EscalationsOverview-BLPmh4AF.js.map} +1 -1
  99. package/dashboard/dist/assets/{EventTable-C97m6IZv.js → EventTable-gBzi5tIS.js} +2 -2
  100. package/dashboard/dist/assets/{EventTable-C97m6IZv.js.map → EventTable-gBzi5tIS.js.map} +1 -1
  101. package/dashboard/dist/assets/{FilterBar-D-6xVHIw.js → FilterBar-BulSsWb2.js} +2 -2
  102. package/dashboard/dist/assets/{FilterBar-D-6xVHIw.js.map → FilterBar-BulSsWb2.js.map} +1 -1
  103. package/dashboard/dist/assets/FormattedValue-BMHRrvrL.js +2 -0
  104. package/dashboard/dist/assets/FormattedValue-BMHRrvrL.js.map +1 -0
  105. package/dashboard/dist/assets/{GraphInvokePage-Bwi8EF9Y.js → GraphInvokePage--997yNRr.js} +2 -2
  106. package/dashboard/dist/assets/{GraphInvokePage-Bwi8EF9Y.js.map → GraphInvokePage--997yNRr.js.map} +1 -1
  107. package/dashboard/dist/assets/{HomePage-Z_Q03C0z.js → HomePage-CwXFz--v.js} +2 -2
  108. package/dashboard/dist/assets/{HomePage-Z_Q03C0z.js.map → HomePage-CwXFz--v.js.map} +1 -1
  109. package/dashboard/dist/assets/{ListToolbar-_jWTw5no.js → ListToolbar-Df4qZryJ.js} +2 -2
  110. package/dashboard/dist/assets/{ListToolbar-_jWTw5no.js.map → ListToolbar-Df4qZryJ.js.map} +1 -1
  111. package/dashboard/dist/assets/{McpOverview-CjqTuP0N.js → McpOverview-DrogIAKJ.js} +2 -2
  112. package/dashboard/dist/assets/{McpOverview-CjqTuP0N.js.map → McpOverview-DrogIAKJ.js.map} +1 -1
  113. package/dashboard/dist/assets/{McpQueryDetailPage-leCsje1U.js → McpQueryDetailPage-CJmvCAE6.js} +2 -2
  114. package/dashboard/dist/assets/{McpQueryDetailPage-leCsje1U.js.map → McpQueryDetailPage-CJmvCAE6.js.map} +1 -1
  115. package/dashboard/dist/assets/{McpQueryPage-C-PyXYX4.js → McpQueryPage-lygo4Yq0.js} +2 -2
  116. package/dashboard/dist/assets/{McpQueryPage-C-PyXYX4.js.map → McpQueryPage-lygo4Yq0.js.map} +1 -1
  117. package/dashboard/dist/assets/{McpRunDetailPage-JDrr3uUQ.js → McpRunDetailPage-hvns2sCm.js} +2 -2
  118. package/dashboard/dist/assets/{McpRunDetailPage-JDrr3uUQ.js.map → McpRunDetailPage-hvns2sCm.js.map} +1 -1
  119. package/dashboard/dist/assets/{McpRunsPage-DERXQLgZ.js → McpRunsPage-C2_7spTX.js} +2 -2
  120. package/dashboard/dist/assets/{McpRunsPage-DERXQLgZ.js.map → McpRunsPage-C2_7spTX.js.map} +1 -1
  121. package/dashboard/dist/assets/{OperationsPage-B2DA7n9m.js → OperationsPage-BlK8WlsY.js} +3 -3
  122. package/dashboard/dist/assets/OperationsPage-BlK8WlsY.js.map +1 -0
  123. package/dashboard/dist/assets/OperatorDashboard-BeWBiMGX.js +2 -0
  124. package/dashboard/dist/assets/OperatorDashboard-BeWBiMGX.js.map +1 -0
  125. package/dashboard/dist/assets/{PersonaDetailPage-ChXwJ6u5.js → PersonaDetailPage-CNHpsX_i.js} +2 -2
  126. package/dashboard/dist/assets/{PersonaDetailPage-ChXwJ6u5.js.map → PersonaDetailPage-CNHpsX_i.js.map} +1 -1
  127. package/dashboard/dist/assets/{PersonasPage-BFFxncSE.js → PersonasPage-ChASEZRg.js} +2 -2
  128. package/dashboard/dist/assets/{PersonasPage-BFFxncSE.js.map → PersonasPage-ChASEZRg.js.map} +1 -1
  129. package/dashboard/dist/assets/PortalPage-D5Lk-PKF.js +2 -0
  130. package/dashboard/dist/assets/PortalPage-D5Lk-PKF.js.map +1 -0
  131. package/dashboard/dist/assets/{ProcessDetailPage-D7EYwW-j.js → ProcessDetailPage-DNgCIwRl.js} +2 -2
  132. package/dashboard/dist/assets/{ProcessDetailPage-D7EYwW-j.js.map → ProcessDetailPage-DNgCIwRl.js.map} +1 -1
  133. package/dashboard/dist/assets/{ProcessesListPage-CakYRtnE.js → ProcessesListPage-pRjWuWlH.js} +2 -2
  134. package/dashboard/dist/assets/{ProcessesListPage-CakYRtnE.js.map → ProcessesListPage-pRjWuWlH.js.map} +1 -1
  135. package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js +8 -0
  136. package/dashboard/dist/assets/ResolverForm-CKIOAGtY.js.map +1 -0
  137. package/dashboard/dist/assets/{RoleDetailPage-CKbGwezP.js → RoleDetailPage-Bh_UcfYY.js} +2 -2
  138. package/dashboard/dist/assets/{RoleDetailPage-CKbGwezP.js.map → RoleDetailPage-Bh_UcfYY.js.map} +1 -1
  139. package/dashboard/dist/assets/{RolesPage-Czu7Zku4.js → RolesPage-CK17N7zz.js} +2 -2
  140. package/dashboard/dist/assets/{RolesPage-Czu7Zku4.js.map → RolesPage-CK17N7zz.js.map} +1 -1
  141. package/dashboard/dist/assets/{RunAsSelector-6BLScYTX.js → RunAsSelector-BEKUP0p2.js} +2 -2
  142. package/dashboard/dist/assets/{RunAsSelector-6BLScYTX.js.map → RunAsSelector-BEKUP0p2.js.map} +1 -1
  143. package/dashboard/dist/assets/{ScanCodesPage-Cv9q8Bvt.js → ScanCodesPage-Bd0Pflqx.js} +2 -2
  144. package/dashboard/dist/assets/{ScanCodesPage-Cv9q8Bvt.js.map → ScanCodesPage-Bd0Pflqx.js.map} +1 -1
  145. package/dashboard/dist/assets/{ScanSchemeDetailPage-BxazXYIc.js → ScanSchemeDetailPage-CnuhozmJ.js} +2 -2
  146. package/dashboard/dist/assets/{ScanSchemeDetailPage-BxazXYIc.js.map → ScanSchemeDetailPage-CnuhozmJ.js.map} +1 -1
  147. package/dashboard/dist/assets/ScanStationPage-CoLc-q3h.js +2 -0
  148. package/dashboard/dist/assets/ScanStationPage-CoLc-q3h.js.map +1 -0
  149. package/dashboard/dist/assets/{StickyPagination-DsdtYoXR.js → StickyPagination-COrfvkBi.js} +2 -2
  150. package/dashboard/dist/assets/{StickyPagination-DsdtYoXR.js.map → StickyPagination-COrfvkBi.js.map} +1 -1
  151. package/dashboard/dist/assets/{StreamMessageDetail-CT3FQoT3.js → StreamMessageDetail-Cif2egLy.js} +2 -2
  152. package/dashboard/dist/assets/{StreamMessageDetail-CT3FQoT3.js.map → StreamMessageDetail-Cif2egLy.js.map} +1 -1
  153. package/dashboard/dist/assets/{SwimlaneTimeline-C8TjkJ10.js → SwimlaneTimeline-BnZYTrAh.js} +2 -2
  154. package/dashboard/dist/assets/{SwimlaneTimeline-C8TjkJ10.js.map → SwimlaneTimeline-BnZYTrAh.js.map} +1 -1
  155. package/dashboard/dist/assets/{TaskDetailPage-DGUzdBFN.js → TaskDetailPage-DEz_dqyR.js} +2 -2
  156. package/dashboard/dist/assets/{TaskDetailPage-DGUzdBFN.js.map → TaskDetailPage-DEz_dqyR.js.map} +1 -1
  157. package/dashboard/dist/assets/{TasksListPage-BVIP6-EZ.js → TasksListPage-oEfEGj0_.js} +2 -2
  158. package/dashboard/dist/assets/{TasksListPage-BVIP6-EZ.js.map → TasksListPage-oEfEGj0_.js.map} +1 -1
  159. package/dashboard/dist/assets/{TimeAgo-C-rd9F9g.js → TimeAgo-Dz5TgZZZ.js} +2 -2
  160. package/dashboard/dist/assets/{TimeAgo-C-rd9F9g.js.map → TimeAgo-Dz5TgZZZ.js.map} +1 -1
  161. package/dashboard/dist/assets/{TimestampCell-DPbchDOI.js → TimestampCell-BUTgE244.js} +2 -2
  162. package/dashboard/dist/assets/{TimestampCell-DPbchDOI.js.map → TimestampCell-BUTgE244.js.map} +1 -1
  163. package/dashboard/dist/assets/{ToolTestPanel-DAUC8DHK.js → ToolTestPanel-BS4g6vt-.js} +2 -2
  164. package/dashboard/dist/assets/{ToolTestPanel-DAUC8DHK.js.map → ToolTestPanel-BS4g6vt-.js.map} +1 -1
  165. package/dashboard/dist/assets/{TopicDetailPage-70mMKBzG.js → TopicDetailPage-C_I6JIVD.js} +2 -2
  166. package/dashboard/dist/assets/{TopicDetailPage-70mMKBzG.js.map → TopicDetailPage-C_I6JIVD.js.map} +1 -1
  167. package/dashboard/dist/assets/{TopicsPage-CE3hBthn.js → TopicsPage-Cr6-wfhJ.js} +2 -2
  168. package/dashboard/dist/assets/{TopicsPage-CE3hBthn.js.map → TopicsPage-Cr6-wfhJ.js.map} +1 -1
  169. package/dashboard/dist/assets/{UserName-BDBDA-LR.js → UserName-ZFpWMaFF.js} +2 -2
  170. package/dashboard/dist/assets/{UserName-BDBDA-LR.js.map → UserName-ZFpWMaFF.js.map} +1 -1
  171. package/dashboard/dist/assets/{WorkflowExecutionPage-BbkLZ1co.js → WorkflowExecutionPage-ByPixDZW.js} +2 -2
  172. package/dashboard/dist/assets/{WorkflowExecutionPage-BbkLZ1co.js.map → WorkflowExecutionPage-ByPixDZW.js.map} +1 -1
  173. package/dashboard/dist/assets/{WorkflowsDashboard-Bp1L7Ggz.js → WorkflowsDashboard-CWsJdMdR.js} +2 -2
  174. package/dashboard/dist/assets/{WorkflowsDashboard-Bp1L7Ggz.js.map → WorkflowsDashboard-CWsJdMdR.js.map} +1 -1
  175. package/dashboard/dist/assets/{WorkflowsOverview-IeTKHAi4.js → WorkflowsOverview-Dk9gyqZN.js} +2 -2
  176. package/dashboard/dist/assets/{WorkflowsOverview-IeTKHAi4.js.map → WorkflowsOverview-Dk9gyqZN.js.map} +1 -1
  177. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DtKCXnKt.js → YamlWorkflowDetailPage-CHwcrsaT.js} +2 -2
  178. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DtKCXnKt.js.map → YamlWorkflowDetailPage-CHwcrsaT.js.map} +1 -1
  179. package/dashboard/dist/assets/{YamlWorkflowsPage-CEcZBV_3.js → YamlWorkflowsPage-B5jRX2Ph.js} +2 -2
  180. package/dashboard/dist/assets/{YamlWorkflowsPage-CEcZBV_3.js.map → YamlWorkflowsPage-B5jRX2Ph.js.map} +1 -1
  181. package/dashboard/dist/assets/{agents-BT-sEk81.js → agents-Dd7E-27d.js} +2 -2
  182. package/dashboard/dist/assets/{agents-BT-sEk81.js.map → agents-Dd7E-27d.js.map} +1 -1
  183. package/dashboard/dist/assets/{bots-DRoAdLek.js → bots-CpaYjZTk.js} +2 -2
  184. package/dashboard/dist/assets/{bots-DRoAdLek.js.map → bots-CpaYjZTk.js.map} +1 -1
  185. package/dashboard/dist/assets/{capabilities-Bc-nJk6y.js → capabilities-CNjg_qv1.js} +2 -2
  186. package/dashboard/dist/assets/{capabilities-Bc-nJk6y.js.map → capabilities-CNjg_qv1.js.map} +1 -1
  187. package/dashboard/dist/assets/{controlplane-aXceSIRf.js → controlplane-DgmvnAtU.js} +2 -2
  188. package/dashboard/dist/assets/{controlplane-aXceSIRf.js.map → controlplane-DgmvnAtU.js.map} +1 -1
  189. package/dashboard/dist/assets/escalation-columns-Uj4U9g5H.js +2 -0
  190. package/dashboard/dist/assets/escalation-columns-Uj4U9g5H.js.map +1 -0
  191. package/dashboard/dist/assets/{index-C3VTJcrp.js → index-BFASQ7_X.js} +2 -2
  192. package/dashboard/dist/assets/{index-C3VTJcrp.js.map → index-BFASQ7_X.js.map} +1 -1
  193. package/dashboard/dist/assets/{index-DH03y-UT.js → index-BT1Ms5Q5.js} +2 -2
  194. package/dashboard/dist/assets/{index-DH03y-UT.js.map → index-BT1Ms5Q5.js.map} +1 -1
  195. package/dashboard/dist/assets/{index-Djsoi8DI.js → index-BrwqtXRh.js} +2 -2
  196. package/dashboard/dist/assets/{index-Djsoi8DI.js.map → index-BrwqtXRh.js.map} +1 -1
  197. package/dashboard/dist/assets/index-BsHVgWH6.js +13 -0
  198. package/dashboard/dist/assets/{index-BEPKAjna.js.map → index-BsHVgWH6.js.map} +1 -1
  199. package/dashboard/dist/assets/index-ByBy9M3L.js +2 -0
  200. package/dashboard/dist/assets/{index-BCFEQEMC.js.map → index-ByBy9M3L.js.map} +1 -1
  201. package/dashboard/dist/assets/{index-CZyO9hRb.js → index-C_K7OlzT.js} +2 -2
  202. package/dashboard/dist/assets/{index-CZyO9hRb.js.map → index-C_K7OlzT.js.map} +1 -1
  203. package/dashboard/dist/assets/{index-Ba-s5Yb5.js → index-CnOvJz6U.js} +2 -2
  204. package/dashboard/dist/assets/{index-Ba-s5Yb5.js.map → index-CnOvJz6U.js.map} +1 -1
  205. package/dashboard/dist/assets/{index-CcgmR-7-.js → index-CtlBjl8o.js} +2 -2
  206. package/dashboard/dist/assets/{index-CcgmR-7-.js.map → index-CtlBjl8o.js.map} +1 -1
  207. package/dashboard/dist/assets/{index-DBxpyIw5.js → index-D4Dlznn9.js} +2 -2
  208. package/dashboard/dist/assets/{index-DBxpyIw5.js.map → index-D4Dlznn9.js.map} +1 -1
  209. package/dashboard/dist/assets/{index-BUYokcrl.js → index-LRYC__mE.js} +30 -30
  210. package/dashboard/dist/assets/index-LRYC__mE.js.map +1 -0
  211. package/dashboard/dist/assets/{index-DcppjzP5.css → index-MYI2_Xb3.css} +1 -1
  212. package/dashboard/dist/assets/index-OfO0173w.js +3 -0
  213. package/dashboard/dist/assets/index-OfO0173w.js.map +1 -0
  214. package/dashboard/dist/assets/{index-h2gX31B2.js → index-RIFT3RlO.js} +2 -2
  215. package/dashboard/dist/assets/{index-h2gX31B2.js.map → index-RIFT3RlO.js.map} +1 -1
  216. package/dashboard/dist/assets/{index-CuBGGwXf.js → index-x5z73M9N.js} +2 -2
  217. package/dashboard/dist/assets/{index-CuBGGwXf.js.map → index-x5z73M9N.js.map} +1 -1
  218. package/dashboard/dist/assets/{knowledge-BhW8V-Hq.js → knowledge-Cci_r6Kl.js} +2 -2
  219. package/dashboard/dist/assets/{knowledge-BhW8V-Hq.js.map → knowledge-Cci_r6Kl.js.map} +1 -1
  220. package/dashboard/dist/assets/{mcp-BYfSMQzh.js → mcp-NY4iL0L-.js} +2 -2
  221. package/dashboard/dist/assets/{mcp-BYfSMQzh.js.map → mcp-NY4iL0L-.js.map} +1 -1
  222. package/dashboard/dist/assets/{mcp-query-DUJoOk_q.js → mcp-query-CbvZo_I_.js} +2 -2
  223. package/dashboard/dist/assets/{mcp-query-DUJoOk_q.js.map → mcp-query-CbvZo_I_.js.map} +1 -1
  224. package/dashboard/dist/assets/{personas-jT1O_SB4.js → personas-Fy-f7QQd.js} +2 -2
  225. package/dashboard/dist/assets/{personas-jT1O_SB4.js.map → personas-Fy-f7QQd.js.map} +1 -1
  226. package/dashboard/dist/assets/{pipelines-Bp-wIaz2.js → pipelines-DKiuozxV.js} +2 -2
  227. package/dashboard/dist/assets/{pipelines-Bp-wIaz2.js.map → pipelines-DKiuozxV.js.map} +1 -1
  228. package/dashboard/dist/assets/{tasks-CCrvnXbz.js → tasks-CdM1Rkk9.js} +2 -2
  229. package/dashboard/dist/assets/{tasks-CCrvnXbz.js.map → tasks-CdM1Rkk9.js.map} +1 -1
  230. package/dashboard/dist/assets/{topics-Blft0I1L.js → topics-XNy2mf3n.js} +2 -2
  231. package/dashboard/dist/assets/{topics-Blft0I1L.js.map → topics-XNy2mf3n.js.map} +1 -1
  232. package/dashboard/dist/assets/{useDebouncedValue-BYqbcism.js → useDebouncedValue-CyGcU3_S.js} +2 -2
  233. package/dashboard/dist/assets/{useDebouncedValue-BYqbcism.js.map → useDebouncedValue-CyGcU3_S.js.map} +1 -1
  234. package/dashboard/dist/assets/{useNamespace-BfxJAUgG.js → useNamespace-C2RIh_IN.js} +2 -2
  235. package/dashboard/dist/assets/{useNamespace-BfxJAUgG.js.map → useNamespace-C2RIh_IN.js.map} +1 -1
  236. package/dashboard/dist/assets/{useYamlActivityEvents-BukJuWpb.js → useYamlActivityEvents-CDiV5fjf.js} +2 -2
  237. package/dashboard/dist/assets/{useYamlActivityEvents-BukJuWpb.js.map → useYamlActivityEvents-CDiV5fjf.js.map} +1 -1
  238. package/dashboard/dist/assets/validate-DcGWN82Y.js +2 -0
  239. package/dashboard/dist/assets/validate-DcGWN82Y.js.map +1 -0
  240. package/dashboard/dist/assets/{yaml-workflows-DeRWqMGk.js → yaml-workflows-CH8UrouH.js} +2 -2
  241. package/dashboard/dist/assets/{yaml-workflows-DeRWqMGk.js.map → yaml-workflows-CH8UrouH.js.map} +1 -1
  242. package/dashboard/dist/index.html +2 -2
  243. package/docs/api/http/escalations.md +46 -0
  244. package/docs/api/sdk/escalations.md +16 -0
  245. package/docs/code-owned-configuration.md +12 -0
  246. package/docs/hitl/portal.md +2 -0
  247. package/docs/hitl/x-lt-list-schema.md +88 -1
  248. package/docs/hitl/x-lt-scan.md +4 -1
  249. package/docs/scan-codes.md +7 -1
  250. package/package.json +2 -1
  251. package/dashboard/dist/assets/AvailableEscalationsPage-CWMyy3IL.js +0 -2
  252. package/dashboard/dist/assets/AvailableEscalationsPage-CWMyy3IL.js.map +0 -1
  253. package/dashboard/dist/assets/CapabilitiesPage-DKxLvOfB.js +0 -2
  254. package/dashboard/dist/assets/CountdownTimer-BUBl_4mP.js +0 -2
  255. package/dashboard/dist/assets/CountdownTimer-BUBl_4mP.js.map +0 -1
  256. package/dashboard/dist/assets/DataTable-spX1dFyb.js +0 -2
  257. package/dashboard/dist/assets/DataTable-spX1dFyb.js.map +0 -1
  258. package/dashboard/dist/assets/EscalationListView-DTIVuym4.js +0 -2
  259. package/dashboard/dist/assets/EscalationListView-DTIVuym4.js.map +0 -1
  260. package/dashboard/dist/assets/EscalationTimeline-DNKNp6pL.js +0 -2
  261. package/dashboard/dist/assets/EscalationTimeline-DNKNp6pL.js.map +0 -1
  262. package/dashboard/dist/assets/OperationsPage-B2DA7n9m.js.map +0 -1
  263. package/dashboard/dist/assets/OperatorDashboard-C8RtPv8P.js +0 -2
  264. package/dashboard/dist/assets/OperatorDashboard-C8RtPv8P.js.map +0 -1
  265. package/dashboard/dist/assets/PortalPage-Xk1zVneM.js +0 -2
  266. package/dashboard/dist/assets/PortalPage-Xk1zVneM.js.map +0 -1
  267. package/dashboard/dist/assets/ResolverForm-BwVOJUpJ.js +0 -8
  268. package/dashboard/dist/assets/ResolverForm-BwVOJUpJ.js.map +0 -1
  269. package/dashboard/dist/assets/ScanStationPage-Cg8LCFR7.js +0 -2
  270. package/dashboard/dist/assets/ScanStationPage-Cg8LCFR7.js.map +0 -1
  271. package/dashboard/dist/assets/escalation-columns-Bf09Q89t.js +0 -2
  272. package/dashboard/dist/assets/escalation-columns-Bf09Q89t.js.map +0 -1
  273. package/dashboard/dist/assets/index-BCFEQEMC.js +0 -2
  274. package/dashboard/dist/assets/index-BEPKAjna.js +0 -13
  275. package/dashboard/dist/assets/index-BUYokcrl.js.map +0 -1
  276. package/dashboard/dist/assets/index-D1mKf_qz.js +0 -3
  277. package/dashboard/dist/assets/index-D1mKf_qz.js.map +0 -1
@@ -11,3 +11,4 @@ export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
11
11
  export { cancelSingleEscalation, bulkCancel } from './cancel';
12
12
  export { searchByFacets, claimGroups, claimByFacets } from './facets';
13
13
  export { aggregateByFacets, timelineByFacet } from './analytics';
14
+ export { getRelatedAggregates, getRelatedRows } from './related';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
3
+ exports.getRelatedRows = exports.getRelatedAggregates = exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.itemsView = exports.getEscalationItemsBySignalKey = exports.getEscalationItems = exports.removeItemByMetadata = exports.removeItemBySignalKey = exports.removeItem = exports.accumulateItemByMetadata = exports.accumulateItemBySignalKey = exports.accumulateItem = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetValues = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
4
4
  var create_1 = require("./create");
5
5
  Object.defineProperty(exports, "createEscalation", { enumerable: true, get: function () { return create_1.createEscalation; } });
6
6
  var list_1 = require("./list");
@@ -61,3 +61,6 @@ Object.defineProperty(exports, "claimByFacets", { enumerable: true, get: functio
61
61
  var analytics_1 = require("./analytics");
62
62
  Object.defineProperty(exports, "aggregateByFacets", { enumerable: true, get: function () { return analytics_1.aggregateByFacets; } });
63
63
  Object.defineProperty(exports, "timelineByFacet", { enumerable: true, get: function () { return analytics_1.timelineByFacet; } });
64
+ var related_1 = require("./related");
65
+ Object.defineProperty(exports, "getRelatedAggregates", { enumerable: true, get: function () { return related_1.getRelatedAggregates; } });
66
+ Object.defineProperty(exports, "getRelatedRows", { enumerable: true, get: function () { return related_1.getRelatedRows; } });
@@ -19,6 +19,11 @@ export interface FacetInput {
19
19
  * carries the full record.
20
20
  */
21
21
  include?: string;
22
+ /**
23
+ * Page by groups of this metadata key: a page holds whole groups and
24
+ * `total` counts groups. The response adds `groups: [{ key, ids }]`.
25
+ */
26
+ groupBy?: string;
22
27
  }
23
28
  /**
24
29
  * List escalations with optional filters.
@@ -43,6 +43,7 @@ exports.getStationMetrics = getStationMetrics;
43
43
  const escalationService = __importStar(require("../../services/escalation"));
44
44
  const features_1 = require("../../modules/features");
45
45
  const helpers_1 = require("./helpers");
46
+ const facet_sql_1 = require("../../services/escalation/facet-sql");
46
47
  /** Strip the heavyweight JSON columns from list rows unless asked back. */
47
48
  function projectListRows(rows, include) {
48
49
  if (include === 'envelope')
@@ -53,6 +54,12 @@ function projectListRows(rows, include) {
53
54
  function projectListResult(result, include) {
54
55
  return { ...result, escalations: projectListRows(result.escalations, include) };
55
56
  }
57
+ /** Run a scoped faceted search, paged by groups when the caller asked. */
58
+ async function runFacetedSearch(search, groupBy) {
59
+ return groupBy
60
+ ? escalationService.searchEscalationsGrouped({ ...search, groupKey: groupBy })
61
+ : escalationService.searchEscalationsFaceted(search);
62
+ }
56
63
  /** True when the caller asked for anything the plain list path can't express. */
57
64
  function hasFacetQuery(i) {
58
65
  return !!(i.facets ||
@@ -62,7 +69,8 @@ function hasFacetQuery(i) {
62
69
  i.orderBy?.length ||
63
70
  i.roles?.length ||
64
71
  i.available != null ||
65
- i.jeopardy === true);
72
+ i.jeopardy === true ||
73
+ !!i.groupBy);
66
74
  }
67
75
  /**
68
76
  * List escalations with optional filters.
@@ -86,6 +94,9 @@ function hasFacetQuery(i) {
86
94
  async function listEscalations(input, auth) {
87
95
  try {
88
96
  const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
97
+ if (input.groupBy != null && !facet_sql_1.FACET_KEY.test(input.groupBy)) {
98
+ return { status: 400, error: 'groupBy must be a metadata key (letters, numbers, underscores)' };
99
+ }
89
100
  if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
90
101
  return { status: 200, data: { escalations: [], total: 0 } };
91
102
  }
@@ -93,7 +104,7 @@ async function listEscalations(input, auth) {
93
104
  // language (facets/block/range/exists/metadata-sort) IN SQL — the caller's
94
105
  // role(s) can only NARROW within their scope, never widen past it.
95
106
  if (hasFacetQuery(input)) {
96
- const result = await escalationService.searchEscalationsFaceted({
107
+ const result = await runFacetedSearch({
97
108
  global: scope.global,
98
109
  visibleRoles: scope.global ? undefined : scope.allRoles,
99
110
  selfRoles: scope.global ? undefined : scope.selfRoles,
@@ -117,7 +128,7 @@ async function listEscalations(input, auth) {
117
128
  search: input.search,
118
129
  limit: input.limit ?? 50,
119
130
  offset: input.offset ?? 0,
120
- });
131
+ }, input.groupBy);
121
132
  return { status: 200, data: projectListResult(result, input.include) };
122
133
  }
123
134
  const result = await escalationService.listEscalations({
@@ -164,12 +175,15 @@ async function listEscalations(input, auth) {
164
175
  async function listAvailableEscalations(input, auth) {
165
176
  try {
166
177
  const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
178
+ if (input.groupBy != null && !facet_sql_1.FACET_KEY.test(input.groupBy)) {
179
+ return { status: 400, error: 'groupBy must be a metadata key (letters, numbers, underscores)' };
180
+ }
167
181
  if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
168
182
  return { status: 200, data: { escalations: [], total: 0 } };
169
183
  }
170
184
  // Faceted path — same as listEscalations but pinned to the available pool.
171
185
  if (hasFacetQuery(input)) {
172
- const result = await escalationService.searchEscalationsFaceted({
186
+ const result = await runFacetedSearch({
173
187
  global: scope.global,
174
188
  visibleRoles: scope.global ? undefined : scope.allRoles,
175
189
  selfRoles: scope.global ? undefined : scope.selfRoles,
@@ -192,7 +206,7 @@ async function listAvailableEscalations(input, auth) {
192
206
  search: input.search,
193
207
  limit: input.limit ?? 50,
194
208
  offset: input.offset ?? 0,
195
- });
209
+ }, input.groupBy);
196
210
  return { status: 200, data: projectListResult(result, input.include) };
197
211
  }
198
212
  const result = await escalationService.listAvailableEscalations({
@@ -0,0 +1,18 @@
1
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
2
+ /**
3
+ * Aggregate every related set the role's list schema declares, for one page
4
+ * of host rows. One statement per (set, split) pair, whatever the page size.
5
+ */
6
+ export declare function getRelatedAggregates(input: {
7
+ role: string;
8
+ ids: string[];
9
+ version?: number;
10
+ }, auth: LTApiAuth): Promise<LTApiResult>;
11
+ /** One host's rows in one related set, for a row detail section. */
12
+ export declare function getRelatedRows(input: {
13
+ role: string;
14
+ id: string;
15
+ set: string;
16
+ version?: number;
17
+ limit?: number;
18
+ }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,205 @@
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.getRelatedAggregates = getRelatedAggregates;
37
+ exports.getRelatedRows = getRelatedRows;
38
+ const escalationService = __importStar(require("../../services/escalation"));
39
+ const roleService = __importStar(require("../../services/role"));
40
+ const uuid_1 = require("../../lib/uuid");
41
+ const list_schema_1 = require("../../shared/list-schema");
42
+ const segment_1 = require("../../shared/roles/segment");
43
+ const helpers_1 = require("./helpers");
44
+ const DEFAULT_STATUS = 'pending';
45
+ const NOT_FOUND = 'Role list schema not found';
46
+ /** Gate the host role, then read its declaration from the stored list schema. */
47
+ async function loadDeclaration(role, version, auth) {
48
+ if (typeof role !== 'string' || !role)
49
+ return { error: { status: 400, error: 'role is required' } };
50
+ if (version !== undefined && (!Number.isInteger(version) || version < 1)) {
51
+ return { error: { status: 400, error: 'version must be a positive integer' } };
52
+ }
53
+ const readScope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
54
+ const readable = readScope.global || readScope.allRoles.includes(role) || readScope.selfRoles.includes(role);
55
+ if (!readable)
56
+ return { error: { status: 404, error: NOT_FOUND } };
57
+ const stored = await roleService.getRoleListSchema(role, version);
58
+ if (!stored)
59
+ return { error: { status: 404, error: NOT_FOUND } };
60
+ let relations;
61
+ try {
62
+ relations = (0, list_schema_1.readListSchemaRelations)(stored.list_schema);
63
+ }
64
+ catch (err) {
65
+ return { error: { status: 422, error: `list schema for ${role}: ${err.message}` } };
66
+ }
67
+ const scope = {
68
+ global: readScope.global,
69
+ visibleRoles: readScope.global ? undefined : readScope.allRoles,
70
+ selfRoles: readScope.global ? undefined : readScope.selfRoles,
71
+ meUserId: auth.userId,
72
+ };
73
+ return { scope, readScope, relations, version: stored.version };
74
+ }
75
+ async function resolveQueryRoles(query, readScope) {
76
+ const details = await roleService.listRolesWithDetails();
77
+ const roles = query.roles ?? (0, segment_1.segmentRoles)(details, query.segment);
78
+ if (!roles)
79
+ return `segment "${query.segment}" names no Pace Board sequence`;
80
+ const titles = new Map(details.map((d) => [d.role, d.title]));
81
+ const roleLabels = {};
82
+ for (const r of roles)
83
+ roleLabels[r] = titles.get(r) || r;
84
+ const restricted = readScope.global ? [] : roles.filter((r) => !readScope.allRoles.includes(r));
85
+ return { roles, roleLabels, restricted };
86
+ }
87
+ /** The split paths the declared columns ask of one set ('' when unsplit). */
88
+ function splitsFor(relations, set) {
89
+ const splits = new Set(relations.columns.filter((c) => c.related === set).map((c) => c.splitBy ?? ''));
90
+ if (!splits.size)
91
+ splits.add('');
92
+ return [...splits];
93
+ }
94
+ /**
95
+ * Aggregate every related set the role's list schema declares, for one page
96
+ * of host rows. One statement per (set, split) pair, whatever the page size.
97
+ */
98
+ async function getRelatedAggregates(input, auth) {
99
+ try {
100
+ if (!Array.isArray(input.ids))
101
+ return { status: 400, error: 'ids must be an array of escalation ids' };
102
+ if (input.ids.length > list_schema_1.RELATED_LIMITS.MAX_HOSTS) {
103
+ return { status: 400, error: `ids holds at most ${list_schema_1.RELATED_LIMITS.MAX_HOSTS} rows` };
104
+ }
105
+ const loaded = await loadDeclaration(input.role, input.version, auth);
106
+ if ('error' in loaded)
107
+ return loaded.error;
108
+ const { scope, readScope, relations, version } = loaded;
109
+ const data = { version, sets: {} };
110
+ const names = Object.keys(relations.sets);
111
+ const ids = [...new Set(input.ids.filter(uuid_1.isUuid))];
112
+ if (!names.length || !ids.length)
113
+ return { status: 200, data };
114
+ const hosts = await escalationService.readRelatedHosts({ ids, role: input.role, scope });
115
+ const hostIds = hosts.map((h) => h.id);
116
+ for (const name of names) {
117
+ const decl = relations.sets[name];
118
+ const result = { source: decl.source, aggregates: {} };
119
+ if (decl.source === list_schema_1.RELATED_SOURCES.ITEMS) {
120
+ const roles = new Set();
121
+ for (const splitBy of splitsFor(relations, name)) {
122
+ const read = await escalationService.aggregateRelatedItems({
123
+ hostIds, scope, splitBy: splitBy || undefined,
124
+ });
125
+ result.aggregates[splitBy] = read.aggregates;
126
+ read.roles.forEach((r) => roles.add(r));
127
+ }
128
+ if (roles.size)
129
+ result.roles = [...roles].sort();
130
+ }
131
+ else {
132
+ const resolved = await resolveQueryRoles(decl.query, readScope);
133
+ if (typeof resolved === 'string')
134
+ return { status: 400, error: `x-lt-related.${name}: ${resolved}` };
135
+ Object.assign(result, resolved);
136
+ const matched = [];
137
+ const unresolved = [];
138
+ for (const host of hosts) {
139
+ const match = (0, list_schema_1.resolveRelatedFacets)(decl.query.facets ?? {}, (0, list_schema_1.rowTemplateContext)(host), decl.query.narrow);
140
+ if (match)
141
+ matched.push({ hostId: host.id, match });
142
+ else
143
+ unresolved.push(host.id);
144
+ }
145
+ for (const splitBy of splitsFor(relations, name)) {
146
+ const agg = await escalationService.aggregateRelatedQuery({
147
+ hosts: matched, roles: resolved.roles, status: decl.query.status ?? DEFAULT_STATUS, scope,
148
+ splitBy: splitBy || undefined,
149
+ });
150
+ for (const id of unresolved)
151
+ agg[id] = { count: 0, unresolved: true };
152
+ result.aggregates[splitBy] = agg;
153
+ }
154
+ }
155
+ data.sets[name] = result;
156
+ }
157
+ return { status: 200, data };
158
+ }
159
+ catch (err) {
160
+ return { status: 500, error: err.message };
161
+ }
162
+ }
163
+ /** One host's rows in one related set, for a row detail section. */
164
+ async function getRelatedRows(input, auth) {
165
+ try {
166
+ if (!(0, uuid_1.isUuid)(input.id))
167
+ return { status: 400, error: 'id must be an escalation id' };
168
+ if (input.limit !== undefined && (!Number.isInteger(input.limit) || input.limit < 1 || input.limit > list_schema_1.RELATED_LIMITS.ROWS_MAX)) {
169
+ return { status: 400, error: `limit must be 1..${list_schema_1.RELATED_LIMITS.ROWS_MAX}` };
170
+ }
171
+ const loaded = await loadDeclaration(input.role, input.version, auth);
172
+ if ('error' in loaded)
173
+ return loaded.error;
174
+ const { scope, readScope, relations } = loaded;
175
+ const decl = relations.sets[input.set];
176
+ if (!decl)
177
+ return { status: 404, error: `x-lt-related declares no set "${input.set}"` };
178
+ const [host] = await escalationService.readRelatedHosts({ ids: [input.id], role: input.role, scope });
179
+ if (!host)
180
+ return { status: 404, error: 'Escalation not found' };
181
+ const limit = input.limit ?? list_schema_1.RELATED_LIMITS.ROWS_DEFAULT;
182
+ if (decl.source === list_schema_1.RELATED_SOURCES.ITEMS) {
183
+ const { rows, total } = await escalationService.listRelatedItems({ hostId: input.id, scope, limit });
184
+ const data = { source: decl.source, rows, total };
185
+ return { status: 200, data };
186
+ }
187
+ const resolved = await resolveQueryRoles(decl.query, readScope);
188
+ if (typeof resolved === 'string')
189
+ return { status: 400, error: `x-lt-related.${input.set}: ${resolved}` };
190
+ const match = (0, list_schema_1.resolveRelatedFacets)(decl.query.facets ?? {}, (0, list_schema_1.rowTemplateContext)(host), decl.query.narrow);
191
+ const { rows, total } = match
192
+ ? await escalationService.listRelatedQueryRows({
193
+ hosts: [{ hostId: input.id, match }], roles: resolved.roles,
194
+ status: decl.query.status ?? DEFAULT_STATUS, scope, limit,
195
+ })
196
+ : { rows: [], total: 0 };
197
+ const data = {
198
+ source: decl.source, rows, total, restricted: resolved.restricted, roleLabels: resolved.roleLabels,
199
+ };
200
+ return { status: 200, data };
201
+ }
202
+ catch (err) {
203
+ return { status: 500, error: err.message };
204
+ }
205
+ }
@@ -51,6 +51,7 @@ const roleService = __importStar(require("../services/role"));
51
51
  const types_1 = require("../services/role/types");
52
52
  const badge_grant_1 = require("../services/role/badge-grant");
53
53
  const facet_sql_1 = require("../services/escalation/facet-sql");
54
+ const list_schema_1 = require("../shared/list-schema");
54
55
  /**
55
56
  * List all distinct role names in the system.
56
57
  *
@@ -295,6 +296,9 @@ async function updateRole(input) {
295
296
  const grantError = (0, badge_grant_1.badgeGrantError)(input.properties?.[types_1.ROLE_PROPERTY_KEYS.BADGE_GRANT]);
296
297
  if (grantError)
297
298
  return { status: 400, error: grantError };
299
+ const listSchemaError = input.list_schema != null ? (0, list_schema_1.listSchemaRelationsError)(input.list_schema) : null;
300
+ if (listSchemaError)
301
+ return { status: 400, error: `list_schema: ${listSchemaError}` };
298
302
  if (input.portals != null && !isPortalList(input.portals)) {
299
303
  return {
300
304
  status: 400,
@@ -45,7 +45,11 @@ function renderFacts(step, ctx, row) {
45
45
  if (!step.facts)
46
46
  return undefined;
47
47
  const tpl = { ...(0, context_1.templateContext)(ctx), item: row.metadata ?? {} };
48
- return step.facts.map((fact) => ({ label: fact.label, value: scanCodeService.renderScanCopy(fact.value, tpl) }));
48
+ return step.facts.map((fact) => ({
49
+ label: fact.label,
50
+ value: scanCodeService.renderScanCopy(fact.value.trim(), tpl),
51
+ ...(fact.format ? { format: fact.format } : {}),
52
+ }));
49
53
  }
50
54
  // ── The info-choice outcome — locate → present reality + labeled choices ───
51
55
  //
@@ -8,6 +8,6 @@ import type { LTApiResult } from '../types/sdk';
8
8
  * environment block (long-tail + HotMesh versions, Node env/version).
9
9
  *
10
10
  * @param req — the incoming HTTP request, used to derive NATS WS URL from headers when proxying
11
- * @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, environment } }`
11
+ * @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, search, branding, display, environment } }`
12
12
  */
13
13
  export declare function getSettings(req?: IncomingMessage): Promise<LTApiResult>;
@@ -10,6 +10,7 @@ const config_1 = require("../modules/config");
10
10
  const features_1 = require("../modules/features");
11
11
  const search_1 = require("../modules/search");
12
12
  const branding_1 = require("../modules/branding");
13
+ const display_1 = require("../modules/display");
13
14
  const version_1 = require("../modules/version");
14
15
  const sso_1 = require("../modules/sso");
15
16
  const defaults_1 = require("../modules/defaults");
@@ -41,7 +42,7 @@ function resolveNatsWsUrl(adapter, req) {
41
42
  * environment block (long-tail + HotMesh versions, Node env/version).
42
43
  *
43
44
  * @param req — the incoming HTTP request, used to derive NATS WS URL from headers when proxying
44
- * @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, environment } }`
45
+ * @returns `{ status: 200, data: { telemetry, escalation, events, auth, ai, features, search, branding, display, environment } }`
45
46
  */
46
47
  async function getSettings(req) {
47
48
  try {
@@ -79,6 +80,7 @@ async function getSettings(req) {
79
80
  features: (0, features_1.getFeatureFlags)(),
80
81
  search: (0, search_1.getSearchConfig)(),
81
82
  branding: (0, branding_1.getBranding)(),
83
+ display: (0, display_1.getDisplay)(),
82
84
  environment: {
83
85
  longTailVersion: version_1.LONG_TAIL_VERSION,
84
86
  hotmeshVersion: version_1.HOTMESH_VERSION,
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Deployment display settings surfaced to the dashboard via /api/settings.
3
+ * `timeZone` (an IANA name, e.g. "America/Chicago") renders every dashboard
4
+ * date in the deployment's zone; unset, dates render in the browser's zone.
5
+ */
6
+ export interface LTDisplayConfig {
7
+ timeZone?: string;
8
+ }
9
+ /** True when the runtime knows the IANA zone name. */
10
+ export declare function isValidTimeZone(zone: string): boolean;
11
+ /** Apply the start config's display block; an unknown zone fails the boot. */
12
+ export declare function configureDisplay(patch?: LTDisplayConfig): void;
13
+ export declare function getDisplay(): {
14
+ timeZone: string | null;
15
+ };
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidTimeZone = isValidTimeZone;
4
+ exports.configureDisplay = configureDisplay;
5
+ exports.getDisplay = getDisplay;
6
+ let timeZone = null;
7
+ /** True when the runtime knows the IANA zone name. */
8
+ function isValidTimeZone(zone) {
9
+ try {
10
+ new Intl.DateTimeFormat('en-US', { timeZone: zone });
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ /** Apply the start config's display block; an unknown zone fails the boot. */
18
+ function configureDisplay(patch) {
19
+ const zone = patch?.timeZone;
20
+ if (zone !== undefined && (typeof zone !== 'string' || !isValidTimeZone(zone))) {
21
+ throw new Error(`display.timeZone "${zone}" is not an IANA time zone name`);
22
+ }
23
+ timeZone = zone ?? null;
24
+ }
25
+ function getDisplay() {
26
+ return { timeZone };
27
+ }
@@ -9,6 +9,7 @@ const single_1 = require("./single");
9
9
  const resolve_1 = require("./resolve");
10
10
  const facets_1 = require("./facets");
11
11
  const analytics_1 = require("./analytics");
12
+ const related_1 = require("./related");
12
13
  const router = (0, express_1.Router)();
13
14
  // Registration order matters: literal paths before parameterized /:id routes.
14
15
  // GET /, /available, /types, /stats
@@ -26,6 +27,8 @@ const router = (0, express_1.Router)();
26
27
  (0, facets_1.registerFacetRoutes)(router);
27
28
  // POST /aggregate-by-facets, /timeline-by-facet
28
29
  (0, analytics_1.registerAnalyticsRoutes)(router);
30
+ // POST /related, /related/rows
31
+ (0, related_1.registerRelatedRoutes)(router);
29
32
  // PATCH /:id/escalate, GET /by-workflow/:workflowId,
30
33
  // GET /:id, POST /:id/claim, POST /:id/release
31
34
  (0, single_1.registerSingleRoutes)(router);
@@ -110,6 +110,7 @@ function registerListRoutes(router) {
110
110
  available: req.query.available != null ? req.query.available === 'true' : undefined,
111
111
  jeopardy: req.query.jeopardy === '1' || req.query.jeopardy === 'true' || undefined,
112
112
  include: req.query.include,
113
+ groupBy: req.query.groupBy || undefined,
113
114
  }, req.auth);
114
115
  res.status(result.status).json(result.data ?? { error: result.error });
115
116
  });
@@ -138,6 +139,7 @@ function registerListRoutes(router) {
138
139
  orderBy: jsonParam(req.query.orderBy),
139
140
  jeopardy: req.query.jeopardy === '1' || req.query.jeopardy === 'true' || undefined,
140
141
  include: req.query.include,
142
+ groupBy: req.query.groupBy || undefined,
141
143
  }, req.auth);
142
144
  res.status(result.status).json(result.data ?? { error: result.error });
143
145
  });
@@ -0,0 +1,7 @@
1
+ import type { Router } from 'express';
2
+ /**
3
+ * Related sets for role list views. The role's stored list schema declares
4
+ * the sets; the caller names the role, the page's host rows, and the schema
5
+ * version it rendered. Results are scoped to the caller's read scope.
6
+ */
7
+ export declare function registerRelatedRoutes(router: Router): void;
@@ -0,0 +1,60 @@
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.registerRelatedRoutes = registerRelatedRoutes;
37
+ const api = __importStar(require("../../api/escalations"));
38
+ /**
39
+ * Related sets for role list views. The role's stored list schema declares
40
+ * the sets; the caller names the role, the page's host rows, and the schema
41
+ * version it rendered. Results are scoped to the caller's read scope.
42
+ */
43
+ function registerRelatedRoutes(router) {
44
+ /**
45
+ * POST /api/escalations/related
46
+ * Body: { role, ids, version? }
47
+ */
48
+ router.post('/related', async (req, res) => {
49
+ const result = await api.getRelatedAggregates(req.body ?? {}, req.auth);
50
+ res.status(result.status).json(result.data ?? { error: result.error });
51
+ });
52
+ /**
53
+ * POST /api/escalations/related/rows
54
+ * Body: { role, id, set, version?, limit? }
55
+ */
56
+ router.post('/related/rows', async (req, res) => {
57
+ const result = await api.getRelatedRows(req.body ?? {}, req.auth);
58
+ res.status(result.status).json(result.data ?? { error: result.error });
59
+ });
60
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * consolidation-sim: drive the consolidation example over HTTP so the
3
+ * Consolidate list shows a floor in motion.
4
+ *
5
+ * Opens a tub per destination (the first tub split into a standard and an
6
+ * express lane), starts orders with a mix of service levels, then walks
7
+ * them through the stations (prep, check) and places each in its
8
+ * destination's bin. With KEEP=1 it stops partway, leaving orders at every
9
+ * station and some bins partly filled, so the list's Holds and Coming
10
+ * columns and each row's expansion have something to show.
11
+ *
12
+ * Usage:
13
+ * npm run consolidation:sim
14
+ * DESTINATIONS=3 ORDERS=12 EXPRESS_PCT=30 KEEP=1 npm run consolidation:sim
15
+ *
16
+ * Env vars:
17
+ * BASE_URL long-tail API (default http://localhost:3000)
18
+ * DESTINATIONS destinations, one tub each (default 2)
19
+ * ORDERS orders to start (default 8)
20
+ * EXPRESS_PCT percent of orders on the express service (default 25)
21
+ * STEP_MS pause between floor moves (default 600)
22
+ * KEEP 1 = stop partway and leave the floor mid-flight (default 0)
23
+ * LT_USERNAME / LT_PASSWORD the dev login (defaults: the seeded admin)
24
+ */
25
+ export {};