@hotmeshio/long-tail 0.18.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/build/api/escalations/index.d.ts +1 -1
  2. package/build/api/escalations/index.js +2 -1
  3. package/build/api/escalations/list.d.ts +11 -0
  4. package/build/api/escalations/list.js +31 -2
  5. package/build/api/users.d.ts +11 -0
  6. package/build/api/users.js +19 -0
  7. package/build/lib/uuid.d.ts +11 -0
  8. package/build/lib/uuid.js +20 -0
  9. package/build/routes/escalations/list.js +10 -1
  10. package/build/routes/users.js +9 -0
  11. package/build/scripts/ortho-populate.d.ts +3 -1
  12. package/build/scripts/ortho-populate.js +15 -5
  13. package/build/sdk/index.d.ts +1 -0
  14. package/build/services/escalation/batch.js +3 -0
  15. package/build/services/escalation/bulk.js +8 -0
  16. package/build/services/escalation/crud.js +26 -0
  17. package/build/services/escalation/queries.d.ts +14 -1
  18. package/build/services/escalation/queries.js +49 -7
  19. package/build/services/escalation/sql.d.ts +4 -2
  20. package/build/services/escalation/sql.js +4 -0
  21. package/build/services/role/types.d.ts +1 -1
  22. package/build/services/role/types.js +1 -1
  23. package/build/services/user/auth.js +2 -2
  24. package/build/services/user/crud.d.ts +13 -0
  25. package/build/services/user/crud.js +26 -3
  26. package/build/services/user/index.d.ts +1 -1
  27. package/build/services/user/index.js +2 -1
  28. package/build/services/user/sql.d.ts +11 -5
  29. package/build/services/user/sql.js +18 -6
  30. package/build/tsconfig.tsbuildinfo +1 -1
  31. package/dashboard/dist/assets/{AdminDashboard-DDY8bceq.js → AdminDashboard-DPkWtPc1.js} +2 -2
  32. package/dashboard/dist/assets/{AdminDashboard-DDY8bceq.js.map → AdminDashboard-DPkWtPc1.js.map} +1 -1
  33. package/dashboard/dist/assets/{AgentConfigPage-D47sHnup.js → AgentConfigPage-DRfnLiQS.js} +2 -2
  34. package/dashboard/dist/assets/{AgentConfigPage-D47sHnup.js.map → AgentConfigPage-DRfnLiQS.js.map} +1 -1
  35. package/dashboard/dist/assets/{AgentDetailPage-DwrfByA2.js → AgentDetailPage-CufRZXnT.js} +3 -3
  36. package/dashboard/dist/assets/{AgentDetailPage-DwrfByA2.js.map → AgentDetailPage-CufRZXnT.js.map} +1 -1
  37. package/dashboard/dist/assets/{AgentsPage-CLSjlyXy.js → AgentsPage-CoCWGhUd.js} +2 -2
  38. package/dashboard/dist/assets/{AgentsPage-CLSjlyXy.js.map → AgentsPage-CoCWGhUd.js.map} +1 -1
  39. package/dashboard/dist/assets/AvailableEscalationsPage-BSqOctep.js +2 -0
  40. package/dashboard/dist/assets/AvailableEscalationsPage-BSqOctep.js.map +1 -0
  41. package/dashboard/dist/assets/{BotPicker-CbL7gQFq.js → BotPicker-DMojDLlV.js} +2 -2
  42. package/dashboard/dist/assets/{BotPicker-CbL7gQFq.js.map → BotPicker-DMojDLlV.js.map} +1 -1
  43. package/dashboard/dist/assets/BulkAssignModal-DYbM_6Or.js +2 -0
  44. package/dashboard/dist/assets/BulkAssignModal-DYbM_6Or.js.map +1 -0
  45. package/dashboard/dist/assets/{CapabilitiesPage-Q9Pe0y_p.js → CapabilitiesPage-CDQ5JHNP.js} +2 -2
  46. package/dashboard/dist/assets/{CapabilitiesPage-Q9Pe0y_p.js.map → CapabilitiesPage-CDQ5JHNP.js.map} +1 -1
  47. package/dashboard/dist/assets/{CollapsibleSection-BZOtaWPR.js → CollapsibleSection-D4VlCEbD.js} +2 -2
  48. package/dashboard/dist/assets/{CollapsibleSection-BZOtaWPR.js.map → CollapsibleSection-D4VlCEbD.js.map} +1 -1
  49. package/dashboard/dist/assets/{ConfirmDeleteModal-6CidwpPx.js → ConfirmDeleteModal-DnNHjJtD.js} +2 -2
  50. package/dashboard/dist/assets/{ConfirmDeleteModal-6CidwpPx.js.map → ConfirmDeleteModal-DnNHjJtD.js.map} +1 -1
  51. package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js +2 -0
  52. package/dashboard/dist/assets/CountdownTimer-DPHMBmgz.js.map +1 -0
  53. package/dashboard/dist/assets/{CredentialsPage-dxjrUEyO.js → CredentialsPage-CSYZw-rL.js} +2 -2
  54. package/dashboard/dist/assets/{CredentialsPage-dxjrUEyO.js.map → CredentialsPage-CSYZw-rL.js.map} +1 -1
  55. package/dashboard/dist/assets/{CronLabel-D8oo8eaA.js → CronLabel-CpmqDrlJ.js} +2 -2
  56. package/dashboard/dist/assets/{CronLabel-D8oo8eaA.js.map → CronLabel-CpmqDrlJ.js.map} +1 -1
  57. package/dashboard/dist/assets/{DropZone-CWCh5ItZ.js → DropZone-BbXlQnYB.js} +2 -2
  58. package/dashboard/dist/assets/{DropZone-CWCh5ItZ.js.map → DropZone-BbXlQnYB.js.map} +1 -1
  59. package/dashboard/dist/assets/{ElapsedCell-FHHQ69G3.js → ElapsedCell-Cul22qBS.js} +2 -2
  60. package/dashboard/dist/assets/{ElapsedCell-FHHQ69G3.js.map → ElapsedCell-Cul22qBS.js.map} +1 -1
  61. package/dashboard/dist/assets/EntityTimelinePanel-CtzpJ-j2.js +2 -0
  62. package/dashboard/dist/assets/EntityTimelinePanel-CtzpJ-j2.js.map +1 -0
  63. package/dashboard/dist/assets/{EscalationListSchemaPage-D5L5lDNb.js → EscalationListSchemaPage-BZQ8Y_UH.js} +2 -2
  64. package/dashboard/dist/assets/{EscalationListSchemaPage-D5L5lDNb.js.map → EscalationListSchemaPage-BZQ8Y_UH.js.map} +1 -1
  65. package/dashboard/dist/assets/{EscalationSchemaPage-bYbfEpSB.js → EscalationSchemaPage-CydTtq_A.js} +2 -2
  66. package/dashboard/dist/assets/{EscalationSchemaPage-bYbfEpSB.js.map → EscalationSchemaPage-CydTtq_A.js.map} +1 -1
  67. package/dashboard/dist/assets/{EscalationsOverview-DjtIjL1b.js → EscalationsOverview-DSYC0nI7.js} +2 -2
  68. package/dashboard/dist/assets/{EscalationsOverview-DjtIjL1b.js.map → EscalationsOverview-DSYC0nI7.js.map} +1 -1
  69. package/dashboard/dist/assets/{EventTable-CihVTREC.js → EventTable-s48cTXIw.js} +2 -2
  70. package/dashboard/dist/assets/{EventTable-CihVTREC.js.map → EventTable-s48cTXIw.js.map} +1 -1
  71. package/dashboard/dist/assets/{FilterBar-Fin1IqHc.js → FilterBar-B61qKmFD.js} +2 -2
  72. package/dashboard/dist/assets/{FilterBar-Fin1IqHc.js.map → FilterBar-B61qKmFD.js.map} +1 -1
  73. package/dashboard/dist/assets/{GraphInvokePage-D77ILPd3.js → GraphInvokePage-DxZv_KC2.js} +2 -2
  74. package/dashboard/dist/assets/{GraphInvokePage-D77ILPd3.js.map → GraphInvokePage-DxZv_KC2.js.map} +1 -1
  75. package/dashboard/dist/assets/HomePage-zK3VP_9g.js +2 -0
  76. package/dashboard/dist/assets/HomePage-zK3VP_9g.js.map +1 -0
  77. package/dashboard/dist/assets/{ListToolbar-DyHaJBTk.js → ListToolbar-DaxloPQc.js} +2 -2
  78. package/dashboard/dist/assets/{ListToolbar-DyHaJBTk.js.map → ListToolbar-DaxloPQc.js.map} +1 -1
  79. package/dashboard/dist/assets/{McpOverview-qz7Ivf0G.js → McpOverview-Ciq8r6-p.js} +2 -2
  80. package/dashboard/dist/assets/{McpOverview-qz7Ivf0G.js.map → McpOverview-Ciq8r6-p.js.map} +1 -1
  81. package/dashboard/dist/assets/{McpQueryDetailPage-D6MB4CZM.js → McpQueryDetailPage-DIC0FEEb.js} +2 -2
  82. package/dashboard/dist/assets/{McpQueryDetailPage-D6MB4CZM.js.map → McpQueryDetailPage-DIC0FEEb.js.map} +1 -1
  83. package/dashboard/dist/assets/McpQueryPage-BBy0NSNg.js +2 -0
  84. package/dashboard/dist/assets/{McpQueryPage-BqqRF5cQ.js.map → McpQueryPage-BBy0NSNg.js.map} +1 -1
  85. package/dashboard/dist/assets/{McpRunDetailPage-DxLEhzhn.js → McpRunDetailPage-BqKNmIyW.js} +2 -2
  86. package/dashboard/dist/assets/{McpRunDetailPage-DxLEhzhn.js.map → McpRunDetailPage-BqKNmIyW.js.map} +1 -1
  87. package/dashboard/dist/assets/{McpRunsPage-BOsS4Hdf.js → McpRunsPage-D0RlOpzR.js} +2 -2
  88. package/dashboard/dist/assets/{McpRunsPage-BOsS4Hdf.js.map → McpRunsPage-D0RlOpzR.js.map} +1 -1
  89. package/dashboard/dist/assets/NamespacePill-Dbtm9R2T.js +2 -0
  90. package/dashboard/dist/assets/{NamespacePill-CJikgGzE.js.map → NamespacePill-Dbtm9R2T.js.map} +1 -1
  91. package/dashboard/dist/assets/OperationsPage-BX0SFizr.js +3 -0
  92. package/dashboard/dist/assets/OperationsPage-BX0SFizr.js.map +1 -0
  93. package/dashboard/dist/assets/OperatorDashboard-vXG0TjAQ.js +2 -0
  94. package/dashboard/dist/assets/{OperatorDashboard-C5rlijvh.js.map → OperatorDashboard-vXG0TjAQ.js.map} +1 -1
  95. package/dashboard/dist/assets/{PageHeader-DZmymFBS.js → PageHeader-xB92ELs3.js} +2 -2
  96. package/dashboard/dist/assets/{PageHeader-DZmymFBS.js.map → PageHeader-xB92ELs3.js.map} +1 -1
  97. package/dashboard/dist/assets/{PageHeaderWithStats-DuAm6YK2.js → PageHeaderWithStats-DVo_qqn1.js} +2 -2
  98. package/dashboard/dist/assets/{PageHeaderWithStats-DuAm6YK2.js.map → PageHeaderWithStats-DVo_qqn1.js.map} +1 -1
  99. package/dashboard/dist/assets/{PersonaDetailPage-JBdVvT5g.js → PersonaDetailPage-w5TXcn4Q.js} +2 -2
  100. package/dashboard/dist/assets/{PersonaDetailPage-JBdVvT5g.js.map → PersonaDetailPage-w5TXcn4Q.js.map} +1 -1
  101. package/dashboard/dist/assets/PersonasPage-Dzcinl1L.js +2 -0
  102. package/dashboard/dist/assets/PersonasPage-Dzcinl1L.js.map +1 -0
  103. package/dashboard/dist/assets/{ProcessDetailPage-CHnzOzQn.js → ProcessDetailPage-BVXieFX1.js} +2 -2
  104. package/dashboard/dist/assets/{ProcessDetailPage-CHnzOzQn.js.map → ProcessDetailPage-BVXieFX1.js.map} +1 -1
  105. package/dashboard/dist/assets/{ProcessesListPage-DuXTS5-v.js → ProcessesListPage-CKKNpk4z.js} +2 -2
  106. package/dashboard/dist/assets/{ProcessesListPage-DuXTS5-v.js.map → ProcessesListPage-CKKNpk4z.js.map} +1 -1
  107. package/dashboard/dist/assets/RoleDetailPage-BytSo-YE.js +8 -0
  108. package/dashboard/dist/assets/RoleDetailPage-BytSo-YE.js.map +1 -0
  109. package/dashboard/dist/assets/{RolePill-C9LSs1aK.js → RolePill-CYpL3a2d.js} +2 -2
  110. package/dashboard/dist/assets/{RolePill-C9LSs1aK.js.map → RolePill-CYpL3a2d.js.map} +1 -1
  111. package/dashboard/dist/assets/{RolesPage-h77-JOLd.js → RolesPage-eayR9H4f.js} +2 -2
  112. package/dashboard/dist/assets/{RolesPage-h77-JOLd.js.map → RolesPage-eayR9H4f.js.map} +1 -1
  113. package/dashboard/dist/assets/{RunAsSelector-DoLFJ0mZ.js → RunAsSelector-D7RPwaAl.js} +2 -2
  114. package/dashboard/dist/assets/{RunAsSelector-DoLFJ0mZ.js.map → RunAsSelector-D7RPwaAl.js.map} +1 -1
  115. package/dashboard/dist/assets/{ScanCodesPage-b5NZM_-f.js → ScanCodesPage-C8-ZBXF5.js} +2 -2
  116. package/dashboard/dist/assets/{ScanCodesPage-b5NZM_-f.js.map → ScanCodesPage-C8-ZBXF5.js.map} +1 -1
  117. package/dashboard/dist/assets/{ScanSchemeDetailPage-t7X6ekaW.js → ScanSchemeDetailPage-tQhEgFKf.js} +2 -2
  118. package/dashboard/dist/assets/{ScanSchemeDetailPage-t7X6ekaW.js.map → ScanSchemeDetailPage-tQhEgFKf.js.map} +1 -1
  119. package/dashboard/dist/assets/{ScanStationPage-r02hkTAG.js → ScanStationPage-CuhqsBKo.js} +2 -2
  120. package/dashboard/dist/assets/{ScanStationPage-r02hkTAG.js.map → ScanStationPage-CuhqsBKo.js.map} +1 -1
  121. package/dashboard/dist/assets/{ScopeBadge-CjyC7iyO.js → ScopeBadge-BmNzZlSj.js} +2 -2
  122. package/dashboard/dist/assets/{ScopeBadge-CjyC7iyO.js.map → ScopeBadge-BmNzZlSj.js.map} +1 -1
  123. package/dashboard/dist/assets/{StickyPagination-BGHQbp0_.js → StickyPagination-BIVTAMnP.js} +2 -2
  124. package/dashboard/dist/assets/{StickyPagination-BGHQbp0_.js.map → StickyPagination-BIVTAMnP.js.map} +1 -1
  125. package/dashboard/dist/assets/{StreamMessageDetail-C-wfdbLJ.js → StreamMessageDetail-CYSC2cO1.js} +2 -2
  126. package/dashboard/dist/assets/{StreamMessageDetail-C-wfdbLJ.js.map → StreamMessageDetail-CYSC2cO1.js.map} +1 -1
  127. package/dashboard/dist/assets/{SwimlaneTimeline-Dnoz-me3.js → SwimlaneTimeline-BMZAs_2K.js} +2 -2
  128. package/dashboard/dist/assets/{SwimlaneTimeline-Dnoz-me3.js.map → SwimlaneTimeline-BMZAs_2K.js.map} +1 -1
  129. package/dashboard/dist/assets/{TagInput-D-vLSMQC.js → TagInput-D1uszNd2.js} +2 -2
  130. package/dashboard/dist/assets/{TagInput-D-vLSMQC.js.map → TagInput-D1uszNd2.js.map} +1 -1
  131. package/dashboard/dist/assets/{TaskDetailPage-c9IiAhVJ.js → TaskDetailPage-CVUDUU5Q.js} +2 -2
  132. package/dashboard/dist/assets/{TaskDetailPage-c9IiAhVJ.js.map → TaskDetailPage-CVUDUU5Q.js.map} +1 -1
  133. package/dashboard/dist/assets/{TaskQueuePill-sFRMrQ5D.js → TaskQueuePill-C2H8oRfn.js} +2 -2
  134. package/dashboard/dist/assets/{TaskQueuePill-sFRMrQ5D.js.map → TaskQueuePill-C2H8oRfn.js.map} +1 -1
  135. package/dashboard/dist/assets/{TasksListPage-Dor8LSc5.js → TasksListPage-DEQymbXC.js} +2 -2
  136. package/dashboard/dist/assets/{TasksListPage-Dor8LSc5.js.map → TasksListPage-DEQymbXC.js.map} +1 -1
  137. package/dashboard/dist/assets/{TimeAgo-Dd8vmRnM.js → TimeAgo-CCxP67Rb.js} +2 -2
  138. package/dashboard/dist/assets/{TimeAgo-Dd8vmRnM.js.map → TimeAgo-CCxP67Rb.js.map} +1 -1
  139. package/dashboard/dist/assets/{TimestampCell-qJfC6-iT.js → TimestampCell-CE5ZUYhV.js} +2 -2
  140. package/dashboard/dist/assets/{TimestampCell-qJfC6-iT.js.map → TimestampCell-CE5ZUYhV.js.map} +1 -1
  141. package/dashboard/dist/assets/{ToolPill-OQ3mC11d.js → ToolPill-D-h8AoB8.js} +2 -2
  142. package/dashboard/dist/assets/{ToolPill-OQ3mC11d.js.map → ToolPill-D-h8AoB8.js.map} +1 -1
  143. package/dashboard/dist/assets/ToolTestPanel-BHuQTyBY.js +2 -0
  144. package/dashboard/dist/assets/{ToolTestPanel-CEGY5jss.js.map → ToolTestPanel-BHuQTyBY.js.map} +1 -1
  145. package/dashboard/dist/assets/{TopicDetailPage-SI80ZTVv.js → TopicDetailPage-SFuiludx.js} +3 -3
  146. package/dashboard/dist/assets/{TopicDetailPage-SI80ZTVv.js.map → TopicDetailPage-SFuiludx.js.map} +1 -1
  147. package/dashboard/dist/assets/{TopicsPage-DiVB8tNr.js → TopicsPage-DO8pUmng.js} +2 -2
  148. package/dashboard/dist/assets/{TopicsPage-DiVB8tNr.js.map → TopicsPage-DO8pUmng.js.map} +1 -1
  149. package/dashboard/dist/assets/UserName-CsLnT75E.js +2 -0
  150. package/dashboard/dist/assets/UserName-CsLnT75E.js.map +1 -0
  151. package/dashboard/dist/assets/{WorkflowExecutionPage-e-Q57yiJ.js → WorkflowExecutionPage-BttnEvOd.js} +2 -2
  152. package/dashboard/dist/assets/{WorkflowExecutionPage-e-Q57yiJ.js.map → WorkflowExecutionPage-BttnEvOd.js.map} +1 -1
  153. package/dashboard/dist/assets/{WorkflowPill-Dh3hIW1l.js → WorkflowPill-CZvBbkn4.js} +2 -2
  154. package/dashboard/dist/assets/{WorkflowPill-Dh3hIW1l.js.map → WorkflowPill-CZvBbkn4.js.map} +1 -1
  155. package/dashboard/dist/assets/{WorkflowsDashboard-DLKzN80h.js → WorkflowsDashboard-BRboBhlK.js} +2 -2
  156. package/dashboard/dist/assets/{WorkflowsDashboard-DLKzN80h.js.map → WorkflowsDashboard-BRboBhlK.js.map} +1 -1
  157. package/dashboard/dist/assets/{WorkflowsOverview-J-ITQiO5.js → WorkflowsOverview-CDFTYeQo.js} +2 -2
  158. package/dashboard/dist/assets/{WorkflowsOverview-J-ITQiO5.js.map → WorkflowsOverview-CDFTYeQo.js.map} +1 -1
  159. package/dashboard/dist/assets/{YamlWorkflowDetailPage-B_-ahhf1.js → YamlWorkflowDetailPage-CmnZFevp.js} +2 -2
  160. package/dashboard/dist/assets/{YamlWorkflowDetailPage-B_-ahhf1.js.map → YamlWorkflowDetailPage-CmnZFevp.js.map} +1 -1
  161. package/dashboard/dist/assets/{YamlWorkflowsPage-DQNeERXU.js → YamlWorkflowsPage-Qq1jfcrH.js} +2 -2
  162. package/dashboard/dist/assets/{YamlWorkflowsPage-DQNeERXU.js.map → YamlWorkflowsPage-Qq1jfcrH.js.map} +1 -1
  163. package/dashboard/dist/assets/{agents-BsJ-MizQ.js → agents-C7vUIO7e.js} +2 -2
  164. package/dashboard/dist/assets/{agents-BsJ-MizQ.js.map → agents-C7vUIO7e.js.map} +1 -1
  165. package/dashboard/dist/assets/{bots-q1UYqaIh.js → bots-BaOblnW4.js} +2 -2
  166. package/dashboard/dist/assets/{bots-q1UYqaIh.js.map → bots-BaOblnW4.js.map} +1 -1
  167. package/dashboard/dist/assets/{capabilities-BvjPXUcJ.js → capabilities-RZpmDWoy.js} +2 -2
  168. package/dashboard/dist/assets/{capabilities-BvjPXUcJ.js.map → capabilities-RZpmDWoy.js.map} +1 -1
  169. package/dashboard/dist/assets/{controlplane-BwlNpoJ_.js → controlplane-BwGdcwXR.js} +2 -2
  170. package/dashboard/dist/assets/{controlplane-BwlNpoJ_.js.map → controlplane-BwGdcwXR.js.map} +1 -1
  171. package/dashboard/dist/assets/escalation-columns-B4DG_5v8.js +2 -0
  172. package/dashboard/dist/assets/escalation-columns-B4DG_5v8.js.map +1 -0
  173. package/dashboard/dist/assets/index-8LIpvj2e.js +3 -0
  174. package/dashboard/dist/assets/index-8LIpvj2e.js.map +1 -0
  175. package/dashboard/dist/assets/index-BICLHYJJ.js +2 -0
  176. package/dashboard/dist/assets/{index-cvmt1plS.js.map → index-BICLHYJJ.js.map} +1 -1
  177. package/dashboard/dist/assets/{index-BvGIyZUt.js → index-BQPUlmmz.js} +2 -2
  178. package/dashboard/dist/assets/{index-BvGIyZUt.js.map → index-BQPUlmmz.js.map} +1 -1
  179. package/dashboard/dist/assets/{index-D88VWEVp.js → index-BaC3sbJH.js} +33 -33
  180. package/dashboard/dist/assets/index-BaC3sbJH.js.map +1 -0
  181. package/dashboard/dist/assets/{index-DsKqDMs4.js → index-BuqpU6ow.js} +2 -2
  182. package/dashboard/dist/assets/{index-DsKqDMs4.js.map → index-BuqpU6ow.js.map} +1 -1
  183. package/dashboard/dist/assets/index-CD6jtND1.css +1 -0
  184. package/dashboard/dist/assets/{index-DBvkaa-B.js → index-CsIw-ZLk.js} +4 -4
  185. package/dashboard/dist/assets/{index-DBvkaa-B.js.map → index-CsIw-ZLk.js.map} +1 -1
  186. package/dashboard/dist/assets/{index-Bb9ZZUyB.js → index-CtJkvX9e.js} +3 -3
  187. package/dashboard/dist/assets/{index-Bb9ZZUyB.js.map → index-CtJkvX9e.js.map} +1 -1
  188. package/dashboard/dist/assets/{index-8Gmtvd8e.js → index-D9NtDRtp.js} +2 -2
  189. package/dashboard/dist/assets/{index-8Gmtvd8e.js.map → index-D9NtDRtp.js.map} +1 -1
  190. package/dashboard/dist/assets/{index-DDHoDZRg.js → index-DU9-flEo.js} +2 -2
  191. package/dashboard/dist/assets/{index-DDHoDZRg.js.map → index-DU9-flEo.js.map} +1 -1
  192. package/dashboard/dist/assets/{index-CldVY0UQ.js → index-G3NmdMjt.js} +2 -2
  193. package/dashboard/dist/assets/{index-CldVY0UQ.js.map → index-G3NmdMjt.js.map} +1 -1
  194. package/dashboard/dist/assets/index-IWufkcH9.js +2 -0
  195. package/dashboard/dist/assets/{index-BhzsR_gZ.js.map → index-IWufkcH9.js.map} +1 -1
  196. package/dashboard/dist/assets/{index-Hbbox1A4.js → index-iegzyfMv.js} +2 -2
  197. package/dashboard/dist/assets/{index-Hbbox1A4.js.map → index-iegzyfMv.js.map} +1 -1
  198. package/dashboard/dist/assets/{index-O9uuK2yO.js → index-xNFTmmsv.js} +2 -2
  199. package/dashboard/dist/assets/{index-O9uuK2yO.js.map → index-xNFTmmsv.js.map} +1 -1
  200. package/dashboard/dist/assets/{knowledge-DM0tNphj.js → knowledge-CjwCbm3E.js} +2 -2
  201. package/dashboard/dist/assets/{knowledge-DM0tNphj.js.map → knowledge-CjwCbm3E.js.map} +1 -1
  202. package/dashboard/dist/assets/{mcp-CQ_TD2P9.js → mcp-C-DMktCT.js} +2 -2
  203. package/dashboard/dist/assets/{mcp-CQ_TD2P9.js.map → mcp-C-DMktCT.js.map} +1 -1
  204. package/dashboard/dist/assets/{mcp-query-BP7KSGhc.js → mcp-query-KBeBNHb4.js} +2 -2
  205. package/dashboard/dist/assets/{mcp-query-BP7KSGhc.js.map → mcp-query-KBeBNHb4.js.map} +1 -1
  206. package/dashboard/dist/assets/{personas-DclHdHKK.js → personas-B32sSCxm.js} +2 -2
  207. package/dashboard/dist/assets/{personas-DclHdHKK.js.map → personas-B32sSCxm.js.map} +1 -1
  208. package/dashboard/dist/assets/{pipelines-LwuKJfj-.js → pipelines-DNLwDumm.js} +2 -2
  209. package/dashboard/dist/assets/{pipelines-LwuKJfj-.js.map → pipelines-DNLwDumm.js.map} +1 -1
  210. package/dashboard/dist/assets/{tasks-CDs-Li2v.js → tasks-DrWSrjmj.js} +2 -2
  211. package/dashboard/dist/assets/{tasks-CDs-Li2v.js.map → tasks-DrWSrjmj.js.map} +1 -1
  212. package/dashboard/dist/assets/{topics-BeOSelBX.js → topics-DgzGU-vR.js} +2 -2
  213. package/dashboard/dist/assets/{topics-BeOSelBX.js.map → topics-DgzGU-vR.js.map} +1 -1
  214. package/dashboard/dist/assets/{useDebouncedValue-DhhAKjDC.js → useDebouncedValue-DG5JOj1F.js} +2 -2
  215. package/dashboard/dist/assets/{useDebouncedValue-DhhAKjDC.js.map → useDebouncedValue-DG5JOj1F.js.map} +1 -1
  216. package/dashboard/dist/assets/{useNamespace-C-E2gNEK.js → useNamespace-CdgF7Jxo.js} +2 -2
  217. package/dashboard/dist/assets/{useNamespace-C-E2gNEK.js.map → useNamespace-CdgF7Jxo.js.map} +1 -1
  218. package/dashboard/dist/assets/{useYamlActivityEvents-CmLzX3YU.js → useYamlActivityEvents-BEaOtgSZ.js} +2 -2
  219. package/dashboard/dist/assets/{useYamlActivityEvents-CmLzX3YU.js.map → useYamlActivityEvents-BEaOtgSZ.js.map} +1 -1
  220. package/dashboard/dist/assets/{vendor-icons-R9b9gQ04.js → vendor-icons-BCWsItQ7.js} +138 -133
  221. package/dashboard/dist/assets/{vendor-icons-R9b9gQ04.js.map → vendor-icons-BCWsItQ7.js.map} +1 -1
  222. package/dashboard/dist/assets/{workflows-CYv1CTU0.js → workflows-CX_oarls.js} +2 -2
  223. package/dashboard/dist/assets/{workflows-CYv1CTU0.js.map → workflows-CX_oarls.js.map} +1 -1
  224. package/dashboard/dist/assets/{yaml-workflows-BgAsc6-I.js → yaml-workflows-YASUDPo0.js} +2 -2
  225. package/dashboard/dist/assets/{yaml-workflows-BgAsc6-I.js.map → yaml-workflows-YASUDPo0.js.map} +1 -1
  226. package/dashboard/dist/index.html +3 -3
  227. package/docs/dashboard.md +141 -68
  228. package/docs/faceted-routing.md +4 -0
  229. package/docs/hitl/x-lt-list-schema.md +3 -0
  230. package/docs/operations.md +61 -60
  231. package/docs/scan-codes.md +18 -0
  232. package/package.json +1 -1
  233. package/dashboard/dist/assets/AvailableEscalationsPage-D2ukvuQh.js +0 -2
  234. package/dashboard/dist/assets/AvailableEscalationsPage-D2ukvuQh.js.map +0 -1
  235. package/dashboard/dist/assets/BulkAssignModal-CMSgvHIs.js +0 -2
  236. package/dashboard/dist/assets/BulkAssignModal-CMSgvHIs.js.map +0 -1
  237. package/dashboard/dist/assets/CountdownTimer-B5lM7PfE.js +0 -2
  238. package/dashboard/dist/assets/CountdownTimer-B5lM7PfE.js.map +0 -1
  239. package/dashboard/dist/assets/EntityTimelinePanel-B5NuHnPF.js +0 -2
  240. package/dashboard/dist/assets/EntityTimelinePanel-B5NuHnPF.js.map +0 -1
  241. package/dashboard/dist/assets/HomePage-8XsQFqKL.js +0 -2
  242. package/dashboard/dist/assets/HomePage-8XsQFqKL.js.map +0 -1
  243. package/dashboard/dist/assets/McpQueryPage-BqqRF5cQ.js +0 -2
  244. package/dashboard/dist/assets/NamespacePill-CJikgGzE.js +0 -2
  245. package/dashboard/dist/assets/OperationsPage-Cj1mJLMC.js +0 -3
  246. package/dashboard/dist/assets/OperationsPage-Cj1mJLMC.js.map +0 -1
  247. package/dashboard/dist/assets/OperatorDashboard-C5rlijvh.js +0 -2
  248. package/dashboard/dist/assets/PersonasPage-Xp_Gt6El.js +0 -2
  249. package/dashboard/dist/assets/PersonasPage-Xp_Gt6El.js.map +0 -1
  250. package/dashboard/dist/assets/RoleDetailPage-C9GGHNf4.js +0 -8
  251. package/dashboard/dist/assets/RoleDetailPage-C9GGHNf4.js.map +0 -1
  252. package/dashboard/dist/assets/ToolTestPanel-CEGY5jss.js +0 -2
  253. package/dashboard/dist/assets/UserName-Dmm456xT.js +0 -2
  254. package/dashboard/dist/assets/UserName-Dmm456xT.js.map +0 -1
  255. package/dashboard/dist/assets/escalation-columns-Bo3PfIZj.js +0 -2
  256. package/dashboard/dist/assets/escalation-columns-Bo3PfIZj.js.map +0 -1
  257. package/dashboard/dist/assets/index-B8JfGtQB.js +0 -3
  258. package/dashboard/dist/assets/index-B8JfGtQB.js.map +0 -1
  259. package/dashboard/dist/assets/index-BhzsR_gZ.js +0 -2
  260. package/dashboard/dist/assets/index-D88VWEVp.js.map +0 -1
  261. package/dashboard/dist/assets/index-cvmt1plS.js +0 -2
  262. package/dashboard/dist/assets/index-qU_dXqP4.css +0 -1
@@ -1,5 +1,5 @@
1
1
  export { createEscalation } from './create';
2
- export { listEscalations, listAvailableEscalations, listDistinctTypes, listFacetKeys, getEscalationStats, getStationMetrics } from './list';
2
+ export { listEscalations, listAvailableEscalations, listDistinctTypes, listFacetKeys, listFacetValues, getEscalationStats, getStationMetrics } from './list';
3
3
  export { getEscalation, getEscalationsByWorkflowId, escalateToRole } from './single';
4
4
  export { getEscalationLookups } from './lookups';
5
5
  export { claimEscalation, releaseEscalation } from './claim';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.resolveBatchItemByMetadata = exports.resolveBatchItemBySignalKey = exports.resolveBatchItem = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkUnassign = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.getEscalationLookups = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = exports.listFacetKeys = exports.listDistinctTypes = exports.listAvailableEscalations = exports.listEscalations = exports.createEscalation = void 0;
3
+ exports.timelineByFacet = exports.aggregateByFacets = exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.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");
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "listEscalations", { enumerable: true, get: funct
8
8
  Object.defineProperty(exports, "listAvailableEscalations", { enumerable: true, get: function () { return list_1.listAvailableEscalations; } });
9
9
  Object.defineProperty(exports, "listDistinctTypes", { enumerable: true, get: function () { return list_1.listDistinctTypes; } });
10
10
  Object.defineProperty(exports, "listFacetKeys", { enumerable: true, get: function () { return list_1.listFacetKeys; } });
11
+ Object.defineProperty(exports, "listFacetValues", { enumerable: true, get: function () { return list_1.listFacetValues; } });
11
12
  Object.defineProperty(exports, "getEscalationStats", { enumerable: true, get: function () { return list_1.getEscalationStats; } });
12
13
  Object.defineProperty(exports, "getStationMetrics", { enumerable: true, get: function () { return list_1.getStationMetrics; } });
13
14
  var single_1 = require("./single");
@@ -90,6 +90,16 @@ export declare function listAvailableEscalations(input: {
90
90
  * @returns `{ status: 200, data: { keys: string[] } }`
91
91
  */
92
92
  export declare function listFacetKeys(_input: unknown, auth: LTApiAuth): Promise<LTApiResult>;
93
+ /**
94
+ * Distinct VALUES for one metadata facet key, role-scoped — powers the facet
95
+ * value picker (e.g. facility → north|south). A missing/malformed key returns
96
+ * an empty list, never an error.
97
+ *
98
+ * @returns `{ status: 200, data: { values: string[] } }`
99
+ */
100
+ export declare function listFacetValues(input: {
101
+ key?: string;
102
+ }, auth: LTApiAuth): Promise<LTApiResult>;
93
103
  /**
94
104
  * List all distinct escalation type values.
95
105
  *
@@ -108,4 +118,5 @@ export declare function getEscalationStats(input: {
108
118
  }, auth: LTApiAuth): Promise<LTApiResult>;
109
119
  export declare function getStationMetrics(input: {
110
120
  period?: string;
121
+ facets?: Record<string, unknown>;
111
122
  }, auth: LTApiAuth): Promise<LTApiResult>;
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.listEscalations = listEscalations;
37
37
  exports.listAvailableEscalations = listAvailableEscalations;
38
38
  exports.listFacetKeys = listFacetKeys;
39
+ exports.listFacetValues = listFacetValues;
39
40
  exports.listDistinctTypes = listDistinctTypes;
40
41
  exports.getEscalationStats = getEscalationStats;
41
42
  exports.getStationMetrics = getStationMetrics;
@@ -239,6 +240,34 @@ async function listFacetKeys(_input, auth) {
239
240
  return { status: 500, error: err.message };
240
241
  }
241
242
  }
243
+ /**
244
+ * Distinct VALUES for one metadata facet key, role-scoped — powers the facet
245
+ * value picker (e.g. facility → north|south). A missing/malformed key returns
246
+ * an empty list, never an error.
247
+ *
248
+ * @returns `{ status: 200, data: { values: string[] } }`
249
+ */
250
+ async function listFacetValues(input, auth) {
251
+ try {
252
+ const key = input?.key;
253
+ if (!key)
254
+ return { status: 200, data: { values: [] } };
255
+ const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
256
+ if (!scope.global && scope.allRoles.length === 0 && scope.selfRoles.length === 0) {
257
+ return { status: 200, data: { values: [] } };
258
+ }
259
+ const values = await escalationService.listFacetValues(key, {
260
+ global: scope.global,
261
+ visibleRoles: scope.global ? undefined : scope.allRoles,
262
+ selfRoles: scope.global ? undefined : scope.selfRoles,
263
+ meUserId: auth.userId,
264
+ });
265
+ return { status: 200, data: { values } };
266
+ }
267
+ catch (err) {
268
+ return { status: 500, error: err.message };
269
+ }
270
+ }
242
271
  /**
243
272
  * List all distinct escalation type values.
244
273
  *
@@ -297,7 +326,7 @@ async function getStationMetrics(input, auth) {
297
326
  // elsewhere) — without the selfRoles union, a self-scoped operator would
298
327
  // see an empty board on their own lanes.
299
328
  if ((0, features_1.getFeatureFlags)().publicPaceBoard) {
300
- const stations = await escalationService.getStationMetrics(undefined, input.period);
329
+ const stations = await escalationService.getStationMetrics(undefined, input.period, input.facets);
301
330
  return { status: 200, data: { stations } };
302
331
  }
303
332
  const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
@@ -305,7 +334,7 @@ async function getStationMetrics(input, auth) {
305
334
  if (!scope.global && memberRoles.length === 0) {
306
335
  return { status: 200, data: { stations: [] } };
307
336
  }
308
- const stations = await escalationService.getStationMetrics(scope.global ? undefined : memberRoles, input.period);
337
+ const stations = await escalationService.getStationMetrics(scope.global ? undefined : memberRoles, input.period, input.facets);
309
338
  return { status: 200, data: { stations } };
310
339
  }
311
340
  catch (err) {
@@ -19,6 +19,17 @@ export declare function listUsers(input: {
19
19
  limit?: number;
20
20
  offset?: number;
21
21
  }): Promise<LTApiResult>;
22
+ /**
23
+ * Resolve many user ids to display fields (id, display_name, external_id, email)
24
+ * in one call. Thin projection only — no secrets, scopes, or metadata. Non-UUID
25
+ * ids are dropped, ids deduped, and the batch capped by the service.
26
+ *
27
+ * @param input.ids — the user ids to resolve
28
+ * @returns `{ status: 200, data: { users: [{ id, display_name, external_id, email }] } }`
29
+ */
30
+ export declare function getUserNames(input: {
31
+ ids?: string[];
32
+ }): Promise<LTApiResult>;
22
33
  /**
23
34
  * Retrieve a single user by ID.
24
35
  *
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.listUsers = listUsers;
37
+ exports.getUserNames = getUserNames;
37
38
  exports.getUser = getUser;
38
39
  exports.createUser = createUser;
39
40
  exports.updateUser = updateUser;
@@ -64,6 +65,24 @@ async function listUsers(input) {
64
65
  return { status: 500, error: err.message };
65
66
  }
66
67
  }
68
+ /**
69
+ * Resolve many user ids to display fields (id, display_name, external_id, email)
70
+ * in one call. Thin projection only — no secrets, scopes, or metadata. Non-UUID
71
+ * ids are dropped, ids deduped, and the batch capped by the service.
72
+ *
73
+ * @param input.ids — the user ids to resolve
74
+ * @returns `{ status: 200, data: { users: [{ id, display_name, external_id, email }] } }`
75
+ */
76
+ async function getUserNames(input) {
77
+ try {
78
+ const ids = Array.isArray(input.ids) ? input.ids : [];
79
+ const users = await userService.getUserNames(ids);
80
+ return { status: 200, data: { users } };
81
+ }
82
+ catch (err) {
83
+ return { status: 500, error: err.message };
84
+ }
85
+ }
67
86
  /**
68
87
  * Retrieve a single user by ID.
69
88
  *
@@ -0,0 +1,11 @@
1
+ /**
2
+ * UUID shape guard for open input reaching uuid-typed columns. Postgres
3
+ * throws `invalid input syntax for type uuid` on a bad cast, so every
4
+ * caller-supplied id must pass this gate BEFORE it reaches SQL — a
5
+ * non-UUID string is definitionally not-found, never a 500.
6
+ */
7
+ export declare const UUID_RE: RegExp;
8
+ export declare function isUuid(value: unknown): value is string;
9
+ /** The UUID members of a caller-supplied id list; non-UUIDs are dropped —
10
+ * they can match nothing, exactly like a well-formed id that does not exist. */
11
+ export declare function onlyUuids(ids: string[]): string[];
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * UUID shape guard for open input reaching uuid-typed columns. Postgres
4
+ * throws `invalid input syntax for type uuid` on a bad cast, so every
5
+ * caller-supplied id must pass this gate BEFORE it reaches SQL — a
6
+ * non-UUID string is definitionally not-found, never a 500.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.UUID_RE = void 0;
10
+ exports.isUuid = isUuid;
11
+ exports.onlyUuids = onlyUuids;
12
+ exports.UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
13
+ function isUuid(value) {
14
+ return typeof value === 'string' && exports.UUID_RE.test(value);
15
+ }
16
+ /** The UUID members of a caller-supplied id list; non-UUIDs are dropped —
17
+ * they can match nothing, exactly like a well-formed id that does not exist. */
18
+ function onlyUuids(ids) {
19
+ return ids.filter((id) => isUuid(id));
20
+ }
@@ -158,6 +158,15 @@ function registerListRoutes(router) {
158
158
  const result = await api.listFacetKeys(undefined, req.auth);
159
159
  res.status(result.status).json(result.data ?? { error: result.error });
160
160
  });
161
+ /**
162
+ * GET /api/escalations/facet-values?key=<facet>
163
+ * Distinct VALUES for one metadata facet key, visible to the caller
164
+ * (role-scoped). Powers the facet value picker (e.g. facility → north|south).
165
+ */
166
+ router.get('/facet-values', async (req, res) => {
167
+ const result = await api.listFacetValues({ key: req.query.key }, req.auth);
168
+ res.status(result.status).json(result.data ?? { error: result.error });
169
+ });
161
170
  /**
162
171
  * GET /api/escalations/station-metrics
163
172
  * Per-role P99/P50/avg/max wait + work times, resolved count, and in-arrears
@@ -165,7 +174,7 @@ function registerListRoutes(router) {
165
174
  * RBAC: superadmin sees all; others scoped to their roles.
166
175
  */
167
176
  router.get('/station-metrics', async (req, res) => {
168
- const result = await api.getStationMetrics({ period: req.query.period || undefined }, req.auth);
177
+ const result = await api.getStationMetrics({ period: req.query.period || undefined, facets: jsonParam(req.query.facets) }, req.auth);
169
178
  res.status(result.status).json(result.data ?? { error: result.error });
170
179
  });
171
180
  /**
@@ -55,6 +55,15 @@ router.get('/', async (req, res) => {
55
55
  });
56
56
  res.status(result.status).json(result.data ?? { error: result.error });
57
57
  });
58
+ /**
59
+ * POST /api/users/names
60
+ * Batch-resolve user ids to display fields. Body: { ids: string[] }.
61
+ * Any authenticated user — display names carry no secrets.
62
+ */
63
+ router.post('/names', async (req, res) => {
64
+ const result = await api.getUserNames({ ids: req.body?.ids });
65
+ res.status(result.status).json(result.data ?? { error: result.error });
66
+ });
58
67
  /**
59
68
  * GET /api/users/system-property-keys
60
69
  * The property keys the platform resolves identities against (enabled
@@ -100,7 +100,7 @@ declare function holdFor(esc: {
100
100
  declare function api(method: string, path: string, body?: unknown): Promise<any>;
101
101
  declare function login(): Promise<void>;
102
102
  declare function ensureSideQuestRoles(): Promise<void>;
103
- declare function createSideEscalation(role: string, workflowId: string, orderId: string, runId: string, description: string, authorizedAt: string): Promise<boolean>;
103
+ declare function createSideEscalation(role: string, workflowId: string, orderId: string, runId: string, description: string, authorizedAt: string, facility?: string): Promise<boolean>;
104
104
  declare function claimBatch(batchTag: string): Promise<number>;
105
105
  declare function resolveBatch(batchTag: string, runId: string): Promise<number>;
106
106
  interface PlannedOrder {
@@ -108,7 +108,9 @@ interface PlannedOrder {
108
108
  wfId: string;
109
109
  orderId: string;
110
110
  shoes: boolean;
111
+ facility: string;
111
112
  }
113
+ declare const FACILITIES: readonly ["north", "south"];
112
114
  declare function runOrders(batchTag: string, runId: string, plan: PlannedOrder[], target: {
113
115
  value: number;
114
116
  }): Promise<string[]>;
@@ -178,7 +178,7 @@ async function ensureSideQuestRoles() {
178
178
  console.log(`[${ts()}] Entity declared on ${declared} role(s): order_id`);
179
179
  }
180
180
  // ── Side-quest escalations (standalone rows — no workflow behind them) ────────
181
- async function createSideEscalation(role, workflowId, orderId, runId, description, authorizedAt) {
181
+ async function createSideEscalation(role, workflowId, orderId, runId, description, authorizedAt, facility) {
182
182
  try {
183
183
  await api('POST', '/api/escalations', {
184
184
  type: 'ortho-stage',
@@ -186,8 +186,8 @@ async function createSideEscalation(role, workflowId, orderId, runId, descriptio
186
186
  role,
187
187
  description,
188
188
  workflow_id: workflowId,
189
- envelope: JSON.stringify({ order_id: orderId }),
190
- metadata: { order_id: orderId, source: 'populate', run_id: runId, authorized_at: authorizedAt },
189
+ envelope: JSON.stringify({ order_id: orderId, ...(facility ? { facility } : {}) }),
190
+ metadata: { order_id: orderId, source: 'populate', run_id: runId, authorized_at: authorizedAt, ...(facility ? { facility } : {}) },
191
191
  });
192
192
  return true;
193
193
  }
@@ -261,7 +261,7 @@ async function resolveBatch(batchTag, runId) {
261
261
  // order's authorized_at rides along from the ordering escalation.
262
262
  if (esc.role === 'ordering') {
263
263
  const orderId = esc.metadata?.order_id ?? '';
264
- await createSideEscalation('inserting', esc.workflow_id, orderId, runId, `Stuff inserts into shoes for ${orderId}`, esc.metadata?.authorized_at ?? new Date().toISOString());
264
+ await createSideEscalation('inserting', esc.workflow_id, orderId, runId, `Stuff inserts into shoes for ${orderId}`, esc.metadata?.authorized_at ?? new Date().toISOString(), esc.metadata?.facility);
265
265
  }
266
266
  }
267
267
  catch (err) {
@@ -275,6 +275,10 @@ async function resolveBatch(batchTag, runId) {
275
275
  return 0;
276
276
  }
277
277
  }
278
+ // Two manufacturing sites — each order is assigned one at arrival and every
279
+ // escalation it spawns carries it, so the Pace Board's facet scope
280
+ // (facility = north|south) has real data to narrow.
281
+ const FACILITIES = ['north', 'south'];
278
282
  async function runOrders(batchTag, runId, plan, target) {
279
283
  let done = false;
280
284
  const workflowIds = [];
@@ -295,6 +299,9 @@ async function runOrders(batchTag, runId, plan, target) {
295
299
  data: {
296
300
  order_id: order.orderId,
297
301
  item_type: 'insole-standard',
302
+ // Stamped on the envelope; the workflow applies it to every stage
303
+ // escalation's metadata as the facility facet.
304
+ facility: order.facility,
298
305
  metadata: { source: 'populate', run_id: runId, authorized_at: authorizedAt },
299
306
  },
300
307
  metadata: { source: 'populate', run_id: runId, shoes: order.shoes },
@@ -308,7 +315,7 @@ async function runOrders(batchTag, runId, plan, target) {
308
315
  continue;
309
316
  }
310
317
  if (order.shoes) {
311
- const ok = await createSideEscalation('ordering', `${order.wfId}-shoes`, order.orderId, runId, `Order shoes for ${order.orderId}`, authorizedAt);
318
+ const ok = await createSideEscalation('ordering', `${order.wfId}-shoes`, order.orderId, runId, `Order shoes for ${order.orderId}`, authorizedAt, order.facility);
312
319
  if (!ok)
313
320
  target.value -= 2;
314
321
  }
@@ -372,6 +379,9 @@ async function main() {
372
379
  wfId: `${batchTag}-${i}`,
373
380
  orderId: `ORD-${runId}-${i}`,
374
381
  shoes: hasShoes(i),
382
+ // Pseudo-random per order (hashed on the workflow id): reproducible across
383
+ // re-runs, roughly balanced across both sites.
384
+ facility: FACILITIES[Math.floor(jitter(`${batchTag}-${i}`, 'facility') * FACILITIES.length)],
375
385
  }));
376
386
  const shoeCount = plan.filter((o) => o.shoes).length;
377
387
  // Each order resolves 8 manufacturing stages; a shoe order adds
@@ -123,6 +123,7 @@ export declare function createClient(options?: LTClientOptions): {
123
123
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
124
124
  getStationMetrics: (input: {
125
125
  period?: string;
126
+ facets?: Record<string, unknown>;
126
127
  }, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
127
128
  get: (input: {
128
129
  id: string;
@@ -4,6 +4,7 @@ exports.resolveBatchItem = resolveBatchItem;
4
4
  exports.resolveBatchItemBySignalKey = resolveBatchItemBySignalKey;
5
5
  exports.resolveBatchItemByMetadata = resolveBatchItemByMetadata;
6
6
  const escalation_wire_1 = require("../../lib/events/escalation-wire");
7
+ const uuid_1 = require("../../lib/uuid");
7
8
  const client_1 = require("./client");
8
9
  const crud_1 = require("./crud");
9
10
  const map_1 = require("./map");
@@ -15,6 +16,8 @@ const map_1 = require("./map");
15
16
  * outcomes publish nothing — the row was untouched.
16
17
  */
17
18
  async function resolveBatchItem(id, itemKey, payload, metadata, assertClaim, resolvedBy) {
19
+ if (!(0, uuid_1.isUuid)(id))
20
+ return { outcome: 'not-found', remaining: -1, escalation: null };
18
21
  const client = await (0, client_1.escalations)();
19
22
  const result = await client.resolveBatchItem({
20
23
  id,
@@ -8,6 +8,7 @@ exports.bulkUnassignEscalations = bulkUnassignEscalations;
8
8
  exports.bulkEscalateToRole = bulkEscalateToRole;
9
9
  exports.bulkCancelEscalations = bulkCancelEscalations;
10
10
  exports.bulkResolveForTriage = bulkResolveForTriage;
11
+ const uuid_1 = require("../../lib/uuid");
11
12
  const db_1 = require("../../lib/db");
12
13
  const client_1 = require("./client");
13
14
  const map_1 = require("./map");
@@ -17,6 +18,7 @@ const sql_1 = require("./sql");
17
18
  * Items already claimed by another active user are skipped.
18
19
  */
19
20
  async function bulkClaimEscalations(ids, userId, durationMinutes = 30) {
21
+ ids = (0, uuid_1.onlyUuids)(ids);
20
22
  if (ids.length === 0)
21
23
  return { claimed: 0, skipped: 0 };
22
24
  const client = await (0, client_1.escalations)();
@@ -27,6 +29,7 @@ async function bulkClaimEscalations(ids, userId, durationMinutes = 30) {
27
29
  * Items already claimed by another active user are skipped.
28
30
  */
29
31
  async function bulkAssignEscalations(ids, targetUserId, durationMinutes = 30) {
32
+ ids = (0, uuid_1.onlyUuids)(ids);
30
33
  if (ids.length === 0)
31
34
  return { assigned: 0, skipped: 0 };
32
35
  const client = await (0, client_1.escalations)();
@@ -60,6 +63,7 @@ async function bulkAssignEscalationsByQuery(query, targetUserId, durationMinutes
60
63
  * returned row carries its pre-update assignee for the event.
61
64
  */
62
65
  async function bulkReassignEscalations(ids, targetUserId, durationMinutes = 30) {
66
+ ids = (0, uuid_1.onlyUuids)(ids);
63
67
  if (ids.length === 0)
64
68
  return { assigned: 0, skipped: 0, changes: [] };
65
69
  await (0, client_1.ensureEscalationCompatView)();
@@ -77,6 +81,7 @@ async function bulkReassignEscalations(ids, targetUserId, durationMinutes = 30)
77
81
  * statement; unclaimed and terminal rows are skipped.
78
82
  */
79
83
  async function bulkUnassignEscalations(ids) {
84
+ ids = (0, uuid_1.onlyUuids)(ids);
80
85
  if (ids.length === 0)
81
86
  return { unassigned: 0, skipped: 0, changes: [] };
82
87
  await (0, client_1.ensureEscalationCompatView)();
@@ -93,6 +98,7 @@ async function bulkUnassignEscalations(ids) {
93
98
  * Clears assignment on all affected rows.
94
99
  */
95
100
  async function bulkEscalateToRole(ids, targetRole) {
101
+ ids = (0, uuid_1.onlyUuids)(ids);
96
102
  if (ids.length === 0)
97
103
  return 0;
98
104
  const client = await (0, client_1.escalations)();
@@ -104,6 +110,7 @@ async function bulkEscalateToRole(ids, targetRole) {
104
110
  * successfully cancelled.
105
111
  */
106
112
  async function bulkCancelEscalations(ids) {
113
+ ids = (0, uuid_1.onlyUuids)(ids);
107
114
  if (ids.length === 0)
108
115
  return { cancelled: 0, skipped: 0 };
109
116
  const client = await (0, client_1.escalations)();
@@ -126,6 +133,7 @@ async function bulkCancelEscalations(ids) {
126
133
  * `pending`; only the returned rows enter triage.
127
134
  */
128
135
  async function bulkResolveForTriage(ids, hint) {
136
+ ids = (0, uuid_1.onlyUuids)(ids);
129
137
  if (ids.length === 0)
130
138
  return [];
131
139
  const client = await (0, client_1.escalations)();
@@ -29,6 +29,7 @@ const db_1 = require("../../lib/db");
29
29
  const publish_1 = require("../../lib/events/publish");
30
30
  const escalation_wire_1 = require("../../lib/events/escalation-wire");
31
31
  const escalation_1 = require("../../types/escalation");
32
+ const uuid_1 = require("../../lib/uuid");
32
33
  const client_1 = require("./client");
33
34
  const queries_1 = require("./queries");
34
35
  const map_1 = require("./map");
@@ -95,6 +96,8 @@ async function createEscalation(input) {
95
96
  * user re-claims (extends expiry). Returns null when the row is not claimable.
96
97
  */
97
98
  async function claimEscalation(id, userId, durationMinutes = 30) {
99
+ if (!(0, uuid_1.isUuid)(id))
100
+ return null;
98
101
  const client = await (0, client_1.escalations)();
99
102
  const result = await client.claim({ id, assignee: userId, durationMinutes });
100
103
  if (!result.ok)
@@ -132,6 +135,8 @@ async function claimEscalation(id, userId, durationMinutes = 30) {
132
135
  * the stored `resolver_payload`.
133
136
  */
134
137
  async function resolveEscalation(id, resolverPayload, metadata, assertClaim, resolvedBy) {
138
+ if (!(0, uuid_1.isUuid)(id))
139
+ return null;
135
140
  const client = await (0, client_1.escalations)();
136
141
  // `assertClaim` rides the SDK's guarded UPDATE: no active claim lock may
137
142
  // stand against this assignee, or the resolve blocks (claim-expired /
@@ -169,6 +174,7 @@ async function resolveEscalation(id, resolverPayload, metadata, assertClaim, res
169
174
  * `resolveEscalation` (which delivers the signal).
170
175
  */
171
176
  async function resolveEscalationsByIds(ids, resolverPayload, metadata) {
177
+ ids = (0, uuid_1.onlyUuids)(ids);
172
178
  if (ids.length === 0)
173
179
  return [];
174
180
  const client = await (0, client_1.escalations)();
@@ -209,6 +215,12 @@ async function resolveEscalationsByIds(ids, resolverPayload, metadata) {
209
215
  async function resolveEscalationsAllOrNone(items, metadata, assertAssignee, resolvedBy) {
210
216
  if (items.length === 0)
211
217
  return { ok: true, escalations: [] };
218
+ // A malformed id blocks the batch exactly like a well-formed missing one —
219
+ // and never reaches the uuid cast.
220
+ const malformed = items.filter((i) => !(0, uuid_1.isUuid)(i.id));
221
+ if (malformed.length > 0) {
222
+ return { ok: false, failed: malformed.map((i) => ({ id: i.id, reason: 'not-found' })) };
223
+ }
212
224
  const client = await (0, client_1.escalations)();
213
225
  const result = await client.resolveAllOrNone({ items, metadata, assertAssignee, resolvedBy });
214
226
  if (!result.ok)
@@ -235,6 +247,7 @@ async function resolveEscalationsAllOrNone(items, metadata, assertAssignee, reso
235
247
  * fields — signal routing shape, `metadata.form_schema` for redaction.
236
248
  */
237
249
  async function getEscalationsByIds(ids) {
250
+ ids = (0, uuid_1.onlyUuids)(ids);
238
251
  if (ids.length === 0)
239
252
  return [];
240
253
  const client = await (0, client_1.escalations)();
@@ -278,6 +291,8 @@ async function resolveEscalationBySignalKey(signalKey, resolverPayload, metadata
278
291
  * already terminal.
279
292
  */
280
293
  async function cancelEscalation(id) {
294
+ if (!(0, uuid_1.isUuid)(id))
295
+ return null;
281
296
  const client = await (0, client_1.escalations)();
282
297
  const result = await client.cancel(id);
283
298
  if (!result.ok)
@@ -301,6 +316,7 @@ async function cancelEscalation(id) {
301
316
  * updated.
302
317
  */
303
318
  async function updateEscalationsPriority(ids, priority) {
319
+ ids = (0, uuid_1.onlyUuids)(ids);
304
320
  if (ids.length === 0)
305
321
  return 0;
306
322
  const client = await (0, client_1.escalations)();
@@ -311,6 +327,7 @@ async function updateEscalationsPriority(ids, priority) {
311
327
  * Used for permission validation before bulk operations.
312
328
  */
313
329
  async function getEscalationRoles(ids) {
330
+ ids = (0, uuid_1.onlyUuids)(ids);
314
331
  if (ids.length === 0)
315
332
  return [];
316
333
  const client = await (0, client_1.escalations)();
@@ -323,6 +340,7 @@ async function getEscalationRoles(ids) {
323
340
  * write_self by ownership (assigned_to = caller). One query, no N+1.
324
341
  */
325
342
  async function getEscalationScopeRows(ids) {
343
+ ids = (0, uuid_1.onlyUuids)(ids);
326
344
  if (ids.length === 0)
327
345
  return [];
328
346
  const client = await (0, client_1.escalations)();
@@ -344,6 +362,8 @@ async function getEscalationScopeRows(ids) {
344
362
  * stays loud.
345
363
  */
346
364
  async function releaseEscalation(id, userId, opts) {
365
+ if (!(0, uuid_1.isUuid)(id))
366
+ return null;
347
367
  const client = await (0, client_1.escalations)();
348
368
  const result = await client.release({ id, assignee: userId });
349
369
  if (!result.ok)
@@ -381,6 +401,8 @@ async function releaseExpiredClaims() {
381
401
  * Clears the current assignment so it becomes available to the new role.
382
402
  */
383
403
  async function escalateToRole(id, targetRole) {
404
+ if (!(0, uuid_1.isUuid)(id))
405
+ return null;
384
406
  const client = await (0, client_1.escalations)();
385
407
  // The departing role is read before the move: the returned entry already
386
408
  // carries the target role, and role-scoped subscribers of the OLD queue
@@ -414,6 +436,8 @@ async function escalateToRole(id, targetRole) {
414
436
  return escalation;
415
437
  }
416
438
  async function getEscalation(id) {
439
+ if (!(0, uuid_1.isUuid)(id))
440
+ return null;
417
441
  const client = await (0, client_1.escalations)();
418
442
  const entry = await client.get(id);
419
443
  return entry ? (0, map_1.toEscalationRecord)(entry) : null;
@@ -474,6 +498,8 @@ async function cancelEscalationsByWorkflowId(workflowId) {
474
498
  return rows.length;
475
499
  }
476
500
  async function enrichEscalationRouting(id, metadataPatch, workflowFields) {
501
+ if (!(0, uuid_1.isUuid)(id))
502
+ return null;
477
503
  const client = await (0, client_1.escalations)();
478
504
  const entry = await client.update({
479
505
  id,
@@ -54,6 +54,19 @@ export declare function listFacetKeys(opts: {
54
54
  selfRoles?: string[];
55
55
  meUserId?: string;
56
56
  }): Promise<string[]>;
57
+ /**
58
+ * Distinct VALUES for one metadata facet key, visible to the caller — feeds
59
+ * the value picker (e.g. facility → [north, south]) so a bound scope offers
60
+ * real choices. Role-scoped with the same predicate as {@link listFacetKeys};
61
+ * the key is parameterized (never interpolated) and charset-validated, so a
62
+ * malformed key returns [] rather than reaching an unguarded path.
63
+ */
64
+ export declare function listFacetValues(key: string, opts: {
65
+ global?: boolean;
66
+ visibleRoles?: string[];
67
+ selfRoles?: string[];
68
+ meUserId?: string;
69
+ }): Promise<string[]>;
57
70
  export declare function getEscalationStats(visibleRoles?: string[], period?: string): Promise<EscalationStats>;
58
71
  export declare function listDistinctTypes(): Promise<string[]>;
59
72
  export declare function listEscalations(filters: {
@@ -108,4 +121,4 @@ export declare function listAvailableEscalations(filters: {
108
121
  export declare function invalidateEscalationAggregates(): void;
109
122
  /** Test hook: drop cached period metrics AND escalation stats so tests observe fresh rows. */
110
123
  export declare function resetStationMetricsCache(): void;
111
- export declare function getStationMetrics(visibleRoles: string[] | undefined, period?: string): Promise<StationMetric[]>;
124
+ export declare function getStationMetrics(visibleRoles: string[] | undefined, period?: string, facets?: Record<string, unknown>): Promise<StationMetric[]>;