@hotmeshio/long-tail 0.10.14 → 0.11.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 (332) hide show
  1. package/build/api/escalations/analytics.d.ts +6 -0
  2. package/build/api/escalations/analytics.js +123 -0
  3. package/build/api/escalations/index.d.ts +1 -0
  4. package/build/api/escalations/index.js +4 -1
  5. package/build/api/roles.d.ts +4 -0
  6. package/build/api/roles.js +8 -0
  7. package/build/api/scan-codes/choice.d.ts +11 -0
  8. package/build/api/scan-codes/choice.js +136 -0
  9. package/build/api/scan-codes/context.d.ts +24 -0
  10. package/build/api/scan-codes/context.js +86 -0
  11. package/build/api/scan-codes/execute.d.ts +1 -0
  12. package/build/api/scan-codes/execute.js +49 -244
  13. package/build/api/scan-codes/identity.d.ts +18 -0
  14. package/build/api/scan-codes/identity.js +116 -0
  15. package/build/api/scan-codes/index.d.ts +2 -0
  16. package/build/api/scan-codes/index.js +6 -1
  17. package/build/api/scan-codes/locate.d.ts +14 -0
  18. package/build/api/scan-codes/locate.js +127 -0
  19. package/build/api/scan-codes/present.d.ts +9 -0
  20. package/build/api/scan-codes/present.js +59 -0
  21. package/build/api/scan-codes/verbs.d.ts +15 -0
  22. package/build/api/scan-codes/verbs.js +205 -0
  23. package/build/bin/ltc.js +33 -0
  24. package/build/lib/cli/commands/escalations.d.ts +31 -0
  25. package/build/lib/cli/commands/escalations.js +88 -0
  26. package/build/lib/db/schemas/028_role_entity_facet.sql +18 -0
  27. package/build/lib/db/schemas/029_scan_scheme_kind.sql +31 -0
  28. package/build/modules/config.d.ts +5 -0
  29. package/build/modules/config.js +12 -0
  30. package/build/routes/escalations/acting.d.ts +12 -0
  31. package/build/routes/escalations/acting.js +25 -0
  32. package/build/routes/escalations/analytics.d.ts +8 -0
  33. package/build/routes/escalations/analytics.js +63 -0
  34. package/build/routes/escalations/index.js +3 -0
  35. package/build/routes/escalations/resolve.js +8 -1
  36. package/build/routes/escalations/single.js +13 -4
  37. package/build/routes/roles.js +1 -1
  38. package/build/routes/scan-codes.js +28 -2
  39. package/build/scripts/ortho-populate.js +14 -0
  40. package/build/scripts/printer-cycle.d.ts +25 -0
  41. package/build/scripts/printer-cycle.js +169 -0
  42. package/build/scripts/twin-farm.js +19 -5
  43. package/build/sdk/index.d.ts +2 -0
  44. package/build/sdk/index.js +3 -0
  45. package/build/services/escalation/aggregate-sql.d.ts +36 -0
  46. package/build/services/escalation/aggregate-sql.js +253 -0
  47. package/build/services/escalation/aggregate-validate.d.ts +57 -0
  48. package/build/services/escalation/aggregate-validate.js +218 -0
  49. package/build/services/escalation/aggregates.d.ts +26 -0
  50. package/build/services/escalation/aggregates.js +204 -0
  51. package/build/services/escalation/client.js +57 -21
  52. package/build/services/escalation/facet-sql.js +17 -0
  53. package/build/services/escalation/index.d.ts +2 -0
  54. package/build/services/escalation/index.js +8 -1
  55. package/build/services/escalation/metrics-cache.d.ts +18 -0
  56. package/build/services/escalation/metrics-cache.js +47 -1
  57. package/build/services/escalation/queries.js +2 -0
  58. package/build/services/iam/acting-identity.d.ts +16 -0
  59. package/build/services/iam/acting-identity.js +60 -0
  60. package/build/services/role/index.js +2 -0
  61. package/build/services/role/sql.d.ts +10 -2
  62. package/build/services/role/sql.js +14 -1
  63. package/build/services/role/types.d.ts +16 -0
  64. package/build/services/scan-code/read.js +4 -0
  65. package/build/services/scan-code/sql.d.ts +4 -4
  66. package/build/services/scan-code/sql.js +14 -8
  67. package/build/services/scan-code/validate.d.ts +2 -0
  68. package/build/services/scan-code/validate.js +86 -0
  69. package/build/services/scan-code/write.d.ts +4 -0
  70. package/build/services/scan-code/write.js +16 -2
  71. package/build/services/user/crud.d.ts +6 -0
  72. package/build/services/user/crud.js +16 -0
  73. package/build/services/user/index.d.ts +1 -1
  74. package/build/services/user/index.js +2 -1
  75. package/build/services/user/sql.d.ts +8 -0
  76. package/build/services/user/sql.js +9 -1
  77. package/build/system/mcp-servers/admin/escalations.js +34 -0
  78. package/build/system/mcp-servers/admin/scan-codes.js +17 -1
  79. package/build/system/mcp-servers/admin/schemas.d.ts +643 -25
  80. package/build/system/mcp-servers/admin/schemas.js +127 -19
  81. package/build/system/mcp-servers/admin/users.js +3 -1
  82. package/build/system/mcp-servers/human-queue-schemas.d.ts +2 -2
  83. package/build/system/seed/tool-manifests-admin.d.ts +2283 -0
  84. package/build/system/seed/tool-manifests-admin.js +8 -5
  85. package/build/tsconfig.tsbuildinfo +1 -1
  86. package/build/types/analytics.d.ts +154 -0
  87. package/build/types/analytics.js +14 -0
  88. package/build/types/facets.d.ts +13 -0
  89. package/build/types/index.d.ts +5 -2
  90. package/build/types/index.js +5 -1
  91. package/build/types/scan-choice.d.ts +49 -0
  92. package/build/types/scan-choice.js +9 -0
  93. package/build/types/scan-code.d.ts +72 -1
  94. package/build/types/scan-code.js +30 -1
  95. package/dashboard/dist/assets/{AdminDashboard-Chg69wlx.js → AdminDashboard-DJ3LJQ09.js} +2 -2
  96. package/dashboard/dist/assets/{AdminDashboard-Chg69wlx.js.map → AdminDashboard-DJ3LJQ09.js.map} +1 -1
  97. package/dashboard/dist/assets/{AgentConfigPage-DRTFwbfC.js → AgentConfigPage-BMMvaD0z.js} +2 -2
  98. package/dashboard/dist/assets/{AgentConfigPage-DRTFwbfC.js.map → AgentConfigPage-BMMvaD0z.js.map} +1 -1
  99. package/dashboard/dist/assets/{AgentDetailPage-JKByfFIi.js → AgentDetailPage-C6wfsnRe.js} +3 -3
  100. package/dashboard/dist/assets/{AgentDetailPage-JKByfFIi.js.map → AgentDetailPage-C6wfsnRe.js.map} +1 -1
  101. package/dashboard/dist/assets/{AgentsPage-BlgEmKhA.js → AgentsPage-Cwqka7nE.js} +2 -2
  102. package/dashboard/dist/assets/{AgentsPage-BlgEmKhA.js.map → AgentsPage-Cwqka7nE.js.map} +1 -1
  103. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js +2 -0
  104. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js.map +1 -0
  105. package/dashboard/dist/assets/{BotPicker-CCVcz4Cq.js → BotPicker-BBkJBXZB.js} +2 -2
  106. package/dashboard/dist/assets/{BotPicker-CCVcz4Cq.js.map → BotPicker-BBkJBXZB.js.map} +1 -1
  107. package/dashboard/dist/assets/{CapabilitiesPage-Czi9jUwD.js → CapabilitiesPage-wxmE4917.js} +2 -2
  108. package/dashboard/dist/assets/{CapabilitiesPage-Czi9jUwD.js.map → CapabilitiesPage-wxmE4917.js.map} +1 -1
  109. package/dashboard/dist/assets/{CollapsibleSection-8YE965QX.js → CollapsibleSection-B3FsrHwH.js} +2 -2
  110. package/dashboard/dist/assets/{CollapsibleSection-8YE965QX.js.map → CollapsibleSection-B3FsrHwH.js.map} +1 -1
  111. package/dashboard/dist/assets/{CountdownTimer-Bxvq3D7j.js → CountdownTimer-B3nCqJdC.js} +2 -2
  112. package/dashboard/dist/assets/{CountdownTimer-Bxvq3D7j.js.map → CountdownTimer-B3nCqJdC.js.map} +1 -1
  113. package/dashboard/dist/assets/{CredentialsPage-Bn7_SX6-.js → CredentialsPage-Bv875IHe.js} +2 -2
  114. package/dashboard/dist/assets/{CredentialsPage-Bn7_SX6-.js.map → CredentialsPage-Bv875IHe.js.map} +1 -1
  115. package/dashboard/dist/assets/{CronLabel-Bn4mX_Yn.js → CronLabel-CSzjWuwj.js} +2 -2
  116. package/dashboard/dist/assets/{CronLabel-Bn4mX_Yn.js.map → CronLabel-CSzjWuwj.js.map} +1 -1
  117. package/dashboard/dist/assets/{CustomDurationPicker-pMcrFyW6.js → CustomDurationPicker-CCpqf3e4.js} +2 -2
  118. package/dashboard/dist/assets/{CustomDurationPicker-pMcrFyW6.js.map → CustomDurationPicker-CCpqf3e4.js.map} +1 -1
  119. package/dashboard/dist/assets/{DropZone-zCEGjjk-.js → DropZone-CJkk-U3o.js} +2 -2
  120. package/dashboard/dist/assets/{DropZone-zCEGjjk-.js.map → DropZone-CJkk-U3o.js.map} +1 -1
  121. package/dashboard/dist/assets/{ElapsedCell-BGO7IXEg.js → ElapsedCell-WV6pUaKo.js} +2 -2
  122. package/dashboard/dist/assets/{ElapsedCell-BGO7IXEg.js.map → ElapsedCell-WV6pUaKo.js.map} +1 -1
  123. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js +2 -0
  124. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js.map +1 -0
  125. package/dashboard/dist/assets/{EscalationListSchemaPage-CFDxbd50.js → EscalationListSchemaPage-CTQCALw4.js} +3 -3
  126. package/dashboard/dist/assets/{EscalationListSchemaPage-CFDxbd50.js.map → EscalationListSchemaPage-CTQCALw4.js.map} +1 -1
  127. package/dashboard/dist/assets/{EscalationSchemaPage-DnXPnDkz.js → EscalationSchemaPage-D_UgP0pv.js} +3 -3
  128. package/dashboard/dist/assets/{EscalationSchemaPage-DnXPnDkz.js.map → EscalationSchemaPage-D_UgP0pv.js.map} +1 -1
  129. package/dashboard/dist/assets/{EscalationsOverview-BZMVXrkK.js → EscalationsOverview-DuIUyxr0.js} +2 -2
  130. package/dashboard/dist/assets/{EscalationsOverview-BZMVXrkK.js.map → EscalationsOverview-DuIUyxr0.js.map} +1 -1
  131. package/dashboard/dist/assets/{EventTable-Bfi-f8as.js → EventTable-BV6unphX.js} +2 -2
  132. package/dashboard/dist/assets/{EventTable-Bfi-f8as.js.map → EventTable-BV6unphX.js.map} +1 -1
  133. package/dashboard/dist/assets/FilterBar-DYFgzXNB.js +2 -0
  134. package/dashboard/dist/assets/{FilterBar-Do7yR4xM.js.map → FilterBar-DYFgzXNB.js.map} +1 -1
  135. package/dashboard/dist/assets/{GraphInvokePage-d1ie4T7f.js → GraphInvokePage-BGHVUipJ.js} +2 -2
  136. package/dashboard/dist/assets/{GraphInvokePage-d1ie4T7f.js.map → GraphInvokePage-BGHVUipJ.js.map} +1 -1
  137. package/dashboard/dist/assets/HomePage-B-S2cK3E.js +2 -0
  138. package/dashboard/dist/assets/{HomePage-BEeodImU.js.map → HomePage-B-S2cK3E.js.map} +1 -1
  139. package/dashboard/dist/assets/ListToolbar-Bl7F3A28.js +2 -0
  140. package/dashboard/dist/assets/{ListToolbar-CLtw-1QN.js.map → ListToolbar-Bl7F3A28.js.map} +1 -1
  141. package/dashboard/dist/assets/{McpOverview-DIsy9TB3.js → McpOverview-_T9IsCD_.js} +2 -2
  142. package/dashboard/dist/assets/{McpOverview-DIsy9TB3.js.map → McpOverview-_T9IsCD_.js.map} +1 -1
  143. package/dashboard/dist/assets/{McpQueryDetailPage-6PomdsyD.js → McpQueryDetailPage-DtsVqKPw.js} +2 -2
  144. package/dashboard/dist/assets/{McpQueryDetailPage-6PomdsyD.js.map → McpQueryDetailPage-DtsVqKPw.js.map} +1 -1
  145. package/dashboard/dist/assets/{McpQueryPage-YMdQCXm9.js → McpQueryPage-DX5u-1bx.js} +2 -2
  146. package/dashboard/dist/assets/{McpQueryPage-YMdQCXm9.js.map → McpQueryPage-DX5u-1bx.js.map} +1 -1
  147. package/dashboard/dist/assets/{McpRunDetailPage-DsD1Gm2o.js → McpRunDetailPage-BhcqqtYS.js} +2 -2
  148. package/dashboard/dist/assets/{McpRunDetailPage-DsD1Gm2o.js.map → McpRunDetailPage-BhcqqtYS.js.map} +1 -1
  149. package/dashboard/dist/assets/{McpRunsPage--a5Jgb33.js → McpRunsPage-L-1y8wnX.js} +2 -2
  150. package/dashboard/dist/assets/{McpRunsPage--a5Jgb33.js.map → McpRunsPage-L-1y8wnX.js.map} +1 -1
  151. package/dashboard/dist/assets/{NamespacePill-wV6L4VW1.js → NamespacePill-in1SLd0W.js} +2 -2
  152. package/dashboard/dist/assets/{NamespacePill-wV6L4VW1.js.map → NamespacePill-in1SLd0W.js.map} +1 -1
  153. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js +3 -0
  154. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js.map +1 -0
  155. package/dashboard/dist/assets/OperatorDashboard-CIbDzOlh.js +2 -0
  156. package/dashboard/dist/assets/{OperatorDashboard-CkLfbxEh.js.map → OperatorDashboard-CIbDzOlh.js.map} +1 -1
  157. package/dashboard/dist/assets/{PageHeader-BtIr6r-8.js → PageHeader-BJgWMZtw.js} +2 -2
  158. package/dashboard/dist/assets/{PageHeader-BtIr6r-8.js.map → PageHeader-BJgWMZtw.js.map} +1 -1
  159. package/dashboard/dist/assets/{PageHeaderWithStats-C2sGqFQG.js → PageHeaderWithStats-Ccio4vyG.js} +2 -2
  160. package/dashboard/dist/assets/{PageHeaderWithStats-C2sGqFQG.js.map → PageHeaderWithStats-Ccio4vyG.js.map} +1 -1
  161. package/dashboard/dist/assets/{PersonaDetailPage-CCmOgKQb.js → PersonaDetailPage-BOaf0TW1.js} +2 -2
  162. package/dashboard/dist/assets/{PersonaDetailPage-CCmOgKQb.js.map → PersonaDetailPage-BOaf0TW1.js.map} +1 -1
  163. package/dashboard/dist/assets/{PersonasPage-BJkSuDTN.js → PersonasPage-DSdRb90f.js} +2 -2
  164. package/dashboard/dist/assets/{PersonasPage-BJkSuDTN.js.map → PersonasPage-DSdRb90f.js.map} +1 -1
  165. package/dashboard/dist/assets/{ProcessDetailPage-DT9BlJXK.js → ProcessDetailPage-DN9NqfeP.js} +2 -2
  166. package/dashboard/dist/assets/{ProcessDetailPage-DT9BlJXK.js.map → ProcessDetailPage-DN9NqfeP.js.map} +1 -1
  167. package/dashboard/dist/assets/{ProcessesListPage-DgSGzTDT.js → ProcessesListPage-CfQEWaD4.js} +2 -2
  168. package/dashboard/dist/assets/{ProcessesListPage-DgSGzTDT.js.map → ProcessesListPage-CfQEWaD4.js.map} +1 -1
  169. package/dashboard/dist/assets/RoleDetailPage-BC5HL7ls.js +8 -0
  170. package/dashboard/dist/assets/RoleDetailPage-BC5HL7ls.js.map +1 -0
  171. package/dashboard/dist/assets/{RolePill-BBYjhAPj.js → RolePill-BNAP-uK6.js} +2 -2
  172. package/dashboard/dist/assets/{RolePill-BBYjhAPj.js.map → RolePill-BNAP-uK6.js.map} +1 -1
  173. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js +2 -0
  174. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js.map +1 -0
  175. package/dashboard/dist/assets/{RunAsSelector-CateuvcC.js → RunAsSelector-twbuX7fB.js} +2 -2
  176. package/dashboard/dist/assets/{RunAsSelector-CateuvcC.js.map → RunAsSelector-twbuX7fB.js.map} +1 -1
  177. package/dashboard/dist/assets/ScanCodesPage-CPNg6K--.js +2 -0
  178. package/dashboard/dist/assets/ScanCodesPage-CPNg6K--.js.map +1 -0
  179. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js +2 -0
  180. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js.map +1 -0
  181. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js +2 -0
  182. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js.map +1 -0
  183. package/dashboard/dist/assets/{ScopeBadge-xs2Nhjy4.js → ScopeBadge-BG7KkZ8Q.js} +2 -2
  184. package/dashboard/dist/assets/{ScopeBadge-xs2Nhjy4.js.map → ScopeBadge-BG7KkZ8Q.js.map} +1 -1
  185. package/dashboard/dist/assets/{StickyPagination-Cg-QdYWL.js → StickyPagination-DIeYMPPd.js} +2 -2
  186. package/dashboard/dist/assets/{StickyPagination-Cg-QdYWL.js.map → StickyPagination-DIeYMPPd.js.map} +1 -1
  187. package/dashboard/dist/assets/{StreamMessageDetail-DEeuh4_-.js → StreamMessageDetail-gU4CUeQI.js} +2 -2
  188. package/dashboard/dist/assets/{StreamMessageDetail-DEeuh4_-.js.map → StreamMessageDetail-gU4CUeQI.js.map} +1 -1
  189. package/dashboard/dist/assets/{SwimlaneTimeline-DMY0jL2F.js → SwimlaneTimeline-Br-nBA4l.js} +2 -2
  190. package/dashboard/dist/assets/{SwimlaneTimeline-DMY0jL2F.js.map → SwimlaneTimeline-Br-nBA4l.js.map} +1 -1
  191. package/dashboard/dist/assets/{TagInput-BMmiV-MD.js → TagInput-CvM5n6ww.js} +2 -2
  192. package/dashboard/dist/assets/{TagInput-BMmiV-MD.js.map → TagInput-CvM5n6ww.js.map} +1 -1
  193. package/dashboard/dist/assets/{TaskDetailPage-CPbkIvfF.js → TaskDetailPage-_9cr_R0u.js} +2 -2
  194. package/dashboard/dist/assets/{TaskDetailPage-CPbkIvfF.js.map → TaskDetailPage-_9cr_R0u.js.map} +1 -1
  195. package/dashboard/dist/assets/{TaskQueuePill-DLgYaw1x.js → TaskQueuePill-D4JPHXOq.js} +2 -2
  196. package/dashboard/dist/assets/{TaskQueuePill-DLgYaw1x.js.map → TaskQueuePill-D4JPHXOq.js.map} +1 -1
  197. package/dashboard/dist/assets/{TasksListPage-CtHudKhQ.js → TasksListPage-DVENC9Jp.js} +2 -2
  198. package/dashboard/dist/assets/{TasksListPage-CtHudKhQ.js.map → TasksListPage-DVENC9Jp.js.map} +1 -1
  199. package/dashboard/dist/assets/{TimeAgo-BdHOizWg.js → TimeAgo-C9yYnOui.js} +2 -2
  200. package/dashboard/dist/assets/{TimeAgo-BdHOizWg.js.map → TimeAgo-C9yYnOui.js.map} +1 -1
  201. package/dashboard/dist/assets/{TimestampCell-FVukzKRe.js → TimestampCell-DoB8cYgw.js} +2 -2
  202. package/dashboard/dist/assets/{TimestampCell-FVukzKRe.js.map → TimestampCell-DoB8cYgw.js.map} +1 -1
  203. package/dashboard/dist/assets/{ToolPill-BvS53hxP.js → ToolPill-BUjbC-Tj.js} +2 -2
  204. package/dashboard/dist/assets/{ToolPill-BvS53hxP.js.map → ToolPill-BUjbC-Tj.js.map} +1 -1
  205. package/dashboard/dist/assets/{ToolTestPanel-HN0OCYTL.js → ToolTestPanel-CBtsIP8K.js} +2 -2
  206. package/dashboard/dist/assets/{ToolTestPanel-HN0OCYTL.js.map → ToolTestPanel-CBtsIP8K.js.map} +1 -1
  207. package/dashboard/dist/assets/{TopicDetailPage-DHdSpN61.js → TopicDetailPage-mR4Jaz83.js} +2 -2
  208. package/dashboard/dist/assets/{TopicDetailPage-DHdSpN61.js.map → TopicDetailPage-mR4Jaz83.js.map} +1 -1
  209. package/dashboard/dist/assets/TopicsPage-CP7HFxIC.js +2 -0
  210. package/dashboard/dist/assets/{TopicsPage-Clr6Tl5P.js.map → TopicsPage-CP7HFxIC.js.map} +1 -1
  211. package/dashboard/dist/assets/{UserName-BUVYyIAS.js → UserName-BnLF6yhz.js} +2 -2
  212. package/dashboard/dist/assets/{UserName-BUVYyIAS.js.map → UserName-BnLF6yhz.js.map} +1 -1
  213. package/dashboard/dist/assets/{WorkflowExecutionPage-kncWFfe5.js → WorkflowExecutionPage-xL956RZi.js} +2 -2
  214. package/dashboard/dist/assets/{WorkflowExecutionPage-kncWFfe5.js.map → WorkflowExecutionPage-xL956RZi.js.map} +1 -1
  215. package/dashboard/dist/assets/{WorkflowPill-BPC_Dc_I.js → WorkflowPill-tXU0-eXu.js} +2 -2
  216. package/dashboard/dist/assets/{WorkflowPill-BPC_Dc_I.js.map → WorkflowPill-tXU0-eXu.js.map} +1 -1
  217. package/dashboard/dist/assets/{WorkflowsDashboard-4ypPDGKx.js → WorkflowsDashboard-B-u7zFKM.js} +2 -2
  218. package/dashboard/dist/assets/{WorkflowsDashboard-4ypPDGKx.js.map → WorkflowsDashboard-B-u7zFKM.js.map} +1 -1
  219. package/dashboard/dist/assets/{WorkflowsOverview-CeQlZkkd.js → WorkflowsOverview-CqZVarK-.js} +2 -2
  220. package/dashboard/dist/assets/{WorkflowsOverview-CeQlZkkd.js.map → WorkflowsOverview-CqZVarK-.js.map} +1 -1
  221. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DLAlEzwT.js → YamlWorkflowDetailPage-DiFLavW0.js} +2 -2
  222. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DLAlEzwT.js.map → YamlWorkflowDetailPage-DiFLavW0.js.map} +1 -1
  223. package/dashboard/dist/assets/{YamlWorkflowsPage-DQhenKFT.js → YamlWorkflowsPage-BuQM6uZA.js} +2 -2
  224. package/dashboard/dist/assets/{YamlWorkflowsPage-DQhenKFT.js.map → YamlWorkflowsPage-BuQM6uZA.js.map} +1 -1
  225. package/dashboard/dist/assets/{agents-s3feet3W.js → agents-DU9GPovp.js} +2 -2
  226. package/dashboard/dist/assets/{agents-s3feet3W.js.map → agents-DU9GPovp.js.map} +1 -1
  227. package/dashboard/dist/assets/{bots-CkSd2rn9.js → bots-Cy-Hmg7w.js} +2 -2
  228. package/dashboard/dist/assets/{bots-CkSd2rn9.js.map → bots-Cy-Hmg7w.js.map} +1 -1
  229. package/dashboard/dist/assets/{capabilities-DA_r09tM.js → capabilities-sSJJqrp-.js} +2 -2
  230. package/dashboard/dist/assets/{capabilities-DA_r09tM.js.map → capabilities-sSJJqrp-.js.map} +1 -1
  231. package/dashboard/dist/assets/{controlplane-C9c25q21.js → controlplane-TVCjDHQ-.js} +2 -2
  232. package/dashboard/dist/assets/{controlplane-C9c25q21.js.map → controlplane-TVCjDHQ-.js.map} +1 -1
  233. package/dashboard/dist/assets/escalation-columns-BpkjKYGd.js +2 -0
  234. package/dashboard/dist/assets/escalation-columns-BpkjKYGd.js.map +1 -0
  235. package/dashboard/dist/assets/index-5TblaCXQ.css +1 -0
  236. package/dashboard/dist/assets/{index-WxE3ONia.js → index-7BP6FaCZ.js} +2 -2
  237. package/dashboard/dist/assets/{index-WxE3ONia.js.map → index-7BP6FaCZ.js.map} +1 -1
  238. package/dashboard/dist/assets/{index-C7ABSOU2.js → index-B7IaBPBg.js} +4 -4
  239. package/dashboard/dist/assets/{index-C7ABSOU2.js.map → index-B7IaBPBg.js.map} +1 -1
  240. package/dashboard/dist/assets/{index-BU5FFAJo.js → index-BE0phFw0.js} +2 -2
  241. package/dashboard/dist/assets/{index-BU5FFAJo.js.map → index-BE0phFw0.js.map} +1 -1
  242. package/dashboard/dist/assets/{index-C-MmR-jf.js → index-BYNN9N1T.js} +2 -2
  243. package/dashboard/dist/assets/{index-C-MmR-jf.js.map → index-BYNN9N1T.js.map} +1 -1
  244. package/dashboard/dist/assets/{index-S13oPvuS.js → index-CLPVqbVY.js} +2 -2
  245. package/dashboard/dist/assets/{index-S13oPvuS.js.map → index-CLPVqbVY.js.map} +1 -1
  246. package/dashboard/dist/assets/{index-Cw9poaez.js → index-Cfv86_L9.js} +2 -2
  247. package/dashboard/dist/assets/{index-Cw9poaez.js.map → index-Cfv86_L9.js.map} +1 -1
  248. package/dashboard/dist/assets/{index-Bo5TtX9l.js → index-CtwbQ_-m.js} +2 -2
  249. package/dashboard/dist/assets/{index-Bo5TtX9l.js.map → index-CtwbQ_-m.js.map} +1 -1
  250. package/dashboard/dist/assets/index-DOai950R.js +3 -0
  251. package/dashboard/dist/assets/index-DOai950R.js.map +1 -0
  252. package/dashboard/dist/assets/{index-Cmxzk4ay.js → index-DTtHNC-D.js} +2 -2
  253. package/dashboard/dist/assets/{index-Cmxzk4ay.js.map → index-DTtHNC-D.js.map} +1 -1
  254. package/dashboard/dist/assets/{index--7Vdkzwd.js → index-DsWnVyVN.js} +2 -2
  255. package/dashboard/dist/assets/{index--7Vdkzwd.js.map → index-DsWnVyVN.js.map} +1 -1
  256. package/dashboard/dist/assets/{index-DvoMXQqO.js → index-Dy-MMYti.js} +2 -2
  257. package/dashboard/dist/assets/{index-DvoMXQqO.js.map → index-Dy-MMYti.js.map} +1 -1
  258. package/dashboard/dist/assets/index-errgQT5x.js +65 -0
  259. package/dashboard/dist/assets/index-errgQT5x.js.map +1 -0
  260. package/dashboard/dist/assets/{index-BIcYbDVf.js → index-fgBDhnI6.js} +2 -2
  261. package/dashboard/dist/assets/{index-BIcYbDVf.js.map → index-fgBDhnI6.js.map} +1 -1
  262. package/dashboard/dist/assets/{knowledge-Bpln0zy_.js → knowledge-arh4NfmL.js} +2 -2
  263. package/dashboard/dist/assets/{knowledge-Bpln0zy_.js.map → knowledge-arh4NfmL.js.map} +1 -1
  264. package/dashboard/dist/assets/{mcp-BqDq3RZH.js → mcp-QGf5jHCo.js} +2 -2
  265. package/dashboard/dist/assets/{mcp-BqDq3RZH.js.map → mcp-QGf5jHCo.js.map} +1 -1
  266. package/dashboard/dist/assets/{mcp-query-DGue75R6.js → mcp-query-BEJN1nMZ.js} +2 -2
  267. package/dashboard/dist/assets/{mcp-query-DGue75R6.js.map → mcp-query-BEJN1nMZ.js.map} +1 -1
  268. package/dashboard/dist/assets/{personas-B8z_sTiJ.js → personas-DYtw1COf.js} +2 -2
  269. package/dashboard/dist/assets/{personas-B8z_sTiJ.js.map → personas-DYtw1COf.js.map} +1 -1
  270. package/dashboard/dist/assets/{pipelines-DYgNd9nB.js → pipelines-Byi6PnbE.js} +2 -2
  271. package/dashboard/dist/assets/{pipelines-DYgNd9nB.js.map → pipelines-Byi6PnbE.js.map} +1 -1
  272. package/dashboard/dist/assets/{tasks-CJdjjhgO.js → tasks-D0SQdENz.js} +2 -2
  273. package/dashboard/dist/assets/{tasks-CJdjjhgO.js.map → tasks-D0SQdENz.js.map} +1 -1
  274. package/dashboard/dist/assets/{topics-DPrL8Dtq.js → topics-DgDv5ZXP.js} +2 -2
  275. package/dashboard/dist/assets/{topics-DPrL8Dtq.js.map → topics-DgDv5ZXP.js.map} +1 -1
  276. package/dashboard/dist/assets/useEventHooks-DZaYzE7s.js +2 -0
  277. package/dashboard/dist/assets/{useEventHooks-DXCgDgiu.js.map → useEventHooks-DZaYzE7s.js.map} +1 -1
  278. package/dashboard/dist/assets/{useNamespace-DnFZfy7N.js → useNamespace-C1OqiNXN.js} +2 -2
  279. package/dashboard/dist/assets/{useNamespace-DnFZfy7N.js.map → useNamespace-C1OqiNXN.js.map} +1 -1
  280. package/dashboard/dist/assets/{useYamlActivityEvents-kx5CLENv.js → useYamlActivityEvents-CkmXDm-Z.js} +2 -2
  281. package/dashboard/dist/assets/{useYamlActivityEvents-kx5CLENv.js.map → useYamlActivityEvents-CkmXDm-Z.js.map} +1 -1
  282. package/dashboard/dist/assets/{users-DKng7vAG.js → users-D4DCFPH1.js} +2 -2
  283. package/dashboard/dist/assets/{users-DKng7vAG.js.map → users-D4DCFPH1.js.map} +1 -1
  284. package/dashboard/dist/assets/{vendor-icons-CN-bAo9U.js → vendor-icons-BxuyFxH2.js} +152 -137
  285. package/dashboard/dist/assets/vendor-icons-BxuyFxH2.js.map +1 -0
  286. package/dashboard/dist/assets/{workflows-C4V0rMkM.js → workflows-qyc0ku_5.js} +2 -2
  287. package/dashboard/dist/assets/{workflows-C4V0rMkM.js.map → workflows-qyc0ku_5.js.map} +1 -1
  288. package/dashboard/dist/assets/{yaml-workflows-D3PAiJ9d.js → yaml-workflows-DWFww9Xn.js} +2 -2
  289. package/dashboard/dist/assets/{yaml-workflows-D3PAiJ9d.js.map → yaml-workflows-DWFww9Xn.js.map} +1 -1
  290. package/dashboard/dist/index.html +3 -3
  291. package/docs/api/http/escalations.md +133 -0
  292. package/docs/api/http/roles.md +6 -0
  293. package/docs/api/mcp/admin.md +53 -0
  294. package/docs/api/sdk/escalations.md +58 -0
  295. package/docs/cli.md +11 -0
  296. package/docs/dashboard.md +22 -20
  297. package/docs/data.md +12 -4
  298. package/docs/escalation-analytics.md +251 -0
  299. package/docs/hitl/roles.md +1 -1
  300. package/docs/hitl/x-lt-footer.md +1 -2
  301. package/docs/hitl-guide.md +3 -3
  302. package/docs/iam.md +12 -0
  303. package/docs/operations.md +17 -0
  304. package/docs/scan-codes.md +112 -0
  305. package/docs/sdk.md +1 -1
  306. package/package.json +2 -1
  307. package/dashboard/dist/assets/AvailableEscalationsPage-C_7y692Q.js +0 -2
  308. package/dashboard/dist/assets/AvailableEscalationsPage-C_7y692Q.js.map +0 -1
  309. package/dashboard/dist/assets/FilterBar-Do7yR4xM.js +0 -2
  310. package/dashboard/dist/assets/HomePage-BEeodImU.js +0 -2
  311. package/dashboard/dist/assets/ListToolbar-CLtw-1QN.js +0 -2
  312. package/dashboard/dist/assets/OperationsPage-B2v9k3DT.js +0 -2
  313. package/dashboard/dist/assets/OperationsPage-B2v9k3DT.js.map +0 -1
  314. package/dashboard/dist/assets/OperatorDashboard-CkLfbxEh.js +0 -2
  315. package/dashboard/dist/assets/RoleDetailPage-DMphTvro.js +0 -8
  316. package/dashboard/dist/assets/RoleDetailPage-DMphTvro.js.map +0 -1
  317. package/dashboard/dist/assets/RolesPage-gi_kaot1.js +0 -2
  318. package/dashboard/dist/assets/RolesPage-gi_kaot1.js.map +0 -1
  319. package/dashboard/dist/assets/ScanCodesPage-CQ8RxMug.js +0 -2
  320. package/dashboard/dist/assets/ScanCodesPage-CQ8RxMug.js.map +0 -1
  321. package/dashboard/dist/assets/ScanSchemeDetailPage-puSbuxcV.js +0 -2
  322. package/dashboard/dist/assets/ScanSchemeDetailPage-puSbuxcV.js.map +0 -1
  323. package/dashboard/dist/assets/TopicsPage-Clr6Tl5P.js +0 -2
  324. package/dashboard/dist/assets/escalation-columns-Cp3UrT48.js +0 -2
  325. package/dashboard/dist/assets/escalation-columns-Cp3UrT48.js.map +0 -1
  326. package/dashboard/dist/assets/index--DG-qQBT.js +0 -65
  327. package/dashboard/dist/assets/index--DG-qQBT.js.map +0 -1
  328. package/dashboard/dist/assets/index-DEbY57_c.js +0 -3
  329. package/dashboard/dist/assets/index-DEbY57_c.js.map +0 -1
  330. package/dashboard/dist/assets/index-DnV6LSeY.css +0 -1
  331. package/dashboard/dist/assets/useEventHooks-DXCgDgiu.js +0 -2
  332. package/dashboard/dist/assets/vendor-icons-CN-bAo9U.js.map +0 -1
@@ -0,0 +1,6 @@
1
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
2
+ import type { AggregateByFacetsInput, TimelineByFacetInput } from '../../types';
3
+ /** Grouped membership/dwell aggregate over the escalation intervals. */
4
+ export declare function aggregateByFacets(input: AggregateByFacetsInput, auth: LTApiAuth): Promise<LTApiResult>;
5
+ /** One entity's ordered interval sequence (gap-preserving). */
6
+ export declare function timelineByFacet(input: TimelineByFacetInput, auth: LTApiAuth): Promise<LTApiResult>;
@@ -0,0 +1,123 @@
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.aggregateByFacets = aggregateByFacets;
37
+ exports.timelineByFacet = timelineByFacet;
38
+ const escalationService = __importStar(require("../../services/escalation"));
39
+ const escalation_1 = require("../../services/escalation");
40
+ const userService = __importStar(require("../../services/user"));
41
+ const features_1 = require("../../modules/features");
42
+ // ── Escalation analytics surface (public) ────────────────────────────────────
43
+ //
44
+ // Grouped/temporal reads over the pond (membership, dwell, timeline). Reads
45
+ // only, but reads that AGGREGATE other operators' items — so the gate is the
46
+ // same broad scope the faceted search uses (read_all per requested role), with
47
+ // one extension: these queries may span roles. A caller must hold read_all on
48
+ // EVERY role in the filter; a filter with no role scope is inherently
49
+ // cross-role and requires a global principal (superadmin / admin). Results are
50
+ // principal-independent once the gate passes, which is what makes the
51
+ // service-layer cache shareable.
52
+ //
53
+ // publicPaceBoard carve-out (mirrors GET /station-metrics, list.ts): with the
54
+ // flag on, any authenticated caller may run aggregates whose group keys are
55
+ // COLUMNS only — those emit counts/seconds, the exact data class the Pace
56
+ // Board already exposes to every login. A groupBy.facets grouping emits facet
57
+ // VALUES (entity ids) as group keys and always takes the strict gate, as does
58
+ // timelineByFacet (an entity's movement history is item-level disclosure).
59
+ async function callerMayReadPonds(userId, roles) {
60
+ if (await userService.hasGlobalEscalationAccess(userId))
61
+ return true;
62
+ if (!roles.length)
63
+ return false; // whole-pond / cross-role ⇒ global only
64
+ for (const role of roles) {
65
+ const scope = await userService.getRoleScope(userId, role);
66
+ if (scope?.read !== 'all')
67
+ return false;
68
+ }
69
+ return true;
70
+ }
71
+ async function effectiveRoles(query) {
72
+ // `entity` scopes to its derived system — the gate covers the same roles the
73
+ // query will actually touch. Resolution throws AnalyticsInputError (→ 400)
74
+ // for unknown keys, before any scope decision.
75
+ if (query?.entity) {
76
+ return (await escalationService.resolveEntitySystem(query.entity)).map((s) => s.role);
77
+ }
78
+ if (query?.role)
79
+ return [query.role];
80
+ if (query?.roles?.length)
81
+ return query.roles;
82
+ return [];
83
+ }
84
+ function deniedMessage(roles) {
85
+ return roles.length
86
+ ? `You must hold ${roles.map((r) => `"${r}"`).join(', ')} with full (read_all) scope or be a superadmin`
87
+ : 'Analytics without a role filter spans every pond — a global (superadmin/admin) principal is required';
88
+ }
89
+ function failure(err) {
90
+ if (err instanceof escalation_1.AnalyticsInputError)
91
+ return { status: 400, error: err.message };
92
+ return { status: 500, error: err.message };
93
+ }
94
+ /** Grouped membership/dwell aggregate over the escalation intervals. */
95
+ async function aggregateByFacets(input, auth) {
96
+ try {
97
+ const roles = await effectiveRoles(input?.query);
98
+ const countsOnly = !input?.groupBy?.facets?.length;
99
+ const publiclyReadable = countsOnly && (0, features_1.getFeatureFlags)().publicPaceBoard;
100
+ if (!publiclyReadable && !(await callerMayReadPonds(auth.userId, roles))) {
101
+ return { status: 403, error: deniedMessage(roles) };
102
+ }
103
+ const data = await escalationService.aggregateByFacets(input);
104
+ return { status: 200, data };
105
+ }
106
+ catch (err) {
107
+ return failure(err);
108
+ }
109
+ }
110
+ /** One entity's ordered interval sequence (gap-preserving). */
111
+ async function timelineByFacet(input, auth) {
112
+ try {
113
+ const roles = await effectiveRoles(input?.query);
114
+ if (!(await callerMayReadPonds(auth.userId, roles))) {
115
+ return { status: 403, error: deniedMessage(roles) };
116
+ }
117
+ const data = await escalationService.timelineByFacet(input);
118
+ return { status: 200, data };
119
+ }
120
+ catch (err) {
121
+ return failure(err);
122
+ }
123
+ }
@@ -7,3 +7,4 @@ export { resolveEscalation, resolveBySignalKey, resolveByIds, resolveAllOrNone }
7
7
  export { findByMetadata, claimByMetadata, resolveByMetadata } from './metadata';
8
8
  export { cancelSingleEscalation, bulkCancel } from './cancel';
9
9
  export { searchByFacets, claimGroups, claimByFacets } from './facets';
10
+ export { aggregateByFacets, timelineByFacet } from './analytics';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.claimByFacets = exports.claimGroups = exports.searchByFacets = exports.bulkCancel = exports.cancelSingleEscalation = exports.resolveByMetadata = exports.claimByMetadata = exports.findByMetadata = exports.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = 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.resolveAllOrNone = exports.resolveByIds = exports.resolveBySignalKey = exports.resolveEscalation = exports.bulkTriage = exports.bulkEscalate = exports.bulkAssign = exports.bulkClaim = exports.updatePriority = exports.releaseExpiredClaims = exports.releaseEscalation = exports.claimEscalation = exports.escalateToRole = exports.getEscalationsByWorkflowId = exports.getEscalation = exports.getStationMetrics = exports.getEscalationStats = 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");
@@ -40,3 +40,6 @@ var facets_1 = require("./facets");
40
40
  Object.defineProperty(exports, "searchByFacets", { enumerable: true, get: function () { return facets_1.searchByFacets; } });
41
41
  Object.defineProperty(exports, "claimGroups", { enumerable: true, get: function () { return facets_1.claimGroups; } });
42
42
  Object.defineProperty(exports, "claimByFacets", { enumerable: true, get: function () { return facets_1.claimByFacets; } });
43
+ var analytics_1 = require("./analytics");
44
+ Object.defineProperty(exports, "aggregateByFacets", { enumerable: true, get: function () { return analytics_1.aggregateByFacets; } });
45
+ Object.defineProperty(exports, "timelineByFacet", { enumerable: true, get: function () { return analytics_1.timelineByFacet; } });
@@ -106,6 +106,10 @@ export declare function updateRole(input: {
106
106
  priority_threshold_minutes?: number | null;
107
107
  /** Escalation metadata key holding the age origin (ISO 8601 UTC timestamp). Falls back to created_at. */
108
108
  priority_facet?: string | null;
109
+ /** Escalation metadata key identifying the entity that moves through this role (e.g. serialNumber). */
110
+ entity_facet?: string | null;
111
+ /** How this role names the entity's states: 'role' (the station is the state) or 'subtype'. Null resets to 'role'. */
112
+ entity_state_source?: 'role' | 'subtype' | null;
109
113
  /** Turn server-side resolver schema validation on/off for this role. */
110
114
  enforce_schema?: boolean;
111
115
  /** Replace the upstream-input set (omitted = preserve; null or [] = clear). */
@@ -222,6 +222,12 @@ async function updateRole(input) {
222
222
  if (input.priority_facet != null && (typeof input.priority_facet !== 'string' || !facet_sql_1.FACET_KEY.test(input.priority_facet))) {
223
223
  return { status: 400, error: 'priority_facet must be a metadata key (letters, numbers, underscores) or null' };
224
224
  }
225
+ if (input.entity_facet != null && (typeof input.entity_facet !== 'string' || !facet_sql_1.FACET_KEY.test(input.entity_facet))) {
226
+ return { status: 400, error: 'entity_facet must be a metadata key (letters, numbers, underscores) or null' };
227
+ }
228
+ if (input.entity_state_source != null && input.entity_state_source !== 'role' && input.entity_state_source !== 'subtype') {
229
+ return { status: 400, error: "entity_state_source must be 'role', 'subtype', or null" };
230
+ }
225
231
  if (input.ops_visible !== undefined && typeof input.ops_visible !== 'boolean') {
226
232
  return { status: 400, error: 'ops_visible must be a boolean' };
227
233
  }
@@ -272,6 +278,8 @@ async function updateRole(input) {
272
278
  worker_count: input.worker_count,
273
279
  priority_threshold_minutes: input.priority_threshold_minutes,
274
280
  priority_facet: input.priority_facet,
281
+ entity_facet: input.entity_facet,
282
+ entity_state_source: input.entity_state_source,
275
283
  enforce_schema: input.enforce_schema,
276
284
  upstream_roles: input.upstream_roles,
277
285
  change_summary: input.change_summary,
@@ -0,0 +1,11 @@
1
+ import { type ScanChoiceExecuteRequest, type ScanExecuteResponse } from '../../types';
2
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
3
+ /**
4
+ * Execute one presented choice. The request is a POINTER — scheme/category/
5
+ * step/choice indices plus the escalation id the screen showed — and a
6
+ * pointer is never authority: the choice is re-read from live config, the
7
+ * row is re-located under the step's query, the identity gate re-applies,
8
+ * and the verb runs through the same atomic executors a direct scan uses
9
+ * (so a lost race is a structured CONFLICT, exactly as on double-scan).
10
+ */
11
+ export declare function executeScanChoice(input: ScanChoiceExecuteRequest, auth: LTApiAuth): Promise<LTApiResult<ScanExecuteResponse>>;
@@ -0,0 +1,136 @@
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.executeScanChoice = executeScanChoice;
37
+ const scanCodeService = __importStar(require("../../services/scan-code"));
38
+ const escalationService = __importStar(require("../../services/escalation"));
39
+ const types_1 = require("../../types");
40
+ const identity_1 = require("./identity");
41
+ const context_1 = require("./context");
42
+ const locate_1 = require("./locate");
43
+ const verbs_1 = require("./verbs");
44
+ /**
45
+ * Execute one presented choice. The request is a POINTER — scheme/category/
46
+ * step/choice indices plus the escalation id the screen showed — and a
47
+ * pointer is never authority: the choice is re-read from live config, the
48
+ * row is re-located under the step's query, the identity gate re-applies,
49
+ * and the verb runs through the same atomic executors a direct scan uses
50
+ * (so a lost race is a structured CONFLICT, exactly as on double-scan).
51
+ */
52
+ async function executeScanChoice(input, auth) {
53
+ try {
54
+ if (!Number.isInteger(input?.schemeVersion) || typeof input?.category !== 'string'
55
+ || !Number.isInteger(input?.stepIndex) || !Number.isInteger(input?.choiceIndex)
56
+ || !input?.escalationId) {
57
+ return { status: 400, error: 'schemeVersion, category, stepIndex, choiceIndex, and escalationId are required' };
58
+ }
59
+ // 1. The pointer resolves against LIVE config — an edit between render
60
+ // and tap is a structured miss, never a stale execution.
61
+ const scheme = await scanCodeService.getScanScheme(input.schemeVersion);
62
+ const rule = await scanCodeService.getScanRule(input.schemeVersion, input.category);
63
+ const step = rule?.steps?.[input.stepIndex];
64
+ const choice = step?.choices?.[input.choiceIndex];
65
+ if (!scheme || !scheme.enabled || scheme.kind !== types_1.SCAN_SCHEME_KINDS.ACTION
66
+ || !rule || !rule.enabled || step?.verb !== types_1.SCAN_VERBS.PRESENT || !choice) {
67
+ return {
68
+ status: 200,
69
+ data: { outcome: types_1.SCAN_OUTCOMES.UNCONFIGURED, error: 'the presented choice is no longer configured' },
70
+ };
71
+ }
72
+ // 2. The acting grant, exchanged before anything reads or writes.
73
+ let effectiveAuth = auth;
74
+ let acting = false;
75
+ if (input.actingToken) {
76
+ const resolved = await (0, identity_1.resolveActingAuth)(input.actingToken);
77
+ if (!resolved.ok) {
78
+ return {
79
+ status: 200,
80
+ data: { outcome: types_1.SCAN_OUTCOMES.NOT_PRIMED, notPrimed: rule.notPrimed, error: resolved.error },
81
+ };
82
+ }
83
+ effectiveAuth = resolved.auth;
84
+ acting = true;
85
+ }
86
+ // 3. The row anchors the target: the scheme's facet on the escalation the
87
+ // screen presented. A missing binding is loud misconfiguration.
88
+ const row = await escalationService.getEscalation(input.escalationId);
89
+ const target = row?.metadata?.[scheme.target_facet];
90
+ if (!row || typeof target !== 'string' || !target) {
91
+ return {
92
+ status: 200,
93
+ data: { outcome: types_1.SCAN_OUTCOMES.UNCONFIGURED, error: `escalation does not carry the scheme facet "${scheme.target_facet}"` },
94
+ };
95
+ }
96
+ const ctx = {
97
+ scheme,
98
+ rule,
99
+ parsed: { version: scheme.version, category: rule.category, target },
100
+ scannedAt: new Date().toISOString(),
101
+ auth: effectiveAuth,
102
+ stationAuth: auth,
103
+ acting,
104
+ };
105
+ // 4. The identity gate, per the choice.
106
+ if (choice.requireActingIdentity && !(await (0, identity_1.actingIdentitySatisfied)(step, ctx))) {
107
+ return decorate((0, context_1.notPrimed)(ctx), ctx, input);
108
+ }
109
+ // 5. The row must still match the step's query — the reality the screen
110
+ // showed. A row that moved on (resolved, claimed away, re-routed) is the
111
+ // same double-actor race a second scan loses.
112
+ const located = await (0, locate_1.locateForStep)(step, ctx, 2);
113
+ if (!located || !located.escalations.some((e) => e.id === input.escalationId)) {
114
+ return decorate((0, context_1.conflict)('the item is no longer in the presented state'), ctx, input);
115
+ }
116
+ // 6. Dispatch through the same atomic executors a direct scan uses.
117
+ const synthesized = { query: step.query, verb: choice.verb, params: choice.params };
118
+ const result = await (0, verbs_1.dispatchChoiceVerb)(synthesized, ctx, located.escalations[0]);
119
+ return decorate(result, ctx, input);
120
+ }
121
+ catch (err) {
122
+ return { status: 500, error: err.message };
123
+ }
124
+ }
125
+ /** Stamp the rule + pointer identity onto the outcome, mirroring execute. */
126
+ function decorate(result, ctx, input) {
127
+ if (result.data && typeof result.data === 'object' && 'outcome' in result.data) {
128
+ result.data = {
129
+ ...result.data,
130
+ parsed: ctx.parsed,
131
+ rule: { schemeVersion: ctx.rule.scheme_version, category: ctx.rule.category, name: ctx.rule.name },
132
+ stepIndex: input.stepIndex,
133
+ };
134
+ }
135
+ return result;
136
+ }
@@ -0,0 +1,24 @@
1
+ import * as scanCodeService from '../../services/scan-code';
2
+ import { type LTEscalationRecord, type ParsedScanCode, type ScanExecuteResponse, type ScanRule, type ScanScheme, type ScanStep } from '../../types';
3
+ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
4
+ /** Everything a step executor needs about the scan that reached it. */
5
+ export interface StepContext {
6
+ scheme: ScanScheme;
7
+ rule: ScanRule;
8
+ parsed: ParsedScanCode;
9
+ scannedAt: string;
10
+ /** The effective actor — the acting (badged) user when a grant rode the request. */
11
+ auth: LTApiAuth;
12
+ /** The authenticated principal (the device on a station deployment). */
13
+ stationAuth: LTApiAuth;
14
+ /** True when `auth` came from an acting-identity grant. */
15
+ acting: boolean;
16
+ }
17
+ export declare function targetFilter(step: ScanStep, ctx: StepContext): Record<string, any>;
18
+ export declare function templateContext(ctx: StepContext): scanCodeService.ScanTemplateContext;
19
+ export declare function provenance(ctx: StepContext): Record<string, any>;
20
+ export declare function interpolatedMetadata(step: ScanStep, ctx: StepContext): Record<string, any>;
21
+ export declare function executed(escalation: LTEscalationRecord | Record<string, any> | undefined, step: Pick<ScanStep, 'verb'>): LTApiResult<ScanExecuteResponse>;
22
+ export declare function forbidden(error?: string): LTApiResult<ScanExecuteResponse>;
23
+ export declare function conflict(error?: string): LTApiResult<ScanExecuteResponse>;
24
+ export declare function notPrimed(ctx: StepContext): LTApiResult<ScanExecuteResponse>;
@@ -0,0 +1,86 @@
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.targetFilter = targetFilter;
37
+ exports.templateContext = templateContext;
38
+ exports.provenance = provenance;
39
+ exports.interpolatedMetadata = interpolatedMetadata;
40
+ exports.executed = executed;
41
+ exports.forbidden = forbidden;
42
+ exports.conflict = conflict;
43
+ exports.notPrimed = notPrimed;
44
+ const scanCodeService = __importStar(require("../../services/scan-code"));
45
+ const types_1 = require("../../types");
46
+ function targetFilter(step, ctx) {
47
+ return { [ctx.scheme.target_facet]: ctx.parsed.target, ...(step.query?.facets ?? {}) };
48
+ }
49
+ function templateContext(ctx) {
50
+ return { target: ctx.parsed.target, category: ctx.parsed.category, scannedAt: ctx.scannedAt };
51
+ }
52
+ function provenance(ctx) {
53
+ return {
54
+ [types_1.SCAN_PROVENANCE_KEYS.SCHEME]: ctx.scheme.version,
55
+ [types_1.SCAN_PROVENANCE_KEYS.CATEGORY]: ctx.parsed.category,
56
+ [types_1.SCAN_PROVENANCE_KEYS.ACTION_NAME]: ctx.rule.name,
57
+ [types_1.SCAN_PROVENANCE_KEYS.SCANNED_AT]: ctx.scannedAt,
58
+ // Under an acting identity the mutation attributes to the person; the
59
+ // device where it happened is the other half of the audit pair.
60
+ ...(ctx.acting ? { [types_1.SCAN_PROVENANCE_KEYS.STATION]: ctx.stationAuth.userId } : {}),
61
+ };
62
+ }
63
+ function interpolatedMetadata(step, ctx) {
64
+ return step.params?.metadata
65
+ ? scanCodeService.interpolateScanTemplate(step.params.metadata, templateContext(ctx))
66
+ : {};
67
+ }
68
+ function executed(escalation, step) {
69
+ return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.EXECUTED, verb: step.verb, escalation } };
70
+ }
71
+ function forbidden(error) {
72
+ return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.FORBIDDEN, error } };
73
+ }
74
+ function conflict(error) {
75
+ return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.CONFLICT, error } };
76
+ }
77
+ function notPrimed(ctx) {
78
+ return {
79
+ status: 200,
80
+ data: {
81
+ outcome: types_1.SCAN_OUTCOMES.NOT_PRIMED,
82
+ notPrimed: ctx.rule.notPrimed,
83
+ error: 'an acting identity is required — scan your badge',
84
+ },
85
+ };
86
+ }
@@ -1,5 +1,6 @@
1
1
  import { type ScanExecuteRequest, type ScanExecuteResponse } from '../../types';
2
2
  import type { LTApiAuth, LTApiResult } from '../../types/sdk';
3
+ export type { StepContext } from './context';
3
4
  /**
4
5
  * Execute a raw scan code: parse → load the rule → walk its steps in order.
5
6
  * The first step whose condition matches performs its verb and answers; a