@hotmeshio/long-tail 0.10.13 → 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 (373) hide show
  1. package/README.md +2 -4
  2. package/build/api/escalations/analytics.d.ts +6 -0
  3. package/build/api/escalations/analytics.js +123 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +4 -1
  6. package/build/api/escalations/metadata.js +1 -1
  7. package/build/api/escalations/resolve.js +4 -4
  8. package/build/api/roles.d.ts +4 -0
  9. package/build/api/roles.js +8 -0
  10. package/build/api/scan-codes/choice.d.ts +11 -0
  11. package/build/api/scan-codes/choice.js +136 -0
  12. package/build/api/scan-codes/context.d.ts +24 -0
  13. package/build/api/scan-codes/context.js +86 -0
  14. package/build/api/scan-codes/execute.d.ts +1 -0
  15. package/build/api/scan-codes/execute.js +49 -244
  16. package/build/api/scan-codes/identity.d.ts +18 -0
  17. package/build/api/scan-codes/identity.js +116 -0
  18. package/build/api/scan-codes/index.d.ts +2 -0
  19. package/build/api/scan-codes/index.js +6 -1
  20. package/build/api/scan-codes/locate.d.ts +14 -0
  21. package/build/api/scan-codes/locate.js +127 -0
  22. package/build/api/scan-codes/present.d.ts +9 -0
  23. package/build/api/scan-codes/present.js +59 -0
  24. package/build/api/scan-codes/verbs.d.ts +15 -0
  25. package/build/api/scan-codes/verbs.js +205 -0
  26. package/build/bin/ltc.js +33 -0
  27. package/build/lib/cli/commands/escalations.d.ts +31 -0
  28. package/build/lib/cli/commands/escalations.js +88 -0
  29. package/build/lib/db/schemas/028_role_entity_facet.sql +18 -0
  30. package/build/lib/db/schemas/029_scan_scheme_kind.sql +31 -0
  31. package/build/modules/config.d.ts +5 -0
  32. package/build/modules/config.js +12 -0
  33. package/build/routes/escalations/acting.d.ts +12 -0
  34. package/build/routes/escalations/acting.js +25 -0
  35. package/build/routes/escalations/analytics.d.ts +8 -0
  36. package/build/routes/escalations/analytics.js +63 -0
  37. package/build/routes/escalations/index.js +3 -0
  38. package/build/routes/escalations/resolve.js +8 -1
  39. package/build/routes/escalations/single.js +13 -4
  40. package/build/routes/roles.js +1 -1
  41. package/build/routes/scan-codes.js +28 -2
  42. package/build/scripts/ortho-populate.js +14 -0
  43. package/build/scripts/printer-cycle.d.ts +25 -0
  44. package/build/scripts/printer-cycle.js +169 -0
  45. package/build/scripts/twin-farm.js +19 -5
  46. package/build/sdk/index.d.ts +2 -0
  47. package/build/sdk/index.js +3 -0
  48. package/build/services/escalation/aggregate-sql.d.ts +36 -0
  49. package/build/services/escalation/aggregate-sql.js +253 -0
  50. package/build/services/escalation/aggregate-validate.d.ts +57 -0
  51. package/build/services/escalation/aggregate-validate.js +218 -0
  52. package/build/services/escalation/aggregates.d.ts +26 -0
  53. package/build/services/escalation/aggregates.js +204 -0
  54. package/build/services/escalation/client.js +57 -21
  55. package/build/services/escalation/facet-sql.js +17 -0
  56. package/build/services/escalation/index.d.ts +2 -0
  57. package/build/services/escalation/index.js +8 -1
  58. package/build/services/escalation/metrics-cache.d.ts +18 -0
  59. package/build/services/escalation/metrics-cache.js +47 -1
  60. package/build/services/escalation/queries.js +2 -0
  61. package/build/services/escalation/resolver-validation.d.ts +1 -1
  62. package/build/services/escalation/resolver-validation.js +12 -5
  63. package/build/services/escalation/submit-guard.d.ts +29 -0
  64. package/build/services/escalation/submit-guard.js +57 -0
  65. package/build/services/iam/acting-identity.d.ts +16 -0
  66. package/build/services/iam/acting-identity.js +60 -0
  67. package/build/services/role/index.js +2 -0
  68. package/build/services/role/sql.d.ts +10 -2
  69. package/build/services/role/sql.js +14 -1
  70. package/build/services/role/types.d.ts +16 -0
  71. package/build/services/scan-code/read.js +4 -0
  72. package/build/services/scan-code/sql.d.ts +4 -4
  73. package/build/services/scan-code/sql.js +14 -8
  74. package/build/services/scan-code/validate.d.ts +2 -0
  75. package/build/services/scan-code/validate.js +86 -0
  76. package/build/services/scan-code/write.d.ts +4 -0
  77. package/build/services/scan-code/write.js +16 -2
  78. package/build/services/user/crud.d.ts +6 -0
  79. package/build/services/user/crud.js +16 -0
  80. package/build/services/user/index.d.ts +1 -1
  81. package/build/services/user/index.js +2 -1
  82. package/build/services/user/sql.d.ts +8 -0
  83. package/build/services/user/sql.js +9 -1
  84. package/build/shared/form-validation/index.d.ts +4 -0
  85. package/build/shared/form-validation/index.js +4 -0
  86. package/build/shared/form-validation/x-lt-labels.d.ts +28 -0
  87. package/build/shared/form-validation/x-lt-labels.js +42 -0
  88. package/build/shared/form-validation/x-lt-query.d.ts +56 -0
  89. package/build/shared/form-validation/x-lt-query.js +49 -0
  90. package/build/shared/form-validation/x-lt-submit-guard.d.ts +46 -0
  91. package/build/shared/form-validation/x-lt-submit-guard.js +25 -0
  92. package/build/shared/form-validation/x-lt-submit-on-claim.d.ts +22 -0
  93. package/build/shared/form-validation/x-lt-submit-on-claim.js +28 -0
  94. package/build/system/mcp-servers/admin/escalations.js +34 -0
  95. package/build/system/mcp-servers/admin/scan-codes.js +17 -1
  96. package/build/system/mcp-servers/admin/schemas.d.ts +643 -25
  97. package/build/system/mcp-servers/admin/schemas.js +127 -19
  98. package/build/system/mcp-servers/admin/users.js +3 -1
  99. package/build/system/mcp-servers/human-queue-schemas.d.ts +2 -2
  100. package/build/system/seed/tool-manifests-admin.d.ts +2283 -0
  101. package/build/system/seed/tool-manifests-admin.js +8 -5
  102. package/build/tsconfig.tsbuildinfo +1 -1
  103. package/build/types/analytics.d.ts +154 -0
  104. package/build/types/analytics.js +14 -0
  105. package/build/types/facets.d.ts +13 -0
  106. package/build/types/index.d.ts +5 -2
  107. package/build/types/index.js +5 -1
  108. package/build/types/scan-choice.d.ts +49 -0
  109. package/build/types/scan-choice.js +9 -0
  110. package/build/types/scan-code.d.ts +72 -1
  111. package/build/types/scan-code.js +30 -1
  112. package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js → AdminDashboard-DJ3LJQ09.js} +2 -2
  113. package/dashboard/dist/assets/{AdminDashboard-Bv3pHBzn.js.map → AdminDashboard-DJ3LJQ09.js.map} +1 -1
  114. package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js → AgentConfigPage-BMMvaD0z.js} +2 -2
  115. package/dashboard/dist/assets/{AgentConfigPage-Dk2zlvDb.js.map → AgentConfigPage-BMMvaD0z.js.map} +1 -1
  116. package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js → AgentDetailPage-C6wfsnRe.js} +2 -2
  117. package/dashboard/dist/assets/{AgentDetailPage-DUno6EGs.js.map → AgentDetailPage-C6wfsnRe.js.map} +1 -1
  118. package/dashboard/dist/assets/AgentsPage-Cwqka7nE.js +2 -0
  119. package/dashboard/dist/assets/{AgentsPage-CToVu1qj.js.map → AgentsPage-Cwqka7nE.js.map} +1 -1
  120. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js +2 -0
  121. package/dashboard/dist/assets/AvailableEscalationsPage-CVlG_AVC.js.map +1 -0
  122. package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js → BotPicker-BBkJBXZB.js} +2 -2
  123. package/dashboard/dist/assets/{BotPicker-DQOpVB4M.js.map → BotPicker-BBkJBXZB.js.map} +1 -1
  124. package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js → CapabilitiesPage-wxmE4917.js} +2 -2
  125. package/dashboard/dist/assets/{CapabilitiesPage-Dmf46PUJ.js.map → CapabilitiesPage-wxmE4917.js.map} +1 -1
  126. package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js → CollapsibleSection-B3FsrHwH.js} +2 -2
  127. package/dashboard/dist/assets/{CollapsibleSection-CDADefUY.js.map → CollapsibleSection-B3FsrHwH.js.map} +1 -1
  128. package/dashboard/dist/assets/CountdownTimer-B3nCqJdC.js +2 -0
  129. package/dashboard/dist/assets/CountdownTimer-B3nCqJdC.js.map +1 -0
  130. package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js → CredentialsPage-Bv875IHe.js} +2 -2
  131. package/dashboard/dist/assets/{CredentialsPage-8LIEvomi.js.map → CredentialsPage-Bv875IHe.js.map} +1 -1
  132. package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js → CronLabel-CSzjWuwj.js} +2 -2
  133. package/dashboard/dist/assets/{CronLabel-CK3WSsM5.js.map → CronLabel-CSzjWuwj.js.map} +1 -1
  134. package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js → CustomDurationPicker-CCpqf3e4.js} +2 -2
  135. package/dashboard/dist/assets/{CustomDurationPicker-FPmlA6cE.js.map → CustomDurationPicker-CCpqf3e4.js.map} +1 -1
  136. package/dashboard/dist/assets/{DropZone-CL9gA7pu.js → DropZone-CJkk-U3o.js} +2 -2
  137. package/dashboard/dist/assets/{DropZone-CL9gA7pu.js.map → DropZone-CJkk-U3o.js.map} +1 -1
  138. package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js → ElapsedCell-WV6pUaKo.js} +2 -2
  139. package/dashboard/dist/assets/{ElapsedCell-BZVkVxE0.js.map → ElapsedCell-WV6pUaKo.js.map} +1 -1
  140. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js +2 -0
  141. package/dashboard/dist/assets/EntityTimelinePanel-DrL86Yrf.js.map +1 -0
  142. package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js → EscalationListSchemaPage-CTQCALw4.js} +3 -3
  143. package/dashboard/dist/assets/{EscalationListSchemaPage-kYLdUtZX.js.map → EscalationListSchemaPage-CTQCALw4.js.map} +1 -1
  144. package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js → EscalationSchemaPage-D_UgP0pv.js} +3 -3
  145. package/dashboard/dist/assets/{EscalationSchemaPage-kUmCDivo.js.map → EscalationSchemaPage-D_UgP0pv.js.map} +1 -1
  146. package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js → EscalationsOverview-DuIUyxr0.js} +2 -2
  147. package/dashboard/dist/assets/{EscalationsOverview-D17auO-m.js.map → EscalationsOverview-DuIUyxr0.js.map} +1 -1
  148. package/dashboard/dist/assets/EventTable-BV6unphX.js +2 -0
  149. package/dashboard/dist/assets/EventTable-BV6unphX.js.map +1 -0
  150. package/dashboard/dist/assets/FilterBar-DYFgzXNB.js +2 -0
  151. package/dashboard/dist/assets/FilterBar-DYFgzXNB.js.map +1 -0
  152. package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js → GraphInvokePage-BGHVUipJ.js} +2 -2
  153. package/dashboard/dist/assets/{GraphInvokePage-D11uOnZi.js.map → GraphInvokePage-BGHVUipJ.js.map} +1 -1
  154. package/dashboard/dist/assets/HomePage-B-S2cK3E.js +2 -0
  155. package/dashboard/dist/assets/{HomePage-Bcq10Bxx.js.map → HomePage-B-S2cK3E.js.map} +1 -1
  156. package/dashboard/dist/assets/ListToolbar-Bl7F3A28.js +2 -0
  157. package/dashboard/dist/assets/{ListToolbar-IPXsTb3Q.js.map → ListToolbar-Bl7F3A28.js.map} +1 -1
  158. package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js → McpOverview-_T9IsCD_.js} +2 -2
  159. package/dashboard/dist/assets/{McpOverview-Dx2j0KkF.js.map → McpOverview-_T9IsCD_.js.map} +1 -1
  160. package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js → McpQueryDetailPage-DtsVqKPw.js} +2 -2
  161. package/dashboard/dist/assets/{McpQueryDetailPage-CzF_bna8.js.map → McpQueryDetailPage-DtsVqKPw.js.map} +1 -1
  162. package/dashboard/dist/assets/McpQueryPage-DX5u-1bx.js +2 -0
  163. package/dashboard/dist/assets/{McpQueryPage-CNsuiw_q.js.map → McpQueryPage-DX5u-1bx.js.map} +1 -1
  164. package/dashboard/dist/assets/McpRunDetailPage-BhcqqtYS.js +2 -0
  165. package/dashboard/dist/assets/McpRunDetailPage-BhcqqtYS.js.map +1 -0
  166. package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js → McpRunsPage-L-1y8wnX.js} +2 -2
  167. package/dashboard/dist/assets/{McpRunsPage-CK96s3Nt.js.map → McpRunsPage-L-1y8wnX.js.map} +1 -1
  168. package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js → NamespacePill-in1SLd0W.js} +2 -2
  169. package/dashboard/dist/assets/{NamespacePill-B9Vc_Pz2.js.map → NamespacePill-in1SLd0W.js.map} +1 -1
  170. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js +3 -0
  171. package/dashboard/dist/assets/OperationsPage-i8KcDpKo.js.map +1 -0
  172. package/dashboard/dist/assets/OperatorDashboard-CIbDzOlh.js +2 -0
  173. package/dashboard/dist/assets/{OperatorDashboard-C-jE0IRA.js.map → OperatorDashboard-CIbDzOlh.js.map} +1 -1
  174. package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js → PageHeader-BJgWMZtw.js} +2 -2
  175. package/dashboard/dist/assets/{PageHeader-Ce4GcIYo.js.map → PageHeader-BJgWMZtw.js.map} +1 -1
  176. package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js → PageHeaderWithStats-Ccio4vyG.js} +2 -2
  177. package/dashboard/dist/assets/{PageHeaderWithStats-Ck0KZvXD.js.map → PageHeaderWithStats-Ccio4vyG.js.map} +1 -1
  178. package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js → PersonaDetailPage-BOaf0TW1.js} +2 -2
  179. package/dashboard/dist/assets/{PersonaDetailPage-CJ6jqo7h.js.map → PersonaDetailPage-BOaf0TW1.js.map} +1 -1
  180. package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js → PersonasPage-DSdRb90f.js} +2 -2
  181. package/dashboard/dist/assets/{PersonasPage-D8hL3kL5.js.map → PersonasPage-DSdRb90f.js.map} +1 -1
  182. package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js → ProcessDetailPage-DN9NqfeP.js} +2 -2
  183. package/dashboard/dist/assets/{ProcessDetailPage-Vnx8Z5_y.js.map → ProcessDetailPage-DN9NqfeP.js.map} +1 -1
  184. package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js → ProcessesListPage-CfQEWaD4.js} +2 -2
  185. package/dashboard/dist/assets/{ProcessesListPage-DRYtvS3N.js.map → ProcessesListPage-CfQEWaD4.js.map} +1 -1
  186. package/dashboard/dist/assets/RoleDetailPage-BC5HL7ls.js +8 -0
  187. package/dashboard/dist/assets/RoleDetailPage-BC5HL7ls.js.map +1 -0
  188. package/dashboard/dist/assets/{RolePill-CnuBPhPw.js → RolePill-BNAP-uK6.js} +2 -2
  189. package/dashboard/dist/assets/{RolePill-CnuBPhPw.js.map → RolePill-BNAP-uK6.js.map} +1 -1
  190. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js +2 -0
  191. package/dashboard/dist/assets/RolesPage-DCnW0VmD.js.map +1 -0
  192. package/dashboard/dist/assets/RunAsSelector-twbuX7fB.js +2 -0
  193. package/dashboard/dist/assets/{RunAsSelector-CS3KQ-BF.js.map → RunAsSelector-twbuX7fB.js.map} +1 -1
  194. package/dashboard/dist/assets/ScanCodesPage-CPNg6K--.js +2 -0
  195. package/dashboard/dist/assets/ScanCodesPage-CPNg6K--.js.map +1 -0
  196. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js +2 -0
  197. package/dashboard/dist/assets/ScanSchemeDetailPage-DyLmCamO.js.map +1 -0
  198. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js +2 -0
  199. package/dashboard/dist/assets/ScanStationPage-DoZccU5B.js.map +1 -0
  200. package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js → ScopeBadge-BG7KkZ8Q.js} +2 -2
  201. package/dashboard/dist/assets/{ScopeBadge-BUpYpS3x.js.map → ScopeBadge-BG7KkZ8Q.js.map} +1 -1
  202. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js +2 -0
  203. package/dashboard/dist/assets/SegmentedTabs-DXNzY05q.js.map +1 -0
  204. package/dashboard/dist/assets/StickyPagination-DIeYMPPd.js +2 -0
  205. package/dashboard/dist/assets/StickyPagination-DIeYMPPd.js.map +1 -0
  206. package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js → StreamMessageDetail-gU4CUeQI.js} +2 -2
  207. package/dashboard/dist/assets/{StreamMessageDetail-DyJyZwBl.js.map → StreamMessageDetail-gU4CUeQI.js.map} +1 -1
  208. package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js → SwimlaneTimeline-Br-nBA4l.js} +2 -2
  209. package/dashboard/dist/assets/{SwimlaneTimeline-BlzV74V5.js.map → SwimlaneTimeline-Br-nBA4l.js.map} +1 -1
  210. package/dashboard/dist/assets/{TagInput-BbZ25nNe.js → TagInput-CvM5n6ww.js} +2 -2
  211. package/dashboard/dist/assets/{TagInput-BbZ25nNe.js.map → TagInput-CvM5n6ww.js.map} +1 -1
  212. package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js → TaskDetailPage-_9cr_R0u.js} +2 -2
  213. package/dashboard/dist/assets/{TaskDetailPage-B0p_Z4J_.js.map → TaskDetailPage-_9cr_R0u.js.map} +1 -1
  214. package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js → TaskQueuePill-D4JPHXOq.js} +2 -2
  215. package/dashboard/dist/assets/{TaskQueuePill-D0QKBrN3.js.map → TaskQueuePill-D4JPHXOq.js.map} +1 -1
  216. package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js → TasksListPage-DVENC9Jp.js} +2 -2
  217. package/dashboard/dist/assets/{TasksListPage-CiGR2QiQ.js.map → TasksListPage-DVENC9Jp.js.map} +1 -1
  218. package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js → TimeAgo-C9yYnOui.js} +2 -2
  219. package/dashboard/dist/assets/{TimeAgo-D_DA9ucC.js.map → TimeAgo-C9yYnOui.js.map} +1 -1
  220. package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js → TimestampCell-DoB8cYgw.js} +2 -2
  221. package/dashboard/dist/assets/{TimestampCell-C7rkC9nh.js.map → TimestampCell-DoB8cYgw.js.map} +1 -1
  222. package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js → ToolPill-BUjbC-Tj.js} +2 -2
  223. package/dashboard/dist/assets/{ToolPill-8xY9rkoc.js.map → ToolPill-BUjbC-Tj.js.map} +1 -1
  224. package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js → ToolTestPanel-CBtsIP8K.js} +2 -2
  225. package/dashboard/dist/assets/{ToolTestPanel-E8efYGYs.js.map → ToolTestPanel-CBtsIP8K.js.map} +1 -1
  226. package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js → TopicDetailPage-mR4Jaz83.js} +4 -4
  227. package/dashboard/dist/assets/{TopicDetailPage-B455XrRc.js.map → TopicDetailPage-mR4Jaz83.js.map} +1 -1
  228. package/dashboard/dist/assets/TopicsPage-CP7HFxIC.js +2 -0
  229. package/dashboard/dist/assets/{TopicsPage-1VAc29Qw.js.map → TopicsPage-CP7HFxIC.js.map} +1 -1
  230. package/dashboard/dist/assets/{UserName-DikzjQHJ.js → UserName-BnLF6yhz.js} +2 -2
  231. package/dashboard/dist/assets/{UserName-DikzjQHJ.js.map → UserName-BnLF6yhz.js.map} +1 -1
  232. package/dashboard/dist/assets/WorkflowExecutionPage-xL956RZi.js +2 -0
  233. package/dashboard/dist/assets/WorkflowExecutionPage-xL956RZi.js.map +1 -0
  234. package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js → WorkflowPill-tXU0-eXu.js} +2 -2
  235. package/dashboard/dist/assets/{WorkflowPill-Da406nEj.js.map → WorkflowPill-tXU0-eXu.js.map} +1 -1
  236. package/dashboard/dist/assets/WorkflowsDashboard-B-u7zFKM.js +2 -0
  237. package/dashboard/dist/assets/{WorkflowsDashboard-BMQd_0tW.js.map → WorkflowsDashboard-B-u7zFKM.js.map} +1 -1
  238. package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js → WorkflowsOverview-CqZVarK-.js} +2 -2
  239. package/dashboard/dist/assets/{WorkflowsOverview-CdxjVifp.js.map → WorkflowsOverview-CqZVarK-.js.map} +1 -1
  240. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js → YamlWorkflowDetailPage-DiFLavW0.js} +10 -10
  241. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DNVffIXa.js.map → YamlWorkflowDetailPage-DiFLavW0.js.map} +1 -1
  242. package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js → YamlWorkflowsPage-BuQM6uZA.js} +2 -2
  243. package/dashboard/dist/assets/{YamlWorkflowsPage-BGP8wuos.js.map → YamlWorkflowsPage-BuQM6uZA.js.map} +1 -1
  244. package/dashboard/dist/assets/{agents-BZJLIJ4h.js → agents-DU9GPovp.js} +2 -2
  245. package/dashboard/dist/assets/{agents-BZJLIJ4h.js.map → agents-DU9GPovp.js.map} +1 -1
  246. package/dashboard/dist/assets/{bots-ClLcDGJb.js → bots-Cy-Hmg7w.js} +2 -2
  247. package/dashboard/dist/assets/{bots-ClLcDGJb.js.map → bots-Cy-Hmg7w.js.map} +1 -1
  248. package/dashboard/dist/assets/capabilities-sSJJqrp-.js +2 -0
  249. package/dashboard/dist/assets/{capabilities-IaCcS7ge.js.map → capabilities-sSJJqrp-.js.map} +1 -1
  250. package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js → controlplane-TVCjDHQ-.js} +2 -2
  251. package/dashboard/dist/assets/{controlplane-Zi4m_MSx.js.map → controlplane-TVCjDHQ-.js.map} +1 -1
  252. package/dashboard/dist/assets/escalation-columns-BpkjKYGd.js +2 -0
  253. package/dashboard/dist/assets/escalation-columns-BpkjKYGd.js.map +1 -0
  254. package/dashboard/dist/assets/index-5TblaCXQ.css +1 -0
  255. package/dashboard/dist/assets/index-7BP6FaCZ.js +2 -0
  256. package/dashboard/dist/assets/{index-Dldi3Q3M.js.map → index-7BP6FaCZ.js.map} +1 -1
  257. package/dashboard/dist/assets/{index-BzkE48xJ.js → index-B7IaBPBg.js} +4 -4
  258. package/dashboard/dist/assets/{index-BzkE48xJ.js.map → index-B7IaBPBg.js.map} +1 -1
  259. package/dashboard/dist/assets/index-BE0phFw0.js +2 -0
  260. package/dashboard/dist/assets/{index-CLmZaNTK.js.map → index-BE0phFw0.js.map} +1 -1
  261. package/dashboard/dist/assets/{index-BqGnhkh0.js → index-BYNN9N1T.js} +2 -2
  262. package/dashboard/dist/assets/{index-BqGnhkh0.js.map → index-BYNN9N1T.js.map} +1 -1
  263. package/dashboard/dist/assets/{index-kiKZresb.js → index-CLPVqbVY.js} +2 -2
  264. package/dashboard/dist/assets/{index-kiKZresb.js.map → index-CLPVqbVY.js.map} +1 -1
  265. package/dashboard/dist/assets/{index-C3o4OisO.js → index-Cfv86_L9.js} +2 -2
  266. package/dashboard/dist/assets/{index-C3o4OisO.js.map → index-Cfv86_L9.js.map} +1 -1
  267. package/dashboard/dist/assets/{index-yGNt29V9.js → index-CtwbQ_-m.js} +2 -2
  268. package/dashboard/dist/assets/{index-yGNt29V9.js.map → index-CtwbQ_-m.js.map} +1 -1
  269. package/dashboard/dist/assets/index-DOai950R.js +3 -0
  270. package/dashboard/dist/assets/index-DOai950R.js.map +1 -0
  271. package/dashboard/dist/assets/index-DTtHNC-D.js +5 -0
  272. package/dashboard/dist/assets/{index-CvNBdkB1.js.map → index-DTtHNC-D.js.map} +1 -1
  273. package/dashboard/dist/assets/{index-CJu2PBNx.js → index-DsWnVyVN.js} +2 -2
  274. package/dashboard/dist/assets/{index-CJu2PBNx.js.map → index-DsWnVyVN.js.map} +1 -1
  275. package/dashboard/dist/assets/{index-D0zFReGL.js → index-Dy-MMYti.js} +2 -2
  276. package/dashboard/dist/assets/{index-D0zFReGL.js.map → index-Dy-MMYti.js.map} +1 -1
  277. package/dashboard/dist/assets/index-errgQT5x.js +65 -0
  278. package/dashboard/dist/assets/index-errgQT5x.js.map +1 -0
  279. package/dashboard/dist/assets/{index-CmnNqpWg.js → index-fgBDhnI6.js} +2 -2
  280. package/dashboard/dist/assets/{index-CmnNqpWg.js.map → index-fgBDhnI6.js.map} +1 -1
  281. package/dashboard/dist/assets/{knowledge-DWLxGTib.js → knowledge-arh4NfmL.js} +2 -2
  282. package/dashboard/dist/assets/{knowledge-DWLxGTib.js.map → knowledge-arh4NfmL.js.map} +1 -1
  283. package/dashboard/dist/assets/{mcp-B6AARZ2I.js → mcp-QGf5jHCo.js} +2 -2
  284. package/dashboard/dist/assets/{mcp-B6AARZ2I.js.map → mcp-QGf5jHCo.js.map} +1 -1
  285. package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js → mcp-query-BEJN1nMZ.js} +2 -2
  286. package/dashboard/dist/assets/{mcp-query-DrkvBU3a.js.map → mcp-query-BEJN1nMZ.js.map} +1 -1
  287. package/dashboard/dist/assets/{personas-Cmz2SAEU.js → personas-DYtw1COf.js} +2 -2
  288. package/dashboard/dist/assets/{personas-Cmz2SAEU.js.map → personas-DYtw1COf.js.map} +1 -1
  289. package/dashboard/dist/assets/{pipelines-CSgfVCMy.js → pipelines-Byi6PnbE.js} +2 -2
  290. package/dashboard/dist/assets/{pipelines-CSgfVCMy.js.map → pipelines-Byi6PnbE.js.map} +1 -1
  291. package/dashboard/dist/assets/{tasks-UOtUkDk-.js → tasks-D0SQdENz.js} +2 -2
  292. package/dashboard/dist/assets/{tasks-UOtUkDk-.js.map → tasks-D0SQdENz.js.map} +1 -1
  293. package/dashboard/dist/assets/{topics-Df5hGh6o.js → topics-DgDv5ZXP.js} +2 -2
  294. package/dashboard/dist/assets/{topics-Df5hGh6o.js.map → topics-DgDv5ZXP.js.map} +1 -1
  295. package/dashboard/dist/assets/useEventHooks-DZaYzE7s.js +2 -0
  296. package/dashboard/dist/assets/{useEventHooks-PDbuSJ12.js.map → useEventHooks-DZaYzE7s.js.map} +1 -1
  297. package/dashboard/dist/assets/{useNamespace-tZSOlge3.js → useNamespace-C1OqiNXN.js} +2 -2
  298. package/dashboard/dist/assets/{useNamespace-tZSOlge3.js.map → useNamespace-C1OqiNXN.js.map} +1 -1
  299. package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js → useYamlActivityEvents-CkmXDm-Z.js} +2 -2
  300. package/dashboard/dist/assets/{useYamlActivityEvents-CINLzE32.js.map → useYamlActivityEvents-CkmXDm-Z.js.map} +1 -1
  301. package/dashboard/dist/assets/{users-G8qwyZKS.js → users-D4DCFPH1.js} +2 -2
  302. package/dashboard/dist/assets/{users-G8qwyZKS.js.map → users-D4DCFPH1.js.map} +1 -1
  303. package/dashboard/dist/assets/{vendor-icons-BpZiWH2f.js → vendor-icons-BxuyFxH2.js} +156 -136
  304. package/dashboard/dist/assets/vendor-icons-BxuyFxH2.js.map +1 -0
  305. package/dashboard/dist/assets/{workflows-DbPqi1TW.js → workflows-qyc0ku_5.js} +2 -2
  306. package/dashboard/dist/assets/{workflows-DbPqi1TW.js.map → workflows-qyc0ku_5.js.map} +1 -1
  307. package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js → yaml-workflows-DWFww9Xn.js} +2 -2
  308. package/dashboard/dist/assets/{yaml-workflows-DozD8hpR.js.map → yaml-workflows-DWFww9Xn.js.map} +1 -1
  309. package/dashboard/dist/index.html +3 -3
  310. package/docs/api/http/escalations.md +133 -0
  311. package/docs/api/http/roles.md +6 -0
  312. package/docs/api/mcp/admin.md +53 -0
  313. package/docs/api/sdk/escalations.md +58 -0
  314. package/docs/cli.md +11 -0
  315. package/docs/dashboard.md +22 -20
  316. package/docs/data.md +12 -4
  317. package/docs/design-principles.md +9 -7
  318. package/docs/escalation-analytics.md +251 -0
  319. package/docs/hitl/roles.md +1 -1
  320. package/docs/hitl/x-lt-embed.md +8 -4
  321. package/docs/hitl/x-lt-footer.md +67 -0
  322. package/docs/hitl/x-lt-list-schema.md +10 -3
  323. package/docs/hitl-guide.md +11 -2
  324. package/docs/iam.md +12 -0
  325. package/docs/operations.md +17 -0
  326. package/docs/scan-codes.md +112 -0
  327. package/docs/sdk.md +1 -1
  328. package/package.json +2 -1
  329. package/dashboard/dist/assets/AgentsPage-CToVu1qj.js +0 -2
  330. package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js +0 -2
  331. package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js.map +0 -1
  332. package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js +0 -2
  333. package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js.map +0 -1
  334. package/dashboard/dist/assets/EventTable-CwPWl163.js +0 -2
  335. package/dashboard/dist/assets/EventTable-CwPWl163.js.map +0 -1
  336. package/dashboard/dist/assets/FilterBar-D7GghUsU.js +0 -2
  337. package/dashboard/dist/assets/FilterBar-D7GghUsU.js.map +0 -1
  338. package/dashboard/dist/assets/HomePage-Bcq10Bxx.js +0 -2
  339. package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js +0 -2
  340. package/dashboard/dist/assets/McpQueryPage-CNsuiw_q.js +0 -2
  341. package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js +0 -2
  342. package/dashboard/dist/assets/McpRunDetailPage-BJguEMS0.js.map +0 -1
  343. package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js +0 -2
  344. package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js.map +0 -1
  345. package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js +0 -2
  346. package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js +0 -8
  347. package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js.map +0 -1
  348. package/dashboard/dist/assets/RolesPage-BHzWK9n6.js +0 -2
  349. package/dashboard/dist/assets/RolesPage-BHzWK9n6.js.map +0 -1
  350. package/dashboard/dist/assets/RunAsSelector-CS3KQ-BF.js +0 -2
  351. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js +0 -2
  352. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js.map +0 -1
  353. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js +0 -2
  354. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js.map +0 -1
  355. package/dashboard/dist/assets/StickyPagination-hMrnLXde.js +0 -2
  356. package/dashboard/dist/assets/StickyPagination-hMrnLXde.js.map +0 -1
  357. package/dashboard/dist/assets/TopicsPage-1VAc29Qw.js +0 -2
  358. package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js +0 -2
  359. package/dashboard/dist/assets/WorkflowExecutionPage-C15GSAoe.js.map +0 -1
  360. package/dashboard/dist/assets/WorkflowsDashboard-BMQd_0tW.js +0 -2
  361. package/dashboard/dist/assets/capabilities-IaCcS7ge.js +0 -2
  362. package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js +0 -2
  363. package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js.map +0 -1
  364. package/dashboard/dist/assets/index-CLmZaNTK.js +0 -2
  365. package/dashboard/dist/assets/index-CfAi1OsI.js +0 -65
  366. package/dashboard/dist/assets/index-CfAi1OsI.js.map +0 -1
  367. package/dashboard/dist/assets/index-CvNBdkB1.js +0 -5
  368. package/dashboard/dist/assets/index-Dldi3Q3M.js +0 -2
  369. package/dashboard/dist/assets/index-mKcQGi2B.js +0 -3
  370. package/dashboard/dist/assets/index-mKcQGi2B.js.map +0 -1
  371. package/dashboard/dist/assets/index-zQiUPfxA.css +0 -1
  372. package/dashboard/dist/assets/useEventHooks-PDbuSJ12.js +0 -2
  373. package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +0 -1
@@ -35,11 +35,11 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.executeScanCode = executeScanCode;
37
37
  const scanCodeService = __importStar(require("../../services/scan-code"));
38
- const escalationService = __importStar(require("../../services/escalation"));
39
- const metadata_1 = require("../escalations/metadata");
40
- const create_1 = require("../escalations/create");
41
- const claim_1 = require("../escalations/claim");
42
- const helpers_1 = require("../escalations/helpers");
38
+ const identity_1 = require("./identity");
39
+ const context_1 = require("./context");
40
+ const locate_1 = require("./locate");
41
+ const present_1 = require("./present");
42
+ const verbs_1 = require("./verbs");
43
43
  const types_1 = require("../../types");
44
44
  /**
45
45
  * Execute a raw scan code: parse → load the rule → walk its steps in order.
@@ -75,9 +75,36 @@ async function executeScanCode(input, auth) {
75
75
  },
76
76
  };
77
77
  }
78
+ // 2a. Identity schemes are the badge layer — they mint, never walk steps.
79
+ if (scheme.kind === types_1.SCAN_SCHEME_KINDS.IDENTITY) {
80
+ return (0, identity_1.executeIdentityScan)(parsed, scheme, rule, input.previousActingToken);
81
+ }
82
+ // 2b. A supplied acting grant is exchanged once, up front — the acting
83
+ // user's read scope must govern the locate as much as the mutation. A
84
+ // dead grant terminates loudly; silently degrading to the station
85
+ // identity would misattribute whatever follows.
86
+ let effectiveAuth = auth;
87
+ let acting = false;
88
+ if (input.actingToken) {
89
+ const resolved = await (0, identity_1.resolveActingAuth)(input.actingToken);
90
+ if (!resolved.ok) {
91
+ return {
92
+ status: 200,
93
+ data: {
94
+ outcome: types_1.SCAN_OUTCOMES.NOT_PRIMED,
95
+ parsed,
96
+ notPrimed: rule.notPrimed,
97
+ error: resolved.error,
98
+ },
99
+ };
100
+ }
101
+ effectiveAuth = resolved.auth;
102
+ acting = true;
103
+ }
78
104
  // 3. Walk the steps — first condition match wins
79
105
  const ctx = {
80
- scheme, rule, parsed, scannedAt: new Date().toISOString(), auth,
106
+ scheme, rule, parsed, scannedAt: new Date().toISOString(),
107
+ auth: effectiveAuth, stationAuth: auth, acting,
81
108
  };
82
109
  for (let i = 0; i < rule.steps.length; i++) {
83
110
  const result = await executeStep(rule.steps[i], i, ctx);
@@ -117,256 +144,34 @@ function decorateData(data, ctx) {
117
144
  * (fall through) and an LTApiResult for every terminal outcome.
118
145
  */
119
146
  async function executeStep(step, index, ctx) {
147
+ // The identity pre-condition: the effective actor must be a real acting
148
+ // identity — a badge grant, or an authenticated user whose own write scope
149
+ // covers the step. A write-incapable shared account can never self-satisfy,
150
+ // so the outcome is the rule's "scan your badge" screen, never a silent or
151
+ // misattributed action.
152
+ if (step.requireActingIdentity && !(await (0, identity_1.actingIdentitySatisfied)(step, ctx))) {
153
+ return (0, context_1.notPrimed)(ctx);
154
+ }
120
155
  // Confirm steps and read verbs only locate — mutation happens after the
121
156
  // user confirms, through the standard per-id endpoints.
122
157
  if (step.confirm || step.verb === types_1.SCAN_VERBS.SHOW_DETAIL || step.verb === types_1.SCAN_VERBS.SHOW_LIST) {
123
- return locateStep(step, ctx);
158
+ return (0, locate_1.locateStep)(step, ctx);
124
159
  }
125
160
  switch (step.verb) {
161
+ case types_1.SCAN_VERBS.PRESENT:
162
+ return (0, present_1.presentStep)(step, ctx);
126
163
  case types_1.SCAN_VERBS.CLAIM:
127
164
  case types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL:
128
- return claimStep(step, ctx);
165
+ return (0, verbs_1.claimStep)(step, ctx);
129
166
  case types_1.SCAN_VERBS.RESOLVE:
130
- return resolveStep(step, ctx);
167
+ return (0, verbs_1.resolveStep)(step, ctx);
131
168
  case types_1.SCAN_VERBS.ESCALATE:
132
- return escalateStep(step, ctx);
169
+ return (0, verbs_1.escalateStep)(step, ctx);
133
170
  case types_1.SCAN_VERBS.RELEASE:
134
- return releaseStep(step, ctx);
171
+ return (0, verbs_1.releaseStep)(step, ctx);
135
172
  case types_1.SCAN_VERBS.CANCEL:
136
- return cancelStep(step, ctx);
173
+ return (0, verbs_1.cancelStep)(step, ctx);
137
174
  default:
138
175
  throw new Error(`unknown scan verb "${step.verb}"`);
139
176
  }
140
177
  }
141
- // ── Shared pieces ──────────────────────────────────────────────────────────
142
- function targetFilter(step, ctx) {
143
- return { [ctx.scheme.target_facet]: ctx.parsed.target, ...(step.query?.facets ?? {}) };
144
- }
145
- function templateContext(ctx) {
146
- return { target: ctx.parsed.target, category: ctx.parsed.category, scannedAt: ctx.scannedAt };
147
- }
148
- function provenance(ctx) {
149
- return {
150
- [types_1.SCAN_PROVENANCE_KEYS.SCHEME]: ctx.scheme.version,
151
- [types_1.SCAN_PROVENANCE_KEYS.CATEGORY]: ctx.parsed.category,
152
- [types_1.SCAN_PROVENANCE_KEYS.ACTION_NAME]: ctx.rule.name,
153
- [types_1.SCAN_PROVENANCE_KEYS.SCANNED_AT]: ctx.scannedAt,
154
- };
155
- }
156
- function executed(escalation, step) {
157
- return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.EXECUTED, verb: step.verb, escalation } };
158
- }
159
- // ── Locate (show-detail, show-list, confirm phase 1) ───────────────────────
160
- async function locateStep(step, ctx) {
161
- const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
162
- const availability = step.query?.availability ?? types_1.SCAN_AVAILABILITY.ANY;
163
- const status = step.query?.status ?? 'pending';
164
- const wantMany = step.verb === types_1.SCAN_VERBS.SHOW_LIST
165
- || step.cardinality === types_1.SCAN_CARDINALITY.MANY;
166
- const limit = wantMany ? 50 : 2;
167
- const facets = targetFilter(step, ctx);
168
- let escalations;
169
- let total;
170
- if (availability === types_1.SCAN_AVAILABILITY.MINE) {
171
- // "mine" = assigned to the caller; self-scope roles qualify because the
172
- // assigned_to predicate satisfies their visibility branch.
173
- const readable = [...scope.allRoles, ...scope.selfRoles];
174
- const roles = (0, metadata_1.restrictScopeRoles)(readable, scope.global, step.query?.roles);
175
- if (roles !== null && roles.length === 0)
176
- return null;
177
- const result = await escalationService.listEscalations({
178
- metadata: facets,
179
- status,
180
- assigned_to: ctx.auth.userId,
181
- visibleRoles: roles ?? undefined,
182
- limit,
183
- });
184
- escalations = result.escalations;
185
- total = result.total;
186
- }
187
- else {
188
- const roles = (0, metadata_1.restrictScopeRoles)(scope.allRoles, scope.global, step.query?.roles);
189
- if (roles !== null && roles.length === 0)
190
- return null;
191
- const result = await escalationService.searchByFacets({
192
- roles: roles ?? undefined,
193
- facets,
194
- status,
195
- available: availability === types_1.SCAN_AVAILABILITY.AVAILABLE
196
- ? true
197
- : availability === types_1.SCAN_AVAILABILITY.CLAIMED ? false : undefined,
198
- limit,
199
- });
200
- escalations = result.escalations;
201
- total = result.total;
202
- }
203
- if (escalations.length === 0)
204
- return null;
205
- if (step.confirm) {
206
- const target = escalations[0];
207
- const interpolated = step.params
208
- ? scanCodeService.interpolateScanTemplate(step.params, templateContext(ctx))
209
- : undefined;
210
- return {
211
- status: 200,
212
- data: {
213
- outcome: types_1.SCAN_OUTCOMES.CONFIRM_REQUIRED,
214
- verb: step.verb,
215
- escalation: target,
216
- pendingAction: {
217
- escalationId: target.id,
218
- verb: step.verb,
219
- prompt: step.confirm.prompt,
220
- params: interpolated,
221
- },
222
- },
223
- };
224
- }
225
- if (wantMany) {
226
- return {
227
- status: 200,
228
- data: {
229
- outcome: types_1.SCAN_OUTCOMES.MATCHED_LIST,
230
- verb: step.verb,
231
- escalations,
232
- total,
233
- listQuery: {
234
- ...step.query,
235
- targetFacet: ctx.scheme.target_facet,
236
- target: ctx.parsed.target,
237
- },
238
- },
239
- };
240
- }
241
- return executed(escalations[0], step);
242
- }
243
- // ── Mutating verbs — each a single atomic operation under the caller's RBAC ─
244
- async function claimStep(step, ctx) {
245
- const result = await (0, metadata_1.claimByMetadata)({
246
- key: ctx.scheme.target_facet,
247
- value: ctx.parsed.target,
248
- durationMinutes: step.params?.durationMinutes,
249
- metadata: { ...interpolatedMetadata(step, ctx), ...provenance(ctx) },
250
- restrictRoles: step.query?.roles,
251
- }, ctx.auth);
252
- if (result.status === 404)
253
- return null;
254
- if (result.status === 403)
255
- return forbidden(result.error);
256
- if (result.status !== 200)
257
- return result;
258
- return executed(result.data.escalation, step);
259
- }
260
- async function resolveStep(step, ctx) {
261
- const result = await (0, metadata_1.resolveByMetadata)({
262
- key: ctx.scheme.target_facet,
263
- value: ctx.parsed.target,
264
- resolverPayload: scanCodeService.interpolateScanTemplate(step.params?.resolverPayload ?? {}, templateContext(ctx)),
265
- metadata: { ...interpolatedMetadata(step, ctx), ...provenance(ctx) },
266
- restrictRoles: step.query?.roles,
267
- extraFacets: step.query?.facets,
268
- }, ctx.auth);
269
- if (result.status === 404)
270
- return null;
271
- if (result.status === 403)
272
- return forbidden(result.error);
273
- if (result.status === 409)
274
- return conflict(result.error);
275
- if (result.status !== 200)
276
- return result;
277
- const escalation = result.data.escalation
278
- ?? (result.data.escalationId ? { id: result.data.escalationId } : undefined);
279
- return executed(escalation, step);
280
- }
281
- async function escalateStep(step, ctx) {
282
- // Close the located escalation first when configured — the close doubles as
283
- // the condition check AND the double-scan guard (second scan finds nothing
284
- // to close and falls through).
285
- if (step.params?.closeCurrent === 'resolve') {
286
- const closed = await resolveStep({ ...step, params: { ...step.params, resolverPayload: step.params?.resolverPayload ?? {} } }, ctx);
287
- if (closed === null)
288
- return null;
289
- if (closed.data?.outcome !== types_1.SCAN_OUTCOMES.EXECUTED)
290
- return closed;
291
- }
292
- else if (step.params?.closeCurrent === 'cancel') {
293
- const cancelled = await cancelStep(step, ctx);
294
- if (cancelled === null)
295
- return null;
296
- if (cancelled.data?.outcome !== types_1.SCAN_OUTCOMES.EXECUTED)
297
- return cancelled;
298
- }
299
- const created = await (0, create_1.createEscalation)({
300
- type: step.params?.escalationType ?? 'scan',
301
- role: step.params.targetRole,
302
- description: step.params?.description ?? ctx.rule.name,
303
- metadata: {
304
- [ctx.scheme.target_facet]: ctx.parsed.target,
305
- ...interpolatedMetadata(step, ctx),
306
- ...provenance(ctx),
307
- },
308
- }, ctx.auth);
309
- if (created.status === 403)
310
- return forbidden(created.error);
311
- if (created.status !== 201)
312
- return created;
313
- return executed(created.data, step);
314
- }
315
- async function releaseStep(step, ctx) {
316
- // Locate the caller's own claim; release-by-id re-asserts the assignee
317
- // inside the SDK, so a lost race resolves to 409, never a foreign release.
318
- const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
319
- const readable = [...scope.allRoles, ...scope.selfRoles];
320
- const roles = (0, metadata_1.restrictScopeRoles)(readable, scope.global, step.query?.roles);
321
- if (roles !== null && roles.length === 0)
322
- return null;
323
- const { escalations } = await escalationService.listEscalations({
324
- metadata: targetFilter(step, ctx),
325
- status: 'pending',
326
- assigned_to: ctx.auth.userId,
327
- visibleRoles: roles ?? undefined,
328
- limit: 1,
329
- });
330
- if (escalations.length === 0)
331
- return null;
332
- const result = await (0, claim_1.releaseEscalation)({ id: escalations[0].id }, ctx.auth);
333
- if (result.status === 403)
334
- return forbidden(result.error);
335
- if (result.status === 409)
336
- return conflict(result.error);
337
- if (result.status !== 200)
338
- return result;
339
- return executed(result.data.escalation, step);
340
- }
341
- async function cancelStep(step, ctx) {
342
- // Claim-as-lock: the atomic claim pins the row to this caller (or extends
343
- // their claim), serializing concurrent double-scans before the cancel.
344
- const claimed = await (0, metadata_1.claimByMetadata)({
345
- key: ctx.scheme.target_facet,
346
- value: ctx.parsed.target,
347
- metadata: provenance(ctx),
348
- restrictRoles: step.query?.roles,
349
- }, ctx.auth);
350
- if (claimed.status === 404)
351
- return null;
352
- if (claimed.status === 403)
353
- return forbidden(claimed.error);
354
- if (claimed.status !== 200)
355
- return claimed;
356
- const cancelled = await escalationService.cancelEscalation(claimed.data.escalation.id);
357
- if (!cancelled)
358
- return conflict('Escalation is not cancellable (already terminal)');
359
- return executed(cancelled, step);
360
- }
361
- // ── Small result helpers ───────────────────────────────────────────────────
362
- function interpolatedMetadata(step, ctx) {
363
- return step.params?.metadata
364
- ? scanCodeService.interpolateScanTemplate(step.params.metadata, templateContext(ctx))
365
- : {};
366
- }
367
- function forbidden(error) {
368
- return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.FORBIDDEN, error } };
369
- }
370
- function conflict(error) {
371
- return { status: 200, data: { outcome: types_1.SCAN_OUTCOMES.CONFLICT, error } };
372
- }
@@ -0,0 +1,18 @@
1
+ import { type ParsedScanCode, type ScanExecuteResponse, type ScanRule, type ScanScheme, type ScanStep } from '../../types';
2
+ import type { LTApiResult } from '../../types/sdk';
3
+ import type { StepContext } from './context';
4
+ export { resolveActingAuth, type ActingAuthResult } from '../../services/iam/acting-identity';
5
+ /**
6
+ * Resolve an identity scan: badge → user → minted acting grant.
7
+ * Identity schemes never walk steps; the rule's fallback is the
8
+ * unknown-badge screen.
9
+ */
10
+ export declare function executeIdentityScan(parsed: ParsedScanCode, scheme: ScanScheme, rule: ScanRule, previousActingToken?: string): Promise<LTApiResult<ScanExecuteResponse>>;
11
+ /**
12
+ * The identity pre-condition's satisfaction test. A primed grant always
13
+ * satisfies; without one, the authenticated user satisfies only when their
14
+ * OWN write scope covers the step's roles — their login IS a person identity
15
+ * with authority there. A write-incapable shared account can never
16
+ * self-satisfy.
17
+ */
18
+ export declare function actingIdentitySatisfied(step: Pick<ScanStep, 'query'>, ctx: StepContext): Promise<boolean>;
@@ -0,0 +1,116 @@
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.resolveActingAuth = void 0;
37
+ exports.executeIdentityScan = executeIdentityScan;
38
+ exports.actingIdentitySatisfied = actingIdentitySatisfied;
39
+ const userService = __importStar(require("../../services/user"));
40
+ const ephemeral_1 = require("../../services/iam/ephemeral");
41
+ const metadata_1 = require("../escalations/metadata");
42
+ const helpers_1 = require("../escalations/helpers");
43
+ const types_1 = require("../../types");
44
+ var acting_identity_1 = require("../../services/iam/acting-identity");
45
+ Object.defineProperty(exports, "resolveActingAuth", { enumerable: true, get: function () { return acting_identity_1.resolveActingAuth; } });
46
+ // ── Acting identity — the badge layer over the scan surface ────────────────
47
+ //
48
+ // A shared station device signs in as an ordinary read-capable account; the
49
+ // person supplies identity by scanning a badge under an identity-kind scheme.
50
+ // The badge token is an opaque printed credential resolved against a
51
+ // server-side binding (scheme.target_facet names the lt_users.metadata key it
52
+ // matches — never external_id, so a printed username can never impersonate).
53
+ // A match MINTS a grant through the ephemeral keystore: short-TTL, optionally
54
+ // n-use, useless unless exchanged server-side. The grant confers ATTRIBUTION,
55
+ // never privilege — verbs later run under the acting user's own live RBAC.
56
+ /**
57
+ * Resolve an identity scan: badge → user → minted acting grant.
58
+ * Identity schemes never walk steps; the rule's fallback is the
59
+ * unknown-badge screen.
60
+ */
61
+ async function executeIdentityScan(parsed, scheme, rule, previousActingToken) {
62
+ const user = await userService.getUserByMetadataValue(scheme.target_facet, parsed.target);
63
+ if (!user) {
64
+ return {
65
+ status: 200,
66
+ data: {
67
+ outcome: types_1.SCAN_OUTCOMES.IDENTITY_UNKNOWN,
68
+ parsed,
69
+ rule: { schemeVersion: rule.scheme_version, category: rule.category, name: rule.name },
70
+ fallback: rule.fallback,
71
+ error: 'badge not recognized',
72
+ },
73
+ };
74
+ }
75
+ // The station is swapping people — the outgoing grant dies now, not at TTL.
76
+ if (previousActingToken) {
77
+ const prev = (0, ephemeral_1.parseEphemeralToken)(previousActingToken);
78
+ if (prev && prev.label === types_1.ACTING_IDENTITY_LABEL) {
79
+ await (0, ephemeral_1.revokeEphemeral)(prev.uuid).catch(() => { });
80
+ }
81
+ }
82
+ const uuid = await (0, ephemeral_1.storeEphemeral)(user.id, {
83
+ ttlSeconds: scheme.grant_ttl_seconds ?? undefined,
84
+ maxUses: scheme.grant_max_uses,
85
+ label: types_1.ACTING_IDENTITY_LABEL,
86
+ });
87
+ const expiresAt = new Date(Date.now() + (scheme.grant_ttl_seconds ?? 0) * 1000).toISOString();
88
+ return {
89
+ status: 200,
90
+ data: {
91
+ outcome: types_1.SCAN_OUTCOMES.IDENTITY_PRIMED,
92
+ parsed,
93
+ rule: { schemeVersion: rule.scheme_version, category: rule.category, name: rule.name },
94
+ actor: { id: user.id, displayName: user.display_name || user.external_id },
95
+ actingToken: (0, ephemeral_1.formatEphemeralToken)(uuid, types_1.ACTING_IDENTITY_LABEL),
96
+ expiresAt,
97
+ },
98
+ };
99
+ }
100
+ /**
101
+ * The identity pre-condition's satisfaction test. A primed grant always
102
+ * satisfies; without one, the authenticated user satisfies only when their
103
+ * OWN write scope covers the step's roles — their login IS a person identity
104
+ * with authority there. A write-incapable shared account can never
105
+ * self-satisfy.
106
+ */
107
+ async function actingIdentitySatisfied(step, ctx) {
108
+ if (ctx.acting)
109
+ return true;
110
+ const scope = await (0, helpers_1.getEscalationWriteScope)(ctx.stationAuth.userId);
111
+ if (scope.global)
112
+ return true;
113
+ const writable = [...scope.allRoles, ...scope.selfRoles];
114
+ const roles = (0, metadata_1.restrictScopeRoles)(writable, scope.global, step.query?.roles);
115
+ return roles === null || roles.length > 0;
116
+ }
@@ -1,2 +1,4 @@
1
1
  export { executeScanCode } from './execute';
2
+ export { executeScanChoice } from './choice';
3
+ export { executeIdentityScan, resolveActingAuth } from './identity';
2
4
  export { listScanSchemes, getScanScheme, upsertScanScheme, deleteScanScheme, listScanRules, getScanRule, upsertScanRule, deleteScanRule, } from './config';
@@ -1,8 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.deleteScanRule = exports.upsertScanRule = exports.getScanRule = exports.listScanRules = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanScheme = exports.listScanSchemes = exports.executeScanCode = void 0;
3
+ exports.deleteScanRule = exports.upsertScanRule = exports.getScanRule = exports.listScanRules = exports.deleteScanScheme = exports.upsertScanScheme = exports.getScanScheme = exports.listScanSchemes = exports.resolveActingAuth = exports.executeIdentityScan = exports.executeScanChoice = exports.executeScanCode = void 0;
4
4
  var execute_1 = require("./execute");
5
5
  Object.defineProperty(exports, "executeScanCode", { enumerable: true, get: function () { return execute_1.executeScanCode; } });
6
+ var choice_1 = require("./choice");
7
+ Object.defineProperty(exports, "executeScanChoice", { enumerable: true, get: function () { return choice_1.executeScanChoice; } });
8
+ var identity_1 = require("./identity");
9
+ Object.defineProperty(exports, "executeIdentityScan", { enumerable: true, get: function () { return identity_1.executeIdentityScan; } });
10
+ Object.defineProperty(exports, "resolveActingAuth", { enumerable: true, get: function () { return identity_1.resolveActingAuth; } });
6
11
  var config_1 = require("./config");
7
12
  Object.defineProperty(exports, "listScanSchemes", { enumerable: true, get: function () { return config_1.listScanSchemes; } });
8
13
  Object.defineProperty(exports, "getScanScheme", { enumerable: true, get: function () { return config_1.getScanScheme; } });
@@ -0,0 +1,14 @@
1
+ import { type LTEscalationRecord, type ScanExecuteResponse, type ScanStep } from '../../types';
2
+ import type { LTApiResult } from '../../types/sdk';
3
+ import { type StepContext } from './context';
4
+ /**
5
+ * The scoped locate every read path shares: the scanned target pinned to the
6
+ * scheme's facet, the step's extra guards, and the EFFECTIVE actor's read
7
+ * scope. Returns null when the caller's scope leaves no roles to search.
8
+ */
9
+ export declare function locateForStep(step: ScanStep, ctx: StepContext, limit: number): Promise<{
10
+ escalations: LTEscalationRecord[];
11
+ total: number;
12
+ } | null>;
13
+ /** Locate for show-detail, show-list, and the confirm phase. */
14
+ export declare function locateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
@@ -0,0 +1,127 @@
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.locateForStep = locateForStep;
37
+ exports.locateStep = locateStep;
38
+ const scanCodeService = __importStar(require("../../services/scan-code"));
39
+ const escalationService = __importStar(require("../../services/escalation"));
40
+ const metadata_1 = require("../escalations/metadata");
41
+ const helpers_1 = require("../escalations/helpers");
42
+ const types_1 = require("../../types");
43
+ const context_1 = require("./context");
44
+ /**
45
+ * The scoped locate every read path shares: the scanned target pinned to the
46
+ * scheme's facet, the step's extra guards, and the EFFECTIVE actor's read
47
+ * scope. Returns null when the caller's scope leaves no roles to search.
48
+ */
49
+ async function locateForStep(step, ctx, limit) {
50
+ const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
51
+ const availability = step.query?.availability ?? types_1.SCAN_AVAILABILITY.ANY;
52
+ const status = step.query?.status ?? 'pending';
53
+ const facets = (0, context_1.targetFilter)(step, ctx);
54
+ if (availability === types_1.SCAN_AVAILABILITY.MINE) {
55
+ // "mine" = assigned to the caller; self-scope roles qualify because the
56
+ // assigned_to predicate satisfies their visibility branch.
57
+ const readable = [...scope.allRoles, ...scope.selfRoles];
58
+ const roles = (0, metadata_1.restrictScopeRoles)(readable, scope.global, step.query?.roles);
59
+ if (roles !== null && roles.length === 0)
60
+ return null;
61
+ return escalationService.listEscalations({
62
+ metadata: facets,
63
+ status,
64
+ assigned_to: ctx.auth.userId,
65
+ visibleRoles: roles ?? undefined,
66
+ limit,
67
+ });
68
+ }
69
+ const roles = (0, metadata_1.restrictScopeRoles)(scope.allRoles, scope.global, step.query?.roles);
70
+ if (roles !== null && roles.length === 0)
71
+ return null;
72
+ return escalationService.searchByFacets({
73
+ roles: roles ?? undefined,
74
+ facets,
75
+ status,
76
+ available: availability === types_1.SCAN_AVAILABILITY.AVAILABLE
77
+ ? true
78
+ : availability === types_1.SCAN_AVAILABILITY.CLAIMED ? false : undefined,
79
+ limit,
80
+ });
81
+ }
82
+ /** Locate for show-detail, show-list, and the confirm phase. */
83
+ async function locateStep(step, ctx) {
84
+ const wantMany = step.verb === types_1.SCAN_VERBS.SHOW_LIST
85
+ || step.cardinality === types_1.SCAN_CARDINALITY.MANY;
86
+ const result = await locateForStep(step, ctx, wantMany ? 50 : 2);
87
+ if (!result || result.escalations.length === 0)
88
+ return null;
89
+ const { escalations, total } = result;
90
+ if (step.confirm) {
91
+ const target = escalations[0];
92
+ const interpolated = step.params
93
+ ? scanCodeService.interpolateScanTemplate(step.params, (0, context_1.templateContext)(ctx))
94
+ : undefined;
95
+ return {
96
+ status: 200,
97
+ data: {
98
+ outcome: types_1.SCAN_OUTCOMES.CONFIRM_REQUIRED,
99
+ verb: step.verb,
100
+ escalation: target,
101
+ pendingAction: {
102
+ escalationId: target.id,
103
+ verb: step.verb,
104
+ prompt: step.confirm.prompt,
105
+ params: interpolated,
106
+ },
107
+ },
108
+ };
109
+ }
110
+ if (wantMany) {
111
+ return {
112
+ status: 200,
113
+ data: {
114
+ outcome: types_1.SCAN_OUTCOMES.MATCHED_LIST,
115
+ verb: step.verb,
116
+ escalations,
117
+ total,
118
+ listQuery: {
119
+ ...step.query,
120
+ targetFacet: ctx.scheme.target_facet,
121
+ target: ctx.parsed.target,
122
+ },
123
+ },
124
+ };
125
+ }
126
+ return (0, context_1.executed)(escalations[0], step);
127
+ }
@@ -0,0 +1,9 @@
1
+ import { type ScanExecuteResponse, type ScanStep } from '../../types';
2
+ import type { LTApiResult } from '../../types/sdk';
3
+ import type { StepContext } from './context';
4
+ /**
5
+ * Locate the target and present the step's choices. Choices whose identity
6
+ * requirement is unsatisfied come back withheld — the screen renders the
7
+ * rule's "scan your badge" affordance beside them instead of a dead button.
8
+ */
9
+ export declare function presentStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;