@hotmeshio/long-tail 0.10.10 → 0.10.13

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 (322) hide show
  1. package/build/api/escalations/list.d.ts +1 -0
  2. package/build/api/escalations/list.js +12 -4
  3. package/build/api/escalations/metadata.d.ts +11 -0
  4. package/build/api/escalations/metadata.js +27 -7
  5. package/build/api/roles.d.ts +2 -0
  6. package/build/api/roles.js +4 -0
  7. package/build/api/scan-codes/config.d.ts +22 -0
  8. package/build/api/scan-codes/config.js +136 -0
  9. package/build/api/scan-codes/execute.d.ts +9 -0
  10. package/build/api/scan-codes/execute.js +372 -0
  11. package/build/api/scan-codes/index.d.ts +2 -0
  12. package/build/api/scan-codes/index.js +14 -0
  13. package/build/lib/db/schemas/025_ops_home_default.sql +11 -0
  14. package/build/lib/db/schemas/026_scan_codes.sql +51 -0
  15. package/build/lib/db/schemas/027_scan_codes_reindex.sql +23 -0
  16. package/build/lib/events/system-events.js +4 -0
  17. package/build/modules/features.d.ts +17 -0
  18. package/build/modules/features.js +2 -0
  19. package/build/routes/escalations/list.js +1 -0
  20. package/build/routes/index.js +2 -0
  21. package/build/routes/scan-codes.d.ts +2 -0
  22. package/build/routes/scan-codes.js +138 -0
  23. package/build/sdk/index.d.ts +4 -0
  24. package/build/services/escalation/crud.d.ts +1 -1
  25. package/build/services/escalation/crud.js +4 -2
  26. package/build/services/escalation/queries.d.ts +1 -0
  27. package/build/services/escalation/queries.js +2 -0
  28. package/build/services/escalation/sql.d.ts +11 -6
  29. package/build/services/escalation/sql.js +20 -20
  30. package/build/services/role/index.js +1 -0
  31. package/build/services/role/sql.d.ts +6 -2
  32. package/build/services/role/sql.js +11 -2
  33. package/build/services/role/types.d.ts +9 -0
  34. package/build/services/scan-code/index.d.ts +4 -0
  35. package/build/services/scan-code/index.js +21 -0
  36. package/build/services/scan-code/parse.d.ts +35 -0
  37. package/build/services/scan-code/parse.js +108 -0
  38. package/build/services/scan-code/read.d.ts +5 -0
  39. package/build/services/scan-code/read.js +50 -0
  40. package/build/services/scan-code/sql.d.ts +10 -0
  41. package/build/services/scan-code/sql.js +57 -0
  42. package/build/services/scan-code/validate.d.ts +12 -0
  43. package/build/services/scan-code/validate.js +78 -0
  44. package/build/services/scan-code/write.d.ts +26 -0
  45. package/build/services/scan-code/write.js +71 -0
  46. package/build/shared/form-validation/index.d.ts +1 -0
  47. package/build/shared/form-validation/index.js +1 -0
  48. package/build/shared/form-validation/x-lt-transition.d.ts +47 -0
  49. package/build/shared/form-validation/x-lt-transition.js +65 -0
  50. package/build/system/mcp-servers/admin/index.d.ts +1 -0
  51. package/build/system/mcp-servers/admin/index.js +5 -2
  52. package/build/system/mcp-servers/admin/scan-codes.d.ts +10 -0
  53. package/build/system/mcp-servers/admin/scan-codes.js +111 -0
  54. package/build/system/mcp-servers/admin/schemas.d.ts +235 -14
  55. package/build/system/mcp-servers/admin/schemas.js +51 -0
  56. package/build/system/mcp-servers/admin/users.js +1 -0
  57. package/build/system/seed/tool-manifests-admin.d.ts +1462 -0
  58. package/build/system/seed/tool-manifests-admin.js +7 -1
  59. package/build/tsconfig.tsbuildinfo +1 -1
  60. package/build/types/events.d.ts +9 -0
  61. package/build/types/index.d.ts +2 -0
  62. package/build/types/index.js +10 -1
  63. package/build/types/scan-code.d.ts +183 -0
  64. package/build/types/scan-code.js +80 -0
  65. package/build/types/startup.d.ts +14 -0
  66. package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js → AdminDashboard-Bv3pHBzn.js} +2 -2
  67. package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js.map → AdminDashboard-Bv3pHBzn.js.map} +1 -1
  68. package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js → AgentConfigPage-Dk2zlvDb.js} +6 -6
  69. package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js.map → AgentConfigPage-Dk2zlvDb.js.map} +1 -1
  70. package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js → AgentDetailPage-DUno6EGs.js} +2 -2
  71. package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js.map → AgentDetailPage-DUno6EGs.js.map} +1 -1
  72. package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js → AgentsPage-CToVu1qj.js} +2 -2
  73. package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js.map → AgentsPage-CToVu1qj.js.map} +1 -1
  74. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js → AutoGrowTextarea-DgEQeRQw.js} +2 -2
  75. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js.map → AutoGrowTextarea-DgEQeRQw.js.map} +1 -1
  76. package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js +2 -0
  77. package/dashboard/dist/assets/AvailableEscalationsPage-DldboL4W.js.map +1 -0
  78. package/dashboard/dist/assets/BotPicker-DQOpVB4M.js +2 -0
  79. package/dashboard/dist/assets/{BotPicker-Dohv8dhR.js.map → BotPicker-DQOpVB4M.js.map} +1 -1
  80. package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js → CapabilitiesPage-Dmf46PUJ.js} +2 -2
  81. package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js.map → CapabilitiesPage-Dmf46PUJ.js.map} +1 -1
  82. package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js → CollapsibleSection-CDADefUY.js} +2 -2
  83. package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js.map → CollapsibleSection-CDADefUY.js.map} +1 -1
  84. package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js → ConfirmDeleteModal-CQsJUzEa.js} +2 -2
  85. package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js.map → ConfirmDeleteModal-CQsJUzEa.js.map} +1 -1
  86. package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js → CopyableId-4Lqlc5cU.js} +2 -2
  87. package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js.map → CopyableId-4Lqlc5cU.js.map} +1 -1
  88. package/dashboard/dist/assets/CountdownTimer-DPjIkerB.js +2 -0
  89. package/dashboard/dist/assets/{CountdownTimer-BF71ldGF.js.map → CountdownTimer-DPjIkerB.js.map} +1 -1
  90. package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js → CredentialsPage-8LIEvomi.js} +2 -2
  91. package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js.map → CredentialsPage-8LIEvomi.js.map} +1 -1
  92. package/dashboard/dist/assets/{CronLabel-CebR1m2k.js → CronLabel-CK3WSsM5.js} +2 -2
  93. package/dashboard/dist/assets/{CronLabel-CebR1m2k.js.map → CronLabel-CK3WSsM5.js.map} +1 -1
  94. package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js → CustomDurationPicker-FPmlA6cE.js} +2 -2
  95. package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js.map → CustomDurationPicker-FPmlA6cE.js.map} +1 -1
  96. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js → DataTable-Bir0Xs1p.js} +2 -2
  97. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js.map → DataTable-Bir0Xs1p.js.map} +1 -1
  98. package/dashboard/dist/assets/{DropZone-Bavzt2QR.js → DropZone-CL9gA7pu.js} +2 -2
  99. package/dashboard/dist/assets/{DropZone-Bavzt2QR.js.map → DropZone-CL9gA7pu.js.map} +1 -1
  100. package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js → ElapsedCell-BZVkVxE0.js} +2 -2
  101. package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js.map → ElapsedCell-BZVkVxE0.js.map} +1 -1
  102. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js → EmptyState-lpUFYfun.js} +2 -2
  103. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-lpUFYfun.js.map} +1 -1
  104. package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js → EscalationListSchemaPage-kYLdUtZX.js} +3 -3
  105. package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js.map → EscalationListSchemaPage-kYLdUtZX.js.map} +1 -1
  106. package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js → EscalationSchemaPage-kUmCDivo.js} +3 -3
  107. package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js.map → EscalationSchemaPage-kUmCDivo.js.map} +1 -1
  108. package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js → EscalationsOverview-D17auO-m.js} +2 -2
  109. package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js.map → EscalationsOverview-D17auO-m.js.map} +1 -1
  110. package/dashboard/dist/assets/{EventTable-4JeTcXr_.js → EventTable-CwPWl163.js} +2 -2
  111. package/dashboard/dist/assets/{EventTable-4JeTcXr_.js.map → EventTable-CwPWl163.js.map} +1 -1
  112. package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js → FilterBar-D7GghUsU.js} +2 -2
  113. package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js.map → FilterBar-D7GghUsU.js.map} +1 -1
  114. package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js → GraphInvokePage-D11uOnZi.js} +2 -2
  115. package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js.map → GraphInvokePage-D11uOnZi.js.map} +1 -1
  116. package/dashboard/dist/assets/HomePage-Bcq10Bxx.js +2 -0
  117. package/dashboard/dist/assets/HomePage-Bcq10Bxx.js.map +1 -0
  118. package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js +2 -0
  119. package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js.map +1 -0
  120. package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js → McpOverview-Dx2j0KkF.js} +2 -2
  121. package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js.map → McpOverview-Dx2j0KkF.js.map} +1 -1
  122. package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js → McpQueryDetailPage-CzF_bna8.js} +3 -3
  123. package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js.map → McpQueryDetailPage-CzF_bna8.js.map} +1 -1
  124. package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js → McpQueryPage-CNsuiw_q.js} +2 -2
  125. package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js.map → McpQueryPage-CNsuiw_q.js.map} +1 -1
  126. package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js → McpRunDetailPage-BJguEMS0.js} +2 -2
  127. package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js.map → McpRunDetailPage-BJguEMS0.js.map} +1 -1
  128. package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js → McpRunsPage-CK96s3Nt.js} +2 -2
  129. package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js.map → McpRunsPage-CK96s3Nt.js.map} +1 -1
  130. package/dashboard/dist/assets/{Modal-CA2Iv02H.js → Modal-BU7No9NH.js} +2 -2
  131. package/dashboard/dist/assets/{Modal-CA2Iv02H.js.map → Modal-BU7No9NH.js.map} +1 -1
  132. package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js → NamespacePill-B9Vc_Pz2.js} +2 -2
  133. package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js.map → NamespacePill-B9Vc_Pz2.js.map} +1 -1
  134. package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js +2 -0
  135. package/dashboard/dist/assets/OperationsPage-DvWrLuH6.js.map +1 -0
  136. package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js +2 -0
  137. package/dashboard/dist/assets/OperatorDashboard-C-jE0IRA.js.map +1 -0
  138. package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js → PageHeader-Ce4GcIYo.js} +2 -2
  139. package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js.map → PageHeader-Ce4GcIYo.js.map} +1 -1
  140. package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js → PageHeaderWithStats-Ck0KZvXD.js} +2 -2
  141. package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js.map → PageHeaderWithStats-Ck0KZvXD.js.map} +1 -1
  142. package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js → PersonaDetailPage-CJ6jqo7h.js} +2 -2
  143. package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js.map → PersonaDetailPage-CJ6jqo7h.js.map} +1 -1
  144. package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js → PersonasPage-D8hL3kL5.js} +2 -2
  145. package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js.map → PersonasPage-D8hL3kL5.js.map} +1 -1
  146. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js → PriorityBadge-BETdj4M-.js} +2 -2
  147. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js.map → PriorityBadge-BETdj4M-.js.map} +1 -1
  148. package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js → ProcessDetailPage-Vnx8Z5_y.js} +2 -2
  149. package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js.map → ProcessDetailPage-Vnx8Z5_y.js.map} +1 -1
  150. package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js → ProcessesListPage-DRYtvS3N.js} +2 -2
  151. package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js.map → ProcessesListPage-DRYtvS3N.js.map} +1 -1
  152. package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js +8 -0
  153. package/dashboard/dist/assets/RoleDetailPage-BKkUvTO-.js.map +1 -0
  154. package/dashboard/dist/assets/{RolePill-TySZq7dB.js → RolePill-CnuBPhPw.js} +2 -2
  155. package/dashboard/dist/assets/{RolePill-TySZq7dB.js.map → RolePill-CnuBPhPw.js.map} +1 -1
  156. package/dashboard/dist/assets/RolesPage-BHzWK9n6.js +2 -0
  157. package/dashboard/dist/assets/{RolesPage-CNueMVuJ.js.map → RolesPage-BHzWK9n6.js.map} +1 -1
  158. package/dashboard/dist/assets/{RowActions-BA9L9djf.js → RowActions-eYrzgQSj.js} +2 -2
  159. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions-eYrzgQSj.js.map} +1 -1
  160. package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js → RunAsSelector-CS3KQ-BF.js} +2 -2
  161. package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js.map → RunAsSelector-CS3KQ-BF.js.map} +1 -1
  162. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js +2 -0
  163. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js.map +1 -0
  164. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js +2 -0
  165. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js.map +1 -0
  166. package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js → ScopeBadge-BUpYpS3x.js} +2 -2
  167. package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js.map → ScopeBadge-BUpYpS3x.js.map} +1 -1
  168. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js → StatCard-BXQ8dD9Y.js} +2 -2
  169. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js.map → StatCard-BXQ8dD9Y.js.map} +1 -1
  170. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js → StatusBadge-DkgllZHv.js} +2 -2
  171. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js.map → StatusBadge-DkgllZHv.js.map} +1 -1
  172. package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js → StickyPagination-hMrnLXde.js} +2 -2
  173. package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js.map → StickyPagination-hMrnLXde.js.map} +1 -1
  174. package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js → StreamMessageDetail-DyJyZwBl.js} +2 -2
  175. package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js.map → StreamMessageDetail-DyJyZwBl.js.map} +1 -1
  176. package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js → SwimlaneTimeline-BlzV74V5.js} +2 -2
  177. package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js.map → SwimlaneTimeline-BlzV74V5.js.map} +1 -1
  178. package/dashboard/dist/assets/{TagInput-D8gSp48D.js → TagInput-BbZ25nNe.js} +2 -2
  179. package/dashboard/dist/assets/{TagInput-D8gSp48D.js.map → TagInput-BbZ25nNe.js.map} +1 -1
  180. package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js → TaskDetailPage-B0p_Z4J_.js} +2 -2
  181. package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js.map → TaskDetailPage-B0p_Z4J_.js.map} +1 -1
  182. package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js → TaskQueuePill-D0QKBrN3.js} +2 -2
  183. package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js.map → TaskQueuePill-D0QKBrN3.js.map} +1 -1
  184. package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js → TasksListPage-CiGR2QiQ.js} +2 -2
  185. package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js.map → TasksListPage-CiGR2QiQ.js.map} +1 -1
  186. package/dashboard/dist/assets/TimeAgo-D_DA9ucC.js +2 -0
  187. package/dashboard/dist/assets/{TimeAgo-CInx-vzY.js.map → TimeAgo-D_DA9ucC.js.map} +1 -1
  188. package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js → TimestampCell-C7rkC9nh.js} +2 -2
  189. package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js.map → TimestampCell-C7rkC9nh.js.map} +1 -1
  190. package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js → ToolPill-8xY9rkoc.js} +2 -2
  191. package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js.map → ToolPill-8xY9rkoc.js.map} +1 -1
  192. package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js → ToolTestPanel-E8efYGYs.js} +2 -2
  193. package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js.map → ToolTestPanel-E8efYGYs.js.map} +1 -1
  194. package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js → TopicDetailPage-B455XrRc.js} +3 -3
  195. package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js.map → TopicDetailPage-B455XrRc.js.map} +1 -1
  196. package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js → TopicsPage-1VAc29Qw.js} +2 -2
  197. package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js.map → TopicsPage-1VAc29Qw.js.map} +1 -1
  198. package/dashboard/dist/assets/UserName-DikzjQHJ.js +2 -0
  199. package/dashboard/dist/assets/{UserName-DggcLkSc.js.map → UserName-DikzjQHJ.js.map} +1 -1
  200. package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js → WorkflowExecutionPage-C15GSAoe.js} +2 -2
  201. package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js.map → WorkflowExecutionPage-C15GSAoe.js.map} +1 -1
  202. package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js → WorkflowPill-Da406nEj.js} +2 -2
  203. package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js.map → WorkflowPill-Da406nEj.js.map} +1 -1
  204. package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js → WorkflowsDashboard-BMQd_0tW.js} +2 -2
  205. package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js.map → WorkflowsDashboard-BMQd_0tW.js.map} +1 -1
  206. package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js → WorkflowsOverview-CdxjVifp.js} +2 -2
  207. package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js.map → WorkflowsOverview-CdxjVifp.js.map} +1 -1
  208. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js → YamlWorkflowDetailPage-DNVffIXa.js} +13 -13
  209. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js.map → YamlWorkflowDetailPage-DNVffIXa.js.map} +1 -1
  210. package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js → YamlWorkflowsPage-BGP8wuos.js} +2 -2
  211. package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js.map → YamlWorkflowsPage-BGP8wuos.js.map} +1 -1
  212. package/dashboard/dist/assets/{agents-mRV7m4sh.js → agents-BZJLIJ4h.js} +2 -2
  213. package/dashboard/dist/assets/{agents-mRV7m4sh.js.map → agents-BZJLIJ4h.js.map} +1 -1
  214. package/dashboard/dist/assets/{bots-SONCZlCM.js → bots-ClLcDGJb.js} +2 -2
  215. package/dashboard/dist/assets/{bots-SONCZlCM.js.map → bots-ClLcDGJb.js.map} +1 -1
  216. package/dashboard/dist/assets/capabilities-IaCcS7ge.js +2 -0
  217. package/dashboard/dist/assets/{capabilities-DZjCMN32.js.map → capabilities-IaCcS7ge.js.map} +1 -1
  218. package/dashboard/dist/assets/{controlplane-RQNXjna2.js → controlplane-Zi4m_MSx.js} +2 -2
  219. package/dashboard/dist/assets/{controlplane-RQNXjna2.js.map → controlplane-Zi4m_MSx.js.map} +1 -1
  220. package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js +2 -0
  221. package/dashboard/dist/assets/escalation-columns-BY2mg9DY.js.map +1 -0
  222. package/dashboard/dist/assets/{index-ymm58cTW.js → index-BqGnhkh0.js} +2 -2
  223. package/dashboard/dist/assets/{index-ymm58cTW.js.map → index-BqGnhkh0.js.map} +1 -1
  224. package/dashboard/dist/assets/index-BzkE48xJ.js +6 -0
  225. package/dashboard/dist/assets/index-BzkE48xJ.js.map +1 -0
  226. package/dashboard/dist/assets/{index-CkeSxuZ0.js → index-C3o4OisO.js} +2 -2
  227. package/dashboard/dist/assets/{index-CkeSxuZ0.js.map → index-C3o4OisO.js.map} +1 -1
  228. package/dashboard/dist/assets/{index-DY_hlZCQ.js → index-CJu2PBNx.js} +2 -2
  229. package/dashboard/dist/assets/{index-DY_hlZCQ.js.map → index-CJu2PBNx.js.map} +1 -1
  230. package/dashboard/dist/assets/{index-DYKRtstT.js → index-CLmZaNTK.js} +2 -2
  231. package/dashboard/dist/assets/{index-DYKRtstT.js.map → index-CLmZaNTK.js.map} +1 -1
  232. package/dashboard/dist/assets/index-CfAi1OsI.js +65 -0
  233. package/dashboard/dist/assets/index-CfAi1OsI.js.map +1 -0
  234. package/dashboard/dist/assets/{index-CK-6m8e_.js → index-CmnNqpWg.js} +2 -2
  235. package/dashboard/dist/assets/{index-CK-6m8e_.js.map → index-CmnNqpWg.js.map} +1 -1
  236. package/dashboard/dist/assets/{index-DFJF8aWz.js → index-CvNBdkB1.js} +3 -3
  237. package/dashboard/dist/assets/{index-DFJF8aWz.js.map → index-CvNBdkB1.js.map} +1 -1
  238. package/dashboard/dist/assets/{index-DbZpL10z.js → index-D0zFReGL.js} +2 -2
  239. package/dashboard/dist/assets/{index-DbZpL10z.js.map → index-D0zFReGL.js.map} +1 -1
  240. package/dashboard/dist/assets/{index-C6GsrvX1.js → index-Dldi3Q3M.js} +2 -2
  241. package/dashboard/dist/assets/{index-C6GsrvX1.js.map → index-Dldi3Q3M.js.map} +1 -1
  242. package/dashboard/dist/assets/{index-DqsLfO-0.js → index-kiKZresb.js} +2 -2
  243. package/dashboard/dist/assets/{index-DqsLfO-0.js.map → index-kiKZresb.js.map} +1 -1
  244. package/dashboard/dist/assets/index-mKcQGi2B.js +3 -0
  245. package/dashboard/dist/assets/index-mKcQGi2B.js.map +1 -0
  246. package/dashboard/dist/assets/{index-CxVGlkK6.js → index-yGNt29V9.js} +2 -2
  247. package/dashboard/dist/assets/{index-CxVGlkK6.js.map → index-yGNt29V9.js.map} +1 -1
  248. package/dashboard/dist/assets/index-zQiUPfxA.css +1 -0
  249. package/dashboard/dist/assets/{knowledge-Bawo8u7l.js → knowledge-DWLxGTib.js} +2 -2
  250. package/dashboard/dist/assets/{knowledge-Bawo8u7l.js.map → knowledge-DWLxGTib.js.map} +1 -1
  251. package/dashboard/dist/assets/{mcp-CKIpbpRZ.js → mcp-B6AARZ2I.js} +2 -2
  252. package/dashboard/dist/assets/{mcp-CKIpbpRZ.js.map → mcp-B6AARZ2I.js.map} +1 -1
  253. package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js → mcp-query-DrkvBU3a.js} +2 -2
  254. package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js.map → mcp-query-DrkvBU3a.js.map} +1 -1
  255. package/dashboard/dist/assets/{personas-BsARc3df.js → personas-Cmz2SAEU.js} +2 -2
  256. package/dashboard/dist/assets/{personas-BsARc3df.js.map → personas-Cmz2SAEU.js.map} +1 -1
  257. package/dashboard/dist/assets/{pipelines-BTSL-5ko.js → pipelines-CSgfVCMy.js} +2 -2
  258. package/dashboard/dist/assets/{pipelines-BTSL-5ko.js.map → pipelines-CSgfVCMy.js.map} +1 -1
  259. package/dashboard/dist/assets/{tasks-DggQdNbj.js → tasks-UOtUkDk-.js} +2 -2
  260. package/dashboard/dist/assets/{tasks-DggQdNbj.js.map → tasks-UOtUkDk-.js.map} +1 -1
  261. package/dashboard/dist/assets/{topics-DzAKa34X.js → topics-Df5hGh6o.js} +2 -2
  262. package/dashboard/dist/assets/{topics-DzAKa34X.js.map → topics-Df5hGh6o.js.map} +1 -1
  263. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-C4P2jQuh.js} +2 -2
  264. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-C4P2jQuh.js.map} +1 -1
  265. package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js → useEventHooks-PDbuSJ12.js} +2 -2
  266. package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js.map → useEventHooks-PDbuSJ12.js.map} +1 -1
  267. package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js → useFilterParams-crmlBw_l.js} +2 -2
  268. package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js.map → useFilterParams-crmlBw_l.js.map} +1 -1
  269. package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js → useNamespace-tZSOlge3.js} +2 -2
  270. package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js.map → useNamespace-tZSOlge3.js.map} +1 -1
  271. package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js → useYamlActivityEvents-CINLzE32.js} +2 -2
  272. package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js.map → useYamlActivityEvents-CINLzE32.js.map} +1 -1
  273. package/dashboard/dist/assets/{users-AO8lUyNr.js → users-G8qwyZKS.js} +2 -2
  274. package/dashboard/dist/assets/{users-AO8lUyNr.js.map → users-G8qwyZKS.js.map} +1 -1
  275. package/dashboard/dist/assets/{vendor-icons-DN9yGSuM.js → vendor-icons-BpZiWH2f.js} +40 -40
  276. package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +1 -0
  277. package/dashboard/dist/assets/{vendor-query-B2UbickB.js → vendor-query-RUZdMvN6.js} +2 -2
  278. package/dashboard/dist/assets/{vendor-query-B2UbickB.js.map → vendor-query-RUZdMvN6.js.map} +1 -1
  279. package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js → vendor-react-CdqEC2zv.js} +3 -3
  280. package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js.map → vendor-react-CdqEC2zv.js.map} +1 -1
  281. package/dashboard/dist/assets/{workflows-PtnlRK09.js → workflows-DbPqi1TW.js} +2 -2
  282. package/dashboard/dist/assets/{workflows-PtnlRK09.js.map → workflows-DbPqi1TW.js.map} +1 -1
  283. package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js → yaml-workflows-DozD8hpR.js} +2 -2
  284. package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js.map → yaml-workflows-DozD8hpR.js.map} +1 -1
  285. package/dashboard/dist/index.html +5 -5
  286. package/docs/dashboard.md +9 -2
  287. package/docs/design-principles.md +4 -0
  288. package/docs/hitl/pinned-views.md +3 -3
  289. package/docs/hitl/x-lt-transition.md +105 -0
  290. package/docs/operations.md +1 -1
  291. package/docs/scan-codes.md +243 -0
  292. package/package.json +2 -2
  293. package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js +0 -2
  294. package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js.map +0 -1
  295. package/dashboard/dist/assets/BotPicker-Dohv8dhR.js +0 -2
  296. package/dashboard/dist/assets/CountdownTimer-BF71ldGF.js +0 -2
  297. package/dashboard/dist/assets/HomePage-HPCd8SjF.js +0 -2
  298. package/dashboard/dist/assets/HomePage-HPCd8SjF.js.map +0 -1
  299. package/dashboard/dist/assets/ListToolbar-BFHVOba6.js +0 -2
  300. package/dashboard/dist/assets/ListToolbar-BFHVOba6.js.map +0 -1
  301. package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js +0 -2
  302. package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js.map +0 -1
  303. package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js +0 -2
  304. package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js.map +0 -1
  305. package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js +0 -8
  306. package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js.map +0 -1
  307. package/dashboard/dist/assets/RolesPage-CNueMVuJ.js +0 -2
  308. package/dashboard/dist/assets/TimeAgo-CInx-vzY.js +0 -2
  309. package/dashboard/dist/assets/UserName-DggcLkSc.js +0 -2
  310. package/dashboard/dist/assets/capabilities-DZjCMN32.js +0 -2
  311. package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js +0 -2
  312. package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js.map +0 -1
  313. package/dashboard/dist/assets/index-2BwHxjCw.css +0 -1
  314. package/dashboard/dist/assets/index-D2CfSx_x.js +0 -5
  315. package/dashboard/dist/assets/index-D2CfSx_x.js.map +0 -1
  316. package/dashboard/dist/assets/index-Dh3CVChT.js +0 -63
  317. package/dashboard/dist/assets/index-Dh3CVChT.js.map +0 -1
  318. package/dashboard/dist/assets/index-iHV3d7o3.js +0 -6
  319. package/dashboard/dist/assets/index-iHV3d7o3.js.map +0 -1
  320. package/dashboard/dist/assets/role-display-Dvo2lDpU.js +0 -2
  321. package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +0 -1
  322. package/dashboard/dist/assets/vendor-icons-DN9yGSuM.js.map +0 -1
@@ -0,0 +1,372 @@
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.executeScanCode = executeScanCode;
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");
43
+ const types_1 = require("../../types");
44
+ /**
45
+ * Execute a raw scan code: parse → load the rule → walk its steps in order.
46
+ * The first step whose condition matches performs its verb and answers; a
47
+ * step that matches nothing falls through to the next. Every terminal state
48
+ * is a structured 200 outcome — the scan surface reports, it doesn't throw.
49
+ */
50
+ async function executeScanCode(input, auth) {
51
+ try {
52
+ if (!input.code || typeof input.code !== 'string') {
53
+ return { status: 400, error: 'code is required' };
54
+ }
55
+ // 1. Parse against the configured schemes
56
+ const schemes = await scanCodeService.listScanSchemes();
57
+ const parseResult = scanCodeService.parseScanCode(input.code, schemes);
58
+ if (!parseResult.ok) {
59
+ const { reason, detail } = parseResult.failure;
60
+ const outcome = reason === 'unknown_version' || reason === 'scheme_disabled'
61
+ ? types_1.SCAN_OUTCOMES.UNCONFIGURED
62
+ : types_1.SCAN_OUTCOMES.INVALID_CODE;
63
+ return { status: 200, data: { outcome, error: detail } };
64
+ }
65
+ const { parsed, scheme } = parseResult;
66
+ // 2. Load the rule for this category
67
+ const rule = await scanCodeService.getScanRule(parsed.version, parsed.category);
68
+ if (!rule || !rule.enabled) {
69
+ return {
70
+ status: 200,
71
+ data: {
72
+ outcome: types_1.SCAN_OUTCOMES.UNCONFIGURED,
73
+ parsed,
74
+ error: `no scan rule configured for ${parsed.version}:${parsed.category}`,
75
+ },
76
+ };
77
+ }
78
+ // 3. Walk the steps — first condition match wins
79
+ const ctx = {
80
+ scheme, rule, parsed, scannedAt: new Date().toISOString(), auth,
81
+ };
82
+ for (let i = 0; i < rule.steps.length; i++) {
83
+ const result = await executeStep(rule.steps[i], i, ctx);
84
+ if (result)
85
+ return decorate(result, ctx, i);
86
+ }
87
+ // 4. Nothing matched — the fallback screen is the answer
88
+ return {
89
+ status: 200,
90
+ data: decorateData({ outcome: types_1.SCAN_OUTCOMES.NO_MATCH_FALLBACK, fallback: rule.fallback }, ctx),
91
+ };
92
+ }
93
+ catch (err) {
94
+ return { status: 500, error: err.message };
95
+ }
96
+ }
97
+ /** Stamp rule identity + parsed code onto a step result. */
98
+ function decorate(result, ctx, stepIndex) {
99
+ if (result.data && typeof result.data === 'object' && 'outcome' in result.data) {
100
+ result.data = { ...decorateData(result.data, ctx), stepIndex };
101
+ }
102
+ return result;
103
+ }
104
+ function decorateData(data, ctx) {
105
+ return {
106
+ ...data,
107
+ parsed: ctx.parsed,
108
+ rule: {
109
+ schemeVersion: ctx.rule.scheme_version,
110
+ category: ctx.rule.category,
111
+ name: ctx.rule.name,
112
+ },
113
+ };
114
+ }
115
+ /**
116
+ * Execute one step. Returns null when the step's condition matched nothing
117
+ * (fall through) and an LTApiResult for every terminal outcome.
118
+ */
119
+ async function executeStep(step, index, ctx) {
120
+ // Confirm steps and read verbs only locate — mutation happens after the
121
+ // user confirms, through the standard per-id endpoints.
122
+ if (step.confirm || step.verb === types_1.SCAN_VERBS.SHOW_DETAIL || step.verb === types_1.SCAN_VERBS.SHOW_LIST) {
123
+ return locateStep(step, ctx);
124
+ }
125
+ switch (step.verb) {
126
+ case types_1.SCAN_VERBS.CLAIM:
127
+ case types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL:
128
+ return claimStep(step, ctx);
129
+ case types_1.SCAN_VERBS.RESOLVE:
130
+ return resolveStep(step, ctx);
131
+ case types_1.SCAN_VERBS.ESCALATE:
132
+ return escalateStep(step, ctx);
133
+ case types_1.SCAN_VERBS.RELEASE:
134
+ return releaseStep(step, ctx);
135
+ case types_1.SCAN_VERBS.CANCEL:
136
+ return cancelStep(step, ctx);
137
+ default:
138
+ throw new Error(`unknown scan verb "${step.verb}"`);
139
+ }
140
+ }
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,2 @@
1
+ export { executeScanCode } from './execute';
2
+ export { listScanSchemes, getScanScheme, upsertScanScheme, deleteScanScheme, listScanRules, getScanRule, upsertScanRule, deleteScanRule, } from './config';
@@ -0,0 +1,14 @@
1
+ "use strict";
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;
4
+ var execute_1 = require("./execute");
5
+ Object.defineProperty(exports, "executeScanCode", { enumerable: true, get: function () { return execute_1.executeScanCode; } });
6
+ var config_1 = require("./config");
7
+ Object.defineProperty(exports, "listScanSchemes", { enumerable: true, get: function () { return config_1.listScanSchemes; } });
8
+ Object.defineProperty(exports, "getScanScheme", { enumerable: true, get: function () { return config_1.getScanScheme; } });
9
+ Object.defineProperty(exports, "upsertScanScheme", { enumerable: true, get: function () { return config_1.upsertScanScheme; } });
10
+ Object.defineProperty(exports, "deleteScanScheme", { enumerable: true, get: function () { return config_1.deleteScanScheme; } });
11
+ Object.defineProperty(exports, "listScanRules", { enumerable: true, get: function () { return config_1.listScanRules; } });
12
+ Object.defineProperty(exports, "getScanRule", { enumerable: true, get: function () { return config_1.getScanRule; } });
13
+ Object.defineProperty(exports, "upsertScanRule", { enumerable: true, get: function () { return config_1.upsertScanRule; } });
14
+ Object.defineProperty(exports, "deleteScanRule", { enumerable: true, get: function () { return config_1.deleteScanRule; } });
@@ -0,0 +1,11 @@
1
+ -- Migration 025: Home Pace Board default segment
2
+ --
3
+ -- ops_home_default marks the role whose sequence leads the HOME page's Pace
4
+ -- Board. The board's full view lives on /operations; the home embed shows one
5
+ -- segment, and this flag lets an operator pick which one — a subordinate
6
+ -- setting under ops_visible on Role Detail. Single-holder: setting it on one
7
+ -- role clears it everywhere else in the same atomic statement. When no role
8
+ -- carries it, the home board falls back to the primary (first) segment.
9
+
10
+ ALTER TABLE lt_roles
11
+ ADD COLUMN IF NOT EXISTS ops_home_default BOOLEAN NOT NULL DEFAULT false;
@@ -0,0 +1,51 @@
1
+ -- Migration 026: Scan-code schemes and rules
2
+ --
3
+ -- A scan code arrives from a physical input source (barcode scanner, RFID
4
+ -- reader, manual entry) as a plain string encoding version:category:target.
5
+ -- The leading digit (1-9) selects a SCHEME: which escalation metadata facet
6
+ -- the target resolves against and how the string parses (delimited text or
7
+ -- fixed-width digits). The two-digit category selects a RULE: an ordered
8
+ -- list of condition/action steps evaluated against the escalation surface,
9
+ -- plus a fallback screen when no step matches.
10
+ --
11
+ -- Rules are plain config consulted at execute time (like lt_config_workflows);
12
+ -- nothing pins a historical rule, so there is no snapshot table. Provenance
13
+ -- is stamped into escalation metadata by the execute path instead.
14
+
15
+ CREATE TABLE IF NOT EXISTS lt_config_scan_schemes (
16
+ version SMALLINT PRIMARY KEY CHECK (version BETWEEN 1 AND 9),
17
+ name TEXT NOT NULL,
18
+ description TEXT,
19
+ target_facet TEXT NOT NULL,
20
+ encoding TEXT NOT NULL DEFAULT 'fixed'
21
+ CHECK (encoding IN ('fixed', 'delimited')),
22
+ delimiter TEXT NOT NULL DEFAULT ':',
23
+ target_length SMALLINT,
24
+ enabled BOOLEAN NOT NULL DEFAULT TRUE,
25
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
26
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
27
+ -- fixed-width parsing needs to know where the target ends
28
+ CONSTRAINT chk_scan_scheme_fixed_length
29
+ CHECK (encoding <> 'fixed' OR target_length IS NOT NULL)
30
+ );
31
+
32
+ CREATE OR REPLACE TRIGGER trg_lt_config_scan_schemes_updated_at
33
+ BEFORE UPDATE ON lt_config_scan_schemes
34
+ FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
35
+
36
+ CREATE TABLE IF NOT EXISTS lt_config_scan_actions (
37
+ scheme_version SMALLINT NOT NULL
38
+ REFERENCES lt_config_scan_schemes(version) ON DELETE CASCADE,
39
+ category TEXT NOT NULL CHECK (category ~ '^[0-9]{2}$'),
40
+ name TEXT NOT NULL,
41
+ steps JSONB NOT NULL DEFAULT '[]',
42
+ fallback JSONB NOT NULL DEFAULT '{}',
43
+ enabled BOOLEAN NOT NULL DEFAULT TRUE,
44
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
45
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
46
+ PRIMARY KEY (scheme_version, category)
47
+ );
48
+
49
+ CREATE OR REPLACE TRIGGER trg_lt_config_scan_actions_updated_at
50
+ BEFORE UPDATE ON lt_config_scan_actions
51
+ FOR EACH ROW EXECUTE FUNCTION lt_set_updated_at();
@@ -0,0 +1,23 @@
1
+ -- Migration 027: Scan-code numbering inversion
2
+ --
3
+ -- The scheme index moves to the leading TWO digits (10-99) and the category
4
+ -- (rule) index to a single digit (0-9): a code now reads ##:#:target. Two
5
+ -- reasons: a code never starts with a leading zero (some scanners choke on it),
6
+ -- and the top-level "named item" you organize by (the scheme) gets the wider
7
+ -- 90-slot space while each scheme's rules stay a small 0-9 set. The indices are
8
+ -- assigned automatically; operators name entries, never pick numbers.
9
+ --
10
+ -- Old rows (single-digit version, two-digit category) cannot satisfy the new
11
+ -- checks and their codes no longer parse, so the config is cleared and re-seeded.
12
+
13
+ TRUNCATE lt_config_scan_actions, lt_config_scan_schemes;
14
+
15
+ ALTER TABLE lt_config_scan_schemes
16
+ DROP CONSTRAINT IF EXISTS lt_config_scan_schemes_version_check;
17
+ ALTER TABLE lt_config_scan_schemes
18
+ ADD CONSTRAINT lt_config_scan_schemes_version_check CHECK (version BETWEEN 10 AND 99);
19
+
20
+ ALTER TABLE lt_config_scan_actions
21
+ DROP CONSTRAINT IF EXISTS lt_config_scan_actions_category_check;
22
+ ALTER TABLE lt_config_scan_actions
23
+ ADD CONSTRAINT lt_config_scan_actions_category_check CHECK (category ~ '^[0-9]$');
@@ -44,6 +44,10 @@ function mapSystemEvent(event) {
44
44
  escalationId: row.id || segments[2],
45
45
  originId: row.origin_id || event.origin_id || undefined,
46
46
  status: ESCALATION_STATUS_BY_VERB[verb] ?? verb,
47
+ // Assignment provenance rides the SystemEvent envelope, NOT the row (it is
48
+ // not a column). Forward it so a consumer can tell a born-assigned,
49
+ // system-directed hand-off (`claimed` with true) from an interactive claim.
50
+ assignedAtCreation: event.assigned_at_creation,
47
51
  data: row,
48
52
  timestamp: event.ts,
49
53
  };
@@ -12,6 +12,23 @@ export interface FeatureFlags {
12
12
  * Default: true. Set `features.dbMaintenance: false` in start config to hide it.
13
13
  */
14
14
  dbMaintenance: boolean;
15
+ /**
16
+ * The Pace Board is readable by every authenticated user: station metrics
17
+ * (aggregate queue-shape counts and trends — never item content) span all
18
+ * roles for any login, and the board leads everyone's home page. Default:
19
+ * true. Set `features.publicPaceBoard: false` to scope metrics back to role
20
+ * membership — the right call for deployments that provision external
21
+ * one-time accounts (e.g. a customer resolving a single form).
22
+ */
23
+ publicPaceBoard: boolean;
24
+ /**
25
+ * Scan-code input on every login: the header scan affordance, the panel,
26
+ * and the global keyboard-wedge capture. Opt-IN: default false — a
27
+ * deployment turns it on with `features.scanCodes: true` when scanners are
28
+ * part of the floor workflow. The scan-code execute/config API stays
29
+ * available either way (the flag gates the dashboard surface).
30
+ */
31
+ scanCodes: boolean;
15
32
  }
16
33
  /** Merge a partial set of flags from the start config. Unspecified flags keep their default. */
17
34
  export declare function configureFeatureFlags(patch?: Partial<FeatureFlags>): void;
@@ -4,6 +4,8 @@ exports.configureFeatureFlags = configureFeatureFlags;
4
4
  exports.getFeatureFlags = getFeatureFlags;
5
5
  const DEFAULT_FLAGS = {
6
6
  dbMaintenance: true,
7
+ publicPaceBoard: true,
8
+ scanCodes: false,
7
9
  };
8
10
  let flags = { ...DEFAULT_FLAGS };
9
11
  /** Merge a partial set of flags from the start config. Unspecified flags keep their default. */
@@ -92,6 +92,7 @@ function registerListRoutes(router) {
92
92
  type: req.query.type,
93
93
  subtype: req.query.subtype,
94
94
  assigned_to: req.query.assigned_to,
95
+ parent_id: req.query.parent_id,
95
96
  claimed: req.query.claimed === 'true',
96
97
  priority: req.query.priority ? parseInt(req.query.priority, 10) : undefined,
97
98
  limit: req.query.limit ? parseInt(req.query.limit, 10) : undefined,
@@ -36,6 +36,7 @@ const agents_1 = __importDefault(require("./agents"));
36
36
  const capabilities_1 = __importDefault(require("./capabilities"));
37
37
  const topics_1 = __importDefault(require("./topics"));
38
38
  const nats_credentials_1 = __importDefault(require("./nats-credentials"));
39
+ const scan_codes_1 = __importDefault(require("./scan-codes"));
39
40
  const router = (0, express_1.Router)();
40
41
  // Public routes (no auth required — they handle their own auth)
41
42
  router.use('/auth', auth_2.default);
@@ -72,6 +73,7 @@ router.use('/knowledge', knowledge_1.default);
72
73
  router.use('/agents', agents_1.default);
73
74
  router.use('/capabilities', capabilities_1.default);
74
75
  router.use('/topics', topics_1.default);
76
+ router.use('/scan-codes', scan_codes_1.default);
75
77
  const overview_1 = __importDefault(require("./overview"));
76
78
  router.use('/overview', overview_1.default);
77
79
  const diagnostics_1 = __importDefault(require("./diagnostics"));
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;