@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,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listScanSchemes = listScanSchemes;
4
+ exports.getScanScheme = getScanScheme;
5
+ exports.listScanRules = listScanRules;
6
+ exports.getScanRule = getScanRule;
7
+ const db_1 = require("../../lib/db");
8
+ const sql_1 = require("./sql");
9
+ function mapScheme(row) {
10
+ return {
11
+ version: row.version,
12
+ name: row.name,
13
+ description: row.description ?? null,
14
+ target_facet: row.target_facet,
15
+ encoding: row.encoding,
16
+ delimiter: row.delimiter,
17
+ target_length: row.target_length ?? null,
18
+ enabled: row.enabled,
19
+ created_at: row.created_at,
20
+ updated_at: row.updated_at,
21
+ };
22
+ }
23
+ function mapRule(row) {
24
+ return {
25
+ scheme_version: row.scheme_version,
26
+ category: row.category,
27
+ name: row.name,
28
+ steps: row.steps ?? [],
29
+ fallback: row.fallback ?? {},
30
+ enabled: row.enabled,
31
+ created_at: row.created_at,
32
+ updated_at: row.updated_at,
33
+ };
34
+ }
35
+ async function listScanSchemes() {
36
+ const { rows } = await (0, db_1.getPool)().query(sql_1.LIST_SCHEMES);
37
+ return rows.map(mapScheme);
38
+ }
39
+ async function getScanScheme(version) {
40
+ const { rows } = await (0, db_1.getPool)().query(sql_1.GET_SCHEME, [version]);
41
+ return rows.length ? mapScheme(rows[0]) : null;
42
+ }
43
+ async function listScanRules(schemeVersion) {
44
+ const { rows } = await (0, db_1.getPool)().query(sql_1.LIST_ACTIONS, [schemeVersion]);
45
+ return rows.map(mapRule);
46
+ }
47
+ async function getScanRule(schemeVersion, category) {
48
+ const { rows } = await (0, db_1.getPool)().query(sql_1.GET_ACTION, [schemeVersion, category]);
49
+ return rows.length ? mapRule(rows[0]) : null;
50
+ }
@@ -0,0 +1,10 @@
1
+ export declare const LIST_SCHEMES = "SELECT * FROM lt_config_scan_schemes ORDER BY version";
2
+ export declare const GET_SCHEME = "SELECT * FROM lt_config_scan_schemes WHERE version = $1";
3
+ export declare const LIST_ACTIONS = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 ORDER BY category";
4
+ export declare const GET_ACTION = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
5
+ export declare const UPSERT_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n enabled = EXCLUDED.enabled\nRETURNING *";
6
+ export declare const DELETE_SCHEME = "DELETE FROM lt_config_scan_schemes WHERE version = $1";
7
+ export declare const UPSERT_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, enabled)\nVALUES ($1, $2, $3, $4, $5, $6)\nON CONFLICT (scheme_version, category) DO UPDATE SET\n name = EXCLUDED.name,\n steps = EXCLUDED.steps,\n fallback = EXCLUDED.fallback,\n enabled = EXCLUDED.enabled\nRETURNING *";
8
+ export declare const DELETE_ACTION = "DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
9
+ export declare const SEED_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8)\nON CONFLICT (version) DO NOTHING";
10
+ export declare const SEED_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, enabled)\nVALUES ($1, $2, $3, $4, $5, $6)\nON CONFLICT (scheme_version, category) DO NOTHING";
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // ------------------------------------------------------------------ //
3
+ // Read queries //
4
+ // ------------------------------------------------------------------ //
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SEED_ACTION = exports.SEED_SCHEME = exports.DELETE_ACTION = exports.UPSERT_ACTION = exports.DELETE_SCHEME = exports.UPSERT_SCHEME = exports.GET_ACTION = exports.LIST_ACTIONS = exports.GET_SCHEME = exports.LIST_SCHEMES = void 0;
7
+ exports.LIST_SCHEMES = `\
8
+ SELECT * FROM lt_config_scan_schemes ORDER BY version`;
9
+ exports.GET_SCHEME = `\
10
+ SELECT * FROM lt_config_scan_schemes WHERE version = $1`;
11
+ exports.LIST_ACTIONS = `\
12
+ SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 ORDER BY category`;
13
+ exports.GET_ACTION = `\
14
+ SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2`;
15
+ // ------------------------------------------------------------------ //
16
+ // Write / upsert queries //
17
+ // ------------------------------------------------------------------ //
18
+ exports.UPSERT_SCHEME = `\
19
+ INSERT INTO lt_config_scan_schemes
20
+ (version, name, description, target_facet, encoding, delimiter, target_length, enabled)
21
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
22
+ ON CONFLICT (version) DO UPDATE SET
23
+ name = EXCLUDED.name,
24
+ description = EXCLUDED.description,
25
+ target_facet = EXCLUDED.target_facet,
26
+ encoding = EXCLUDED.encoding,
27
+ delimiter = EXCLUDED.delimiter,
28
+ target_length = EXCLUDED.target_length,
29
+ enabled = EXCLUDED.enabled
30
+ RETURNING *`;
31
+ exports.DELETE_SCHEME = `\
32
+ DELETE FROM lt_config_scan_schemes WHERE version = $1`;
33
+ exports.UPSERT_ACTION = `\
34
+ INSERT INTO lt_config_scan_actions
35
+ (scheme_version, category, name, steps, fallback, enabled)
36
+ VALUES ($1, $2, $3, $4, $5, $6)
37
+ ON CONFLICT (scheme_version, category) DO UPDATE SET
38
+ name = EXCLUDED.name,
39
+ steps = EXCLUDED.steps,
40
+ fallback = EXCLUDED.fallback,
41
+ enabled = EXCLUDED.enabled
42
+ RETURNING *`;
43
+ exports.DELETE_ACTION = `\
44
+ DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2`;
45
+ // ------------------------------------------------------------------ //
46
+ // Seed (insert-if-absent — used at startup, DB is source of truth) //
47
+ // ------------------------------------------------------------------ //
48
+ exports.SEED_SCHEME = `\
49
+ INSERT INTO lt_config_scan_schemes
50
+ (version, name, description, target_facet, encoding, delimiter, target_length, enabled)
51
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
52
+ ON CONFLICT (version) DO NOTHING`;
53
+ exports.SEED_ACTION = `\
54
+ INSERT INTO lt_config_scan_actions
55
+ (scheme_version, category, name, steps, fallback, enabled)
56
+ VALUES ($1, $2, $3, $4, $5, $6)
57
+ ON CONFLICT (scheme_version, category) DO NOTHING`;
@@ -0,0 +1,12 @@
1
+ import { type ScanScheme, type ScanStep } from '../../types';
2
+ /**
3
+ * Reject incoherent scheme config at write time. Throws with the exact
4
+ * problem — a bad scheme silently misparsing every scan is far worse
5
+ * than a loud upsert failure.
6
+ */
7
+ export declare function assertValidScheme(scheme: Partial<ScanScheme>): void;
8
+ /**
9
+ * Reject incoherent rule steps at write time: a rule that can never
10
+ * execute its verb must fail the upsert, not the factory-floor scan.
11
+ */
12
+ export declare function assertValidSteps(steps: ScanStep[]): void;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertValidScheme = assertValidScheme;
4
+ exports.assertValidSteps = assertValidSteps;
5
+ const types_1 = require("../../types");
6
+ const VALID_VERBS = new Set(Object.values(types_1.SCAN_VERBS));
7
+ /**
8
+ * Reject incoherent scheme config at write time. Throws with the exact
9
+ * problem — a bad scheme silently misparsing every scan is far worse
10
+ * than a loud upsert failure.
11
+ */
12
+ function assertValidScheme(scheme) {
13
+ if (!Number.isInteger(scheme.version) || scheme.version < 10 || scheme.version > 99) {
14
+ throw new Error('scheme version must be a two-digit integer between 10 and 99');
15
+ }
16
+ if (!scheme.name)
17
+ throw new Error('scheme name is required');
18
+ if (!scheme.target_facet)
19
+ throw new Error('scheme target_facet is required');
20
+ const encoding = scheme.encoding ?? types_1.SCAN_ENCODINGS.FIXED;
21
+ if (encoding === types_1.SCAN_ENCODINGS.FIXED) {
22
+ if (!Number.isInteger(scheme.target_length) || scheme.target_length < 1) {
23
+ throw new Error('fixed encoding requires a positive integer target_length');
24
+ }
25
+ }
26
+ if (encoding === types_1.SCAN_ENCODINGS.DELIMITED) {
27
+ const delimiter = scheme.delimiter ?? ':';
28
+ if (delimiter.length !== 1) {
29
+ throw new Error('delimited encoding requires a single-character delimiter');
30
+ }
31
+ if (/[0-9]/.test(delimiter)) {
32
+ throw new Error('delimiter must not be a digit');
33
+ }
34
+ }
35
+ }
36
+ /**
37
+ * Reject incoherent rule steps at write time: a rule that can never
38
+ * execute its verb must fail the upsert, not the factory-floor scan.
39
+ */
40
+ function assertValidSteps(steps) {
41
+ if (!Array.isArray(steps))
42
+ throw new Error('steps must be an array');
43
+ steps.forEach((step, i) => {
44
+ const at = `step ${i + 1}`;
45
+ if (!step || typeof step !== 'object')
46
+ throw new Error(`${at} must be an object`);
47
+ if (!VALID_VERBS.has(step.verb)) {
48
+ throw new Error(`${at}: unknown verb "${step.verb}"`);
49
+ }
50
+ if (step.confirm && !types_1.SCAN_MUTATING_VERBS.includes(step.verb)) {
51
+ throw new Error(`${at}: confirm applies only to mutating verbs`);
52
+ }
53
+ if (step.confirm && !step.confirm.prompt) {
54
+ throw new Error(`${at}: confirm requires a prompt`);
55
+ }
56
+ if (step.verb === types_1.SCAN_VERBS.ESCALATE && !step.params?.targetRole) {
57
+ throw new Error(`${at}: escalate requires params.targetRole`);
58
+ }
59
+ if (step.verb === types_1.SCAN_VERBS.RESOLVE && !step.params?.resolverPayload) {
60
+ throw new Error(`${at}: resolve requires params.resolverPayload`);
61
+ }
62
+ if (step.query && step.query.roles && !Array.isArray(step.query.roles)) {
63
+ throw new Error(`${at}: query.roles must be an array`);
64
+ }
65
+ // Claim and cancel lock via claim-by-metadata, whose SQL filter is the
66
+ // target facet + roles only — extra facet guards would be silently
67
+ // ignored there, so reject them at write time. (Locate, resolve, and
68
+ // escalate steps carry facet guards inside their own atomic filters.)
69
+ const claimLocked = step.verb === types_1.SCAN_VERBS.CLAIM
70
+ || step.verb === types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL
71
+ || step.verb === types_1.SCAN_VERBS.CANCEL
72
+ || (step.verb === types_1.SCAN_VERBS.ESCALATE && step.params?.closeCurrent === 'cancel');
73
+ if (claimLocked && !step.confirm
74
+ && step.query?.facets && Object.keys(step.query.facets).length) {
75
+ throw new Error(`${at}: facet guards are not supported on claim-locked steps (${step.verb})`);
76
+ }
77
+ });
78
+ }
@@ -0,0 +1,26 @@
1
+ import { type ScanScheme, type ScanRule, type ScanStep, type ScanRuleFallback } from '../../types';
2
+ export interface ScanSchemeInput {
3
+ version: number;
4
+ name: string;
5
+ description?: string | null;
6
+ target_facet: string;
7
+ encoding?: ScanScheme['encoding'];
8
+ delimiter?: string;
9
+ target_length?: number | null;
10
+ enabled?: boolean;
11
+ }
12
+ export interface ScanRuleInput {
13
+ scheme_version: number;
14
+ category: string;
15
+ name: string;
16
+ steps: ScanStep[];
17
+ fallback?: ScanRuleFallback;
18
+ enabled?: boolean;
19
+ }
20
+ export declare function upsertScanScheme(input: ScanSchemeInput): Promise<ScanScheme>;
21
+ export declare function deleteScanScheme(version: number): Promise<boolean>;
22
+ export declare function upsertScanRule(input: ScanRuleInput): Promise<ScanRule>;
23
+ export declare function deleteScanRule(schemeVersion: number, category: string): Promise<boolean>;
24
+ /** Insert-if-absent seeding — DB is the source of truth, never overwrite. */
25
+ export declare function seedScanScheme(input: ScanSchemeInput): Promise<boolean>;
26
+ export declare function seedScanRule(input: ScanRuleInput): Promise<boolean>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.upsertScanScheme = upsertScanScheme;
4
+ exports.deleteScanScheme = deleteScanScheme;
5
+ exports.upsertScanRule = upsertScanRule;
6
+ exports.deleteScanRule = deleteScanRule;
7
+ exports.seedScanScheme = seedScanScheme;
8
+ exports.seedScanRule = seedScanRule;
9
+ const db_1 = require("../../lib/db");
10
+ const types_1 = require("../../types");
11
+ const sql_1 = require("./sql");
12
+ const validate_1 = require("./validate");
13
+ function schemeParams(input) {
14
+ return [
15
+ input.version,
16
+ input.name,
17
+ input.description ?? null,
18
+ input.target_facet,
19
+ input.encoding ?? types_1.SCAN_ENCODINGS.FIXED,
20
+ input.delimiter ?? ':',
21
+ input.target_length ?? null,
22
+ input.enabled ?? true,
23
+ ];
24
+ }
25
+ function ruleParams(input) {
26
+ return [
27
+ input.scheme_version,
28
+ input.category,
29
+ input.name,
30
+ JSON.stringify(input.steps),
31
+ JSON.stringify(input.fallback ?? {}),
32
+ input.enabled ?? true,
33
+ ];
34
+ }
35
+ async function upsertScanScheme(input) {
36
+ (0, validate_1.assertValidScheme)(input);
37
+ const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_SCHEME, schemeParams(input));
38
+ return rows[0];
39
+ }
40
+ async function deleteScanScheme(version) {
41
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.DELETE_SCHEME, [version]);
42
+ return (rowCount ?? 0) > 0;
43
+ }
44
+ async function upsertScanRule(input) {
45
+ if (!/^[0-9]$/.test(input.category)) {
46
+ throw new Error('category must be a single digit (0-9)');
47
+ }
48
+ if (!input.name)
49
+ throw new Error('rule name is required');
50
+ (0, validate_1.assertValidSteps)(input.steps);
51
+ if (input.steps.length === 0 && !input.fallback?.markdown && !input.fallback?.route) {
52
+ throw new Error('a rule needs at least one step or a fallback');
53
+ }
54
+ const { rows } = await (0, db_1.getPool)().query(sql_1.UPSERT_ACTION, ruleParams(input));
55
+ return rows[0];
56
+ }
57
+ async function deleteScanRule(schemeVersion, category) {
58
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.DELETE_ACTION, [schemeVersion, category]);
59
+ return (rowCount ?? 0) > 0;
60
+ }
61
+ /** Insert-if-absent seeding — DB is the source of truth, never overwrite. */
62
+ async function seedScanScheme(input) {
63
+ (0, validate_1.assertValidScheme)(input);
64
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.SEED_SCHEME, schemeParams(input));
65
+ return (rowCount ?? 0) > 0;
66
+ }
67
+ async function seedScanRule(input) {
68
+ (0, validate_1.assertValidSteps)(input.steps);
69
+ const { rowCount } = await (0, db_1.getPool)().query(sql_1.SEED_ACTION, ruleParams(input));
70
+ return (rowCount ?? 0) > 0;
71
+ }
@@ -7,6 +7,7 @@
7
7
  export * from './derive-field-label';
8
8
  export * from './x-lt-bind';
9
9
  export * from './x-lt-help';
10
+ export * from './x-lt-transition';
10
11
  export * from './x-lt-show-if';
11
12
  export * from './field-validator';
12
13
  export * from './validate-resolver-payload';
@@ -23,6 +23,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
23
23
  __exportStar(require("./derive-field-label"), exports);
24
24
  __exportStar(require("./x-lt-bind"), exports);
25
25
  __exportStar(require("./x-lt-help"), exports);
26
+ __exportStar(require("./x-lt-transition"), exports);
26
27
  __exportStar(require("./x-lt-show-if"), exports);
27
28
  __exportStar(require("./field-validator"), exports);
28
29
  __exportStar(require("./validate-resolver-payload"), exports);
@@ -0,0 +1,47 @@
1
+ /**
2
+ * x-lt-transition — post-submit hand-off UX. A form_schema may declare, at its
3
+ * schema root, that submitting one of its escalations should pause on a wait
4
+ * screen instead of returning to the previous page — because a follow-on
5
+ * escalation is about to be born assigned to the submitter (a chained hand-off).
6
+ *
7
+ * x-lt-transition boolean — opt in to the wait screen
8
+ * x-lt-transition-message markdown — shown on the wait screen
9
+ * x-lt-transition-max-wait-seconds number — how long to wait for the
10
+ * follow-on before running the fallback
11
+ * query (clamped to a sane range)
12
+ *
13
+ * These tokens control ONLY the UX. Navigation to the follow-on is driven by the
14
+ * engine's born-assigned `claimed` event (assigned_to + parent_id +
15
+ * assigned_at_creation); the schema carries no navigation target and no metadata
16
+ * is used.
17
+ */
18
+ export declare const X_LT_TRANSITION = "x-lt-transition";
19
+ export declare const X_LT_TRANSITION_MESSAGE = "x-lt-transition-message";
20
+ export declare const X_LT_TRANSITION_MAX_WAIT_SECONDS = "x-lt-transition-max-wait-seconds";
21
+ export declare const X_LT_TRANSITION_DONE = "x-lt-transition-done";
22
+ export interface TransitionConfig {
23
+ /** Markdown shown on the wait screen. */
24
+ message: string;
25
+ /** Seconds to wait for the follow-on before the fallback query runs. */
26
+ maxWaitSeconds: number;
27
+ }
28
+ /**
29
+ * The schema's transition config, or null when the schema does not opt in.
30
+ * `x-lt-transition` must be truthy; message and max-wait fall back to defaults.
31
+ */
32
+ export declare function readTransitionConfig(schema: Record<string, unknown> | null | undefined): TransitionConfig | null;
33
+ /**
34
+ * Where to go when this step ends without a further hand-off — the terminal
35
+ * step of a chain (submitting it), or a transition step whose follow-on never
36
+ * arrives (the wait times out). Independent of `x-lt-transition`, so a terminal
37
+ * form can declare it without opting into the wait screen.
38
+ *
39
+ * The value is an href template using the same `{{domain.path}}` syntax and
40
+ * routing conventions as `x-lt-href` (see LinkWidget): an internal path
41
+ * (`/escalations/available?role=…`) navigates in-app; anything else opens
42
+ * externally. A page reached via a forward transition can't rely on
43
+ * `history.back()`, so this states the destination explicitly. Returns the raw
44
+ * template (interpolate it against the escalation context before navigating),
45
+ * or null when absent.
46
+ */
47
+ export declare function readTransitionDone(schema: Record<string, unknown> | null | undefined): string | null;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * x-lt-transition — post-submit hand-off UX. A form_schema may declare, at its
4
+ * schema root, that submitting one of its escalations should pause on a wait
5
+ * screen instead of returning to the previous page — because a follow-on
6
+ * escalation is about to be born assigned to the submitter (a chained hand-off).
7
+ *
8
+ * x-lt-transition boolean — opt in to the wait screen
9
+ * x-lt-transition-message markdown — shown on the wait screen
10
+ * x-lt-transition-max-wait-seconds number — how long to wait for the
11
+ * follow-on before running the fallback
12
+ * query (clamped to a sane range)
13
+ *
14
+ * These tokens control ONLY the UX. Navigation to the follow-on is driven by the
15
+ * engine's born-assigned `claimed` event (assigned_to + parent_id +
16
+ * assigned_at_creation); the schema carries no navigation target and no metadata
17
+ * is used.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.X_LT_TRANSITION_DONE = exports.X_LT_TRANSITION_MAX_WAIT_SECONDS = exports.X_LT_TRANSITION_MESSAGE = exports.X_LT_TRANSITION = void 0;
21
+ exports.readTransitionConfig = readTransitionConfig;
22
+ exports.readTransitionDone = readTransitionDone;
23
+ exports.X_LT_TRANSITION = 'x-lt-transition';
24
+ exports.X_LT_TRANSITION_MESSAGE = 'x-lt-transition-message';
25
+ exports.X_LT_TRANSITION_MAX_WAIT_SECONDS = 'x-lt-transition-max-wait-seconds';
26
+ exports.X_LT_TRANSITION_DONE = 'x-lt-transition-done';
27
+ const DEFAULT_MESSAGE = 'Submitted. Preparing your next step…';
28
+ const DEFAULT_MAX_WAIT_SECONDS = 30;
29
+ const MIN_MAX_WAIT_SECONDS = 5;
30
+ const MAX_MAX_WAIT_SECONDS = 300;
31
+ function clampWaitSeconds(value) {
32
+ const n = typeof value === 'number' ? value : Number(value);
33
+ if (!Number.isFinite(n) || n <= 0)
34
+ return DEFAULT_MAX_WAIT_SECONDS;
35
+ return Math.min(MAX_MAX_WAIT_SECONDS, Math.max(MIN_MAX_WAIT_SECONDS, Math.round(n)));
36
+ }
37
+ /**
38
+ * The schema's transition config, or null when the schema does not opt in.
39
+ * `x-lt-transition` must be truthy; message and max-wait fall back to defaults.
40
+ */
41
+ function readTransitionConfig(schema) {
42
+ if (!schema || !schema[exports.X_LT_TRANSITION])
43
+ return null;
44
+ const rawMessage = schema[exports.X_LT_TRANSITION_MESSAGE];
45
+ const message = typeof rawMessage === 'string' && rawMessage.trim().length > 0 ? rawMessage : DEFAULT_MESSAGE;
46
+ return { message, maxWaitSeconds: clampWaitSeconds(schema[exports.X_LT_TRANSITION_MAX_WAIT_SECONDS]) };
47
+ }
48
+ /**
49
+ * Where to go when this step ends without a further hand-off — the terminal
50
+ * step of a chain (submitting it), or a transition step whose follow-on never
51
+ * arrives (the wait times out). Independent of `x-lt-transition`, so a terminal
52
+ * form can declare it without opting into the wait screen.
53
+ *
54
+ * The value is an href template using the same `{{domain.path}}` syntax and
55
+ * routing conventions as `x-lt-href` (see LinkWidget): an internal path
56
+ * (`/escalations/available?role=…`) navigates in-app; anything else opens
57
+ * externally. A page reached via a forward transition can't rely on
58
+ * `history.back()`, so this states the destination explicitly. Returns the raw
59
+ * template (interpolate it against the escalation context before navigating),
60
+ * or null when absent.
61
+ */
62
+ function readTransitionDone(schema) {
63
+ const raw = schema?.[exports.X_LT_TRANSITION_DONE];
64
+ return typeof raw === 'string' && raw.trim().length > 0 ? raw : null;
65
+ }
@@ -21,6 +21,7 @@
21
21
  * topics.ts — routes/topics.ts
22
22
  * settings.ts — routes/settings.ts
23
23
  * exports.ts — routes/exports.ts
24
+ * scan-codes.ts — routes/scan-codes.ts
24
25
  *
25
26
  * This server replaces three previously separate servers:
26
27
  * - long-tail-db-query (read-only task/escalation/health queries)
@@ -26,6 +26,7 @@ exports.stopAdminServer = stopAdminServer;
26
26
  * topics.ts — routes/topics.ts
27
27
  * settings.ts — routes/settings.ts
28
28
  * exports.ts — routes/exports.ts
29
+ * scan-codes.ts — routes/scan-codes.ts
29
30
  *
30
31
  * This server replaces three previously separate servers:
31
32
  * - long-tail-db-query (read-only task/escalation/health queries)
@@ -58,7 +59,8 @@ const exports_1 = require("./exports");
58
59
  const overview_1 = require("./overview");
59
60
  const diagnostics_1 = require("./diagnostics");
60
61
  const ortho_1 = require("./ortho");
61
- const TOOL_COUNT = 100;
62
+ const scan_codes_1 = require("./scan-codes");
63
+ const TOOL_COUNT = 105;
62
64
  let server = null;
63
65
  async function createAdminServer(options) {
64
66
  if (server && !options?.fresh)
@@ -88,7 +90,8 @@ async function createAdminServer(options) {
88
90
  (0, overview_1.registerOverviewTools)(instance); // 1 tool
89
91
  (0, diagnostics_1.registerDiagnosticsTools)(instance); // 3 tools
90
92
  (0, ortho_1.registerOrthoTools)(instance); // 4 tools
91
- // Total: 100
93
+ (0, scan_codes_1.registerScanCodeTools)(instance); // 5 tools (scan schemes + rules + execute)
94
+ // Total: 105
92
95
  logger_1.loggerRegistry.info(`[lt-mcp:admin] ${name} ready (${TOOL_COUNT} tools registered)`);
93
96
  return instance;
94
97
  }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Scan-code tools — mirrors routes/scan-codes.ts
3
+ *
4
+ * Schemes map a code's leading two digits (10-99) to a target metadata facet
5
+ * and parse shape; rules map a single-digit category (0-9) to ordered
6
+ * condition/action steps over the escalation surface. execute_scan_code runs a raw code as
7
+ * the lt-system principal (see escalations.ts for the principal rationale).
8
+ */
9
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
10
+ export declare function registerScanCodeTools(server: McpServer): void;
@@ -0,0 +1,111 @@
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.registerScanCodeTools = registerScanCodeTools;
37
+ const scanCodesApi = __importStar(require("../../../api/scan-codes"));
38
+ const iam_1 = require("../../../services/iam");
39
+ const schemas_1 = require("./schemas");
40
+ let systemPrincipalId = null;
41
+ async function systemAuth() {
42
+ if (!systemPrincipalId)
43
+ systemPrincipalId = await (0, iam_1.ensureSystemBot)();
44
+ return { userId: systemPrincipalId, role: 'superadmin' };
45
+ }
46
+ function asText(payload) {
47
+ return { content: [{ type: 'text', text: JSON.stringify(payload) }] };
48
+ }
49
+ function registerScanCodeTools(server) {
50
+ // mirrors POST /api/scan-codes/execute
51
+ server.registerTool('execute_scan_code', {
52
+ title: 'Execute Scan Code',
53
+ description: 'Execute a raw scan code (version:category:target). Parses against the ' +
54
+ 'configured schemes, walks the rule\'s condition/action steps, and returns ' +
55
+ 'a structured outcome (executed, confirm_required, matched_list, ' +
56
+ 'no_match_fallback, unconfigured, invalid_code, forbidden, conflict).',
57
+ inputSchema: schemas_1.executeScanCodeSchema,
58
+ }, async (args) => {
59
+ const result = await scanCodesApi.executeScanCode({ code: args.code }, await systemAuth());
60
+ return asText(result.data ?? { error: result.error });
61
+ });
62
+ // mirrors GET /api/scan-codes/schemes
63
+ server.registerTool('list_scan_schemes', {
64
+ title: 'List Scan Schemes',
65
+ description: 'List all scan-code schemes (version, name, target facet, encoding).',
66
+ inputSchema: schemas_1.listScanSchemesSchema,
67
+ }, async (_args) => {
68
+ const result = await scanCodesApi.listScanSchemes();
69
+ return asText(result.data ?? { error: result.error });
70
+ });
71
+ // mirrors PUT /api/scan-codes/schemes/:version
72
+ server.registerTool('upsert_scan_scheme', {
73
+ title: 'Upsert Scan Scheme',
74
+ description: 'Create or replace a scan scheme: which metadata facet the scanned target ' +
75
+ 'resolves against and how the code string parses (fixed digits or delimited text).',
76
+ inputSchema: schemas_1.upsertScanSchemeSchema,
77
+ }, async (args) => {
78
+ const result = await scanCodesApi.upsertScanScheme(args);
79
+ return asText(result.data ?? { error: result.error });
80
+ });
81
+ // mirrors PUT /api/scan-codes/schemes/:version/actions/:category
82
+ server.registerTool('upsert_scan_rule', {
83
+ title: 'Upsert Scan Rule',
84
+ description: 'Create or replace a scan rule for a scheme category: a friendly name, ' +
85
+ 'ordered condition/action steps (first matching query wins its verb), and ' +
86
+ 'a fallback screen when nothing matches.',
87
+ inputSchema: schemas_1.upsertScanRuleSchema,
88
+ }, async (args) => {
89
+ const result = await scanCodesApi.upsertScanRule({
90
+ scheme_version: args.scheme_version,
91
+ category: args.category,
92
+ name: args.name,
93
+ steps: args.steps,
94
+ fallback: args.fallback,
95
+ enabled: args.enabled,
96
+ });
97
+ return asText(result.data ?? { error: result.error });
98
+ });
99
+ // mirrors DELETE /api/scan-codes/schemes/:version/actions/:category
100
+ server.registerTool('delete_scan_rule', {
101
+ title: 'Delete Scan Rule',
102
+ description: 'Delete one scan rule (scheme version + two-digit category).',
103
+ inputSchema: schemas_1.deleteScanRuleSchema,
104
+ }, async (args) => {
105
+ const result = await scanCodesApi.deleteScanRule({
106
+ version: args.scheme_version,
107
+ category: args.category,
108
+ });
109
+ return asText(result.data ?? { error: result.error });
110
+ });
111
+ }