@hotmeshio/long-tail 0.10.11 → 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 (294) hide show
  1. package/build/api/escalations/list.d.ts +1 -0
  2. package/build/api/escalations/list.js +1 -0
  3. package/build/api/escalations/metadata.d.ts +11 -0
  4. package/build/api/escalations/metadata.js +27 -7
  5. package/build/api/scan-codes/config.d.ts +22 -0
  6. package/build/api/scan-codes/config.js +136 -0
  7. package/build/api/scan-codes/execute.d.ts +9 -0
  8. package/build/api/scan-codes/execute.js +372 -0
  9. package/build/api/scan-codes/index.d.ts +2 -0
  10. package/build/api/scan-codes/index.js +14 -0
  11. package/build/lib/db/schemas/026_scan_codes.sql +51 -0
  12. package/build/lib/db/schemas/027_scan_codes_reindex.sql +23 -0
  13. package/build/lib/events/system-events.js +4 -0
  14. package/build/modules/features.d.ts +8 -0
  15. package/build/modules/features.js +1 -0
  16. package/build/routes/escalations/list.js +1 -0
  17. package/build/routes/index.js +2 -0
  18. package/build/routes/scan-codes.d.ts +2 -0
  19. package/build/routes/scan-codes.js +138 -0
  20. package/build/sdk/index.d.ts +4 -0
  21. package/build/services/escalation/crud.d.ts +1 -1
  22. package/build/services/escalation/crud.js +4 -2
  23. package/build/services/escalation/queries.d.ts +1 -0
  24. package/build/services/escalation/queries.js +2 -0
  25. package/build/services/escalation/sql.d.ts +11 -6
  26. package/build/services/escalation/sql.js +20 -20
  27. package/build/services/scan-code/index.d.ts +4 -0
  28. package/build/services/scan-code/index.js +21 -0
  29. package/build/services/scan-code/parse.d.ts +35 -0
  30. package/build/services/scan-code/parse.js +108 -0
  31. package/build/services/scan-code/read.d.ts +5 -0
  32. package/build/services/scan-code/read.js +50 -0
  33. package/build/services/scan-code/sql.d.ts +10 -0
  34. package/build/services/scan-code/sql.js +57 -0
  35. package/build/services/scan-code/validate.d.ts +12 -0
  36. package/build/services/scan-code/validate.js +78 -0
  37. package/build/services/scan-code/write.d.ts +26 -0
  38. package/build/services/scan-code/write.js +71 -0
  39. package/build/shared/form-validation/index.d.ts +1 -0
  40. package/build/shared/form-validation/index.js +1 -0
  41. package/build/shared/form-validation/x-lt-transition.d.ts +47 -0
  42. package/build/shared/form-validation/x-lt-transition.js +65 -0
  43. package/build/system/mcp-servers/admin/index.d.ts +1 -0
  44. package/build/system/mcp-servers/admin/index.js +5 -2
  45. package/build/system/mcp-servers/admin/scan-codes.d.ts +10 -0
  46. package/build/system/mcp-servers/admin/scan-codes.js +111 -0
  47. package/build/system/mcp-servers/admin/schemas.d.ts +232 -14
  48. package/build/system/mcp-servers/admin/schemas.js +50 -0
  49. package/build/system/seed/tool-manifests-admin.d.ts +1380 -0
  50. package/build/system/seed/tool-manifests-admin.js +6 -0
  51. package/build/tsconfig.tsbuildinfo +1 -1
  52. package/build/types/events.d.ts +9 -0
  53. package/build/types/index.d.ts +2 -0
  54. package/build/types/index.js +10 -1
  55. package/build/types/scan-code.d.ts +183 -0
  56. package/build/types/scan-code.js +80 -0
  57. package/build/types/startup.d.ts +6 -0
  58. package/dashboard/dist/assets/{AdminDashboard-CkTbRfY9.js → AdminDashboard-Bv3pHBzn.js} +2 -2
  59. package/dashboard/dist/assets/{AdminDashboard-CkTbRfY9.js.map → AdminDashboard-Bv3pHBzn.js.map} +1 -1
  60. package/dashboard/dist/assets/{AgentConfigPage-Cm8FRpXi.js → AgentConfigPage-Dk2zlvDb.js} +6 -6
  61. package/dashboard/dist/assets/{AgentConfigPage-Cm8FRpXi.js.map → AgentConfigPage-Dk2zlvDb.js.map} +1 -1
  62. package/dashboard/dist/assets/{AgentDetailPage-sQ1-UT46.js → AgentDetailPage-DUno6EGs.js} +2 -2
  63. package/dashboard/dist/assets/{AgentDetailPage-sQ1-UT46.js.map → AgentDetailPage-DUno6EGs.js.map} +1 -1
  64. package/dashboard/dist/assets/{AgentsPage-bSx_mdae.js → AgentsPage-CToVu1qj.js} +2 -2
  65. package/dashboard/dist/assets/{AgentsPage-bSx_mdae.js.map → AgentsPage-CToVu1qj.js.map} +1 -1
  66. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js → AutoGrowTextarea-DgEQeRQw.js} +2 -2
  67. package/dashboard/dist/assets/{AutoGrowTextarea-y-oNY51_.js.map → AutoGrowTextarea-DgEQeRQw.js.map} +1 -1
  68. package/dashboard/dist/assets/{AvailableEscalationsPage-8pMC7Xv6.js → AvailableEscalationsPage-DldboL4W.js} +2 -2
  69. package/dashboard/dist/assets/{AvailableEscalationsPage-8pMC7Xv6.js.map → AvailableEscalationsPage-DldboL4W.js.map} +1 -1
  70. package/dashboard/dist/assets/BotPicker-DQOpVB4M.js +2 -0
  71. package/dashboard/dist/assets/{BotPicker-C4uGH2x9.js.map → BotPicker-DQOpVB4M.js.map} +1 -1
  72. package/dashboard/dist/assets/{CapabilitiesPage-BRoOeKcc.js → CapabilitiesPage-Dmf46PUJ.js} +2 -2
  73. package/dashboard/dist/assets/{CapabilitiesPage-BRoOeKcc.js.map → CapabilitiesPage-Dmf46PUJ.js.map} +1 -1
  74. package/dashboard/dist/assets/{CollapsibleSection-CIj8Adc9.js → CollapsibleSection-CDADefUY.js} +2 -2
  75. package/dashboard/dist/assets/{CollapsibleSection-CIj8Adc9.js.map → CollapsibleSection-CDADefUY.js.map} +1 -1
  76. package/dashboard/dist/assets/{ConfirmDeleteModal-Ugi_9Ukq.js → ConfirmDeleteModal-CQsJUzEa.js} +2 -2
  77. package/dashboard/dist/assets/{ConfirmDeleteModal-Ugi_9Ukq.js.map → ConfirmDeleteModal-CQsJUzEa.js.map} +1 -1
  78. package/dashboard/dist/assets/{CopyableId-GUEdiiL5.js → CopyableId-4Lqlc5cU.js} +2 -2
  79. package/dashboard/dist/assets/{CopyableId-GUEdiiL5.js.map → CopyableId-4Lqlc5cU.js.map} +1 -1
  80. package/dashboard/dist/assets/{CountdownTimer-D3t0XMhE.js → CountdownTimer-DPjIkerB.js} +2 -2
  81. package/dashboard/dist/assets/{CountdownTimer-D3t0XMhE.js.map → CountdownTimer-DPjIkerB.js.map} +1 -1
  82. package/dashboard/dist/assets/{CredentialsPage-B73Si6K1.js → CredentialsPage-8LIEvomi.js} +2 -2
  83. package/dashboard/dist/assets/{CredentialsPage-B73Si6K1.js.map → CredentialsPage-8LIEvomi.js.map} +1 -1
  84. package/dashboard/dist/assets/{CronLabel-Ca1aHolt.js → CronLabel-CK3WSsM5.js} +2 -2
  85. package/dashboard/dist/assets/{CronLabel-Ca1aHolt.js.map → CronLabel-CK3WSsM5.js.map} +1 -1
  86. package/dashboard/dist/assets/{CustomDurationPicker-_9E9x1YN.js → CustomDurationPicker-FPmlA6cE.js} +2 -2
  87. package/dashboard/dist/assets/{CustomDurationPicker-_9E9x1YN.js.map → CustomDurationPicker-FPmlA6cE.js.map} +1 -1
  88. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js → DataTable-Bir0Xs1p.js} +2 -2
  89. package/dashboard/dist/assets/{DataTable-BTu2AaEl.js.map → DataTable-Bir0Xs1p.js.map} +1 -1
  90. package/dashboard/dist/assets/{DropZone-NYn6TWHz.js → DropZone-CL9gA7pu.js} +2 -2
  91. package/dashboard/dist/assets/{DropZone-NYn6TWHz.js.map → DropZone-CL9gA7pu.js.map} +1 -1
  92. package/dashboard/dist/assets/{ElapsedCell-karxia93.js → ElapsedCell-BZVkVxE0.js} +2 -2
  93. package/dashboard/dist/assets/{ElapsedCell-karxia93.js.map → ElapsedCell-BZVkVxE0.js.map} +1 -1
  94. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js → EmptyState-lpUFYfun.js} +2 -2
  95. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-lpUFYfun.js.map} +1 -1
  96. package/dashboard/dist/assets/{EscalationListSchemaPage-CDaNmbUA.js → EscalationListSchemaPage-kYLdUtZX.js} +3 -3
  97. package/dashboard/dist/assets/{EscalationListSchemaPage-CDaNmbUA.js.map → EscalationListSchemaPage-kYLdUtZX.js.map} +1 -1
  98. package/dashboard/dist/assets/{EscalationSchemaPage-k-2hFT2t.js → EscalationSchemaPage-kUmCDivo.js} +3 -3
  99. package/dashboard/dist/assets/{EscalationSchemaPage-k-2hFT2t.js.map → EscalationSchemaPage-kUmCDivo.js.map} +1 -1
  100. package/dashboard/dist/assets/{EscalationsOverview-C1e7IPn_.js → EscalationsOverview-D17auO-m.js} +2 -2
  101. package/dashboard/dist/assets/{EscalationsOverview-C1e7IPn_.js.map → EscalationsOverview-D17auO-m.js.map} +1 -1
  102. package/dashboard/dist/assets/{EventTable-CIrrtL7_.js → EventTable-CwPWl163.js} +2 -2
  103. package/dashboard/dist/assets/{EventTable-CIrrtL7_.js.map → EventTable-CwPWl163.js.map} +1 -1
  104. package/dashboard/dist/assets/{FilterBar-CzjtH74v.js → FilterBar-D7GghUsU.js} +2 -2
  105. package/dashboard/dist/assets/{FilterBar-CzjtH74v.js.map → FilterBar-D7GghUsU.js.map} +1 -1
  106. package/dashboard/dist/assets/{GraphInvokePage-LMpWw8z1.js → GraphInvokePage-D11uOnZi.js} +2 -2
  107. package/dashboard/dist/assets/{GraphInvokePage-LMpWw8z1.js.map → GraphInvokePage-D11uOnZi.js.map} +1 -1
  108. package/dashboard/dist/assets/{HomePage-Kl2DBG6l.js → HomePage-Bcq10Bxx.js} +2 -2
  109. package/dashboard/dist/assets/{HomePage-Kl2DBG6l.js.map → HomePage-Bcq10Bxx.js.map} +1 -1
  110. package/dashboard/dist/assets/ListToolbar-IPXsTb3Q.js +2 -0
  111. package/dashboard/dist/assets/{ListToolbar-B2fub0DY.js.map → ListToolbar-IPXsTb3Q.js.map} +1 -1
  112. package/dashboard/dist/assets/{McpOverview-odYnCZCC.js → McpOverview-Dx2j0KkF.js} +2 -2
  113. package/dashboard/dist/assets/{McpOverview-odYnCZCC.js.map → McpOverview-Dx2j0KkF.js.map} +1 -1
  114. package/dashboard/dist/assets/{McpQueryDetailPage-BtqwHUAg.js → McpQueryDetailPage-CzF_bna8.js} +3 -3
  115. package/dashboard/dist/assets/{McpQueryDetailPage-BtqwHUAg.js.map → McpQueryDetailPage-CzF_bna8.js.map} +1 -1
  116. package/dashboard/dist/assets/{McpQueryPage-CPkVwNIK.js → McpQueryPage-CNsuiw_q.js} +2 -2
  117. package/dashboard/dist/assets/{McpQueryPage-CPkVwNIK.js.map → McpQueryPage-CNsuiw_q.js.map} +1 -1
  118. package/dashboard/dist/assets/{McpRunDetailPage-D-Rz9MRw.js → McpRunDetailPage-BJguEMS0.js} +2 -2
  119. package/dashboard/dist/assets/{McpRunDetailPage-D-Rz9MRw.js.map → McpRunDetailPage-BJguEMS0.js.map} +1 -1
  120. package/dashboard/dist/assets/{McpRunsPage-rdpZ2yMh.js → McpRunsPage-CK96s3Nt.js} +2 -2
  121. package/dashboard/dist/assets/{McpRunsPage-rdpZ2yMh.js.map → McpRunsPage-CK96s3Nt.js.map} +1 -1
  122. package/dashboard/dist/assets/{Modal-Dr1Xy0j0.js → Modal-BU7No9NH.js} +2 -2
  123. package/dashboard/dist/assets/{Modal-Dr1Xy0j0.js.map → Modal-BU7No9NH.js.map} +1 -1
  124. package/dashboard/dist/assets/{NamespacePill-GwO-WfhX.js → NamespacePill-B9Vc_Pz2.js} +2 -2
  125. package/dashboard/dist/assets/{NamespacePill-GwO-WfhX.js.map → NamespacePill-B9Vc_Pz2.js.map} +1 -1
  126. package/dashboard/dist/assets/{OperationsPage-DlyGLPAs.js → OperationsPage-DvWrLuH6.js} +2 -2
  127. package/dashboard/dist/assets/{OperationsPage-DlyGLPAs.js.map → OperationsPage-DvWrLuH6.js.map} +1 -1
  128. package/dashboard/dist/assets/{OperatorDashboard-Csei5vj-.js → OperatorDashboard-C-jE0IRA.js} +2 -2
  129. package/dashboard/dist/assets/{OperatorDashboard-Csei5vj-.js.map → OperatorDashboard-C-jE0IRA.js.map} +1 -1
  130. package/dashboard/dist/assets/{PageHeader-Bo9BU9pK.js → PageHeader-Ce4GcIYo.js} +2 -2
  131. package/dashboard/dist/assets/{PageHeader-Bo9BU9pK.js.map → PageHeader-Ce4GcIYo.js.map} +1 -1
  132. package/dashboard/dist/assets/{PageHeaderWithStats-8_5cOSKL.js → PageHeaderWithStats-Ck0KZvXD.js} +2 -2
  133. package/dashboard/dist/assets/{PageHeaderWithStats-8_5cOSKL.js.map → PageHeaderWithStats-Ck0KZvXD.js.map} +1 -1
  134. package/dashboard/dist/assets/{PersonaDetailPage--ZL6Or6v.js → PersonaDetailPage-CJ6jqo7h.js} +2 -2
  135. package/dashboard/dist/assets/{PersonaDetailPage--ZL6Or6v.js.map → PersonaDetailPage-CJ6jqo7h.js.map} +1 -1
  136. package/dashboard/dist/assets/{PersonasPage-Bdcoay3P.js → PersonasPage-D8hL3kL5.js} +2 -2
  137. package/dashboard/dist/assets/{PersonasPage-Bdcoay3P.js.map → PersonasPage-D8hL3kL5.js.map} +1 -1
  138. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js → PriorityBadge-BETdj4M-.js} +2 -2
  139. package/dashboard/dist/assets/{PriorityBadge-CCERr9vQ.js.map → PriorityBadge-BETdj4M-.js.map} +1 -1
  140. package/dashboard/dist/assets/{ProcessDetailPage-HrmVQq7S.js → ProcessDetailPage-Vnx8Z5_y.js} +2 -2
  141. package/dashboard/dist/assets/{ProcessDetailPage-HrmVQq7S.js.map → ProcessDetailPage-Vnx8Z5_y.js.map} +1 -1
  142. package/dashboard/dist/assets/{ProcessesListPage-_xmj6Bo-.js → ProcessesListPage-DRYtvS3N.js} +2 -2
  143. package/dashboard/dist/assets/{ProcessesListPage-_xmj6Bo-.js.map → ProcessesListPage-DRYtvS3N.js.map} +1 -1
  144. package/dashboard/dist/assets/{RoleDetailPage-C0ju2-4K.js → RoleDetailPage-BKkUvTO-.js} +3 -3
  145. package/dashboard/dist/assets/{RoleDetailPage-C0ju2-4K.js.map → RoleDetailPage-BKkUvTO-.js.map} +1 -1
  146. package/dashboard/dist/assets/{RolePill-CQlnEWkK.js → RolePill-CnuBPhPw.js} +2 -2
  147. package/dashboard/dist/assets/{RolePill-CQlnEWkK.js.map → RolePill-CnuBPhPw.js.map} +1 -1
  148. package/dashboard/dist/assets/{RolesPage-CKluVSpB.js → RolesPage-BHzWK9n6.js} +2 -2
  149. package/dashboard/dist/assets/{RolesPage-CKluVSpB.js.map → RolesPage-BHzWK9n6.js.map} +1 -1
  150. package/dashboard/dist/assets/{RowActions-BA9L9djf.js → RowActions-eYrzgQSj.js} +2 -2
  151. package/dashboard/dist/assets/{RowActions-BA9L9djf.js.map → RowActions-eYrzgQSj.js.map} +1 -1
  152. package/dashboard/dist/assets/{RunAsSelector-DdfecQ1U.js → RunAsSelector-CS3KQ-BF.js} +2 -2
  153. package/dashboard/dist/assets/{RunAsSelector-DdfecQ1U.js.map → RunAsSelector-CS3KQ-BF.js.map} +1 -1
  154. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js +2 -0
  155. package/dashboard/dist/assets/ScanCodesPage-BW4P4zWf.js.map +1 -0
  156. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js +2 -0
  157. package/dashboard/dist/assets/ScanSchemeDetailPage-BLykA4j-.js.map +1 -0
  158. package/dashboard/dist/assets/{ScopeBadge-BBYkevuR.js → ScopeBadge-BUpYpS3x.js} +2 -2
  159. package/dashboard/dist/assets/{ScopeBadge-BBYkevuR.js.map → ScopeBadge-BUpYpS3x.js.map} +1 -1
  160. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js → StatCard-BXQ8dD9Y.js} +2 -2
  161. package/dashboard/dist/assets/{StatCard-Ca-ngCaD.js.map → StatCard-BXQ8dD9Y.js.map} +1 -1
  162. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js → StatusBadge-DkgllZHv.js} +2 -2
  163. package/dashboard/dist/assets/{StatusBadge-BwUvykDo.js.map → StatusBadge-DkgllZHv.js.map} +1 -1
  164. package/dashboard/dist/assets/{StickyPagination-cLddIdtT.js → StickyPagination-hMrnLXde.js} +2 -2
  165. package/dashboard/dist/assets/{StickyPagination-cLddIdtT.js.map → StickyPagination-hMrnLXde.js.map} +1 -1
  166. package/dashboard/dist/assets/{StreamMessageDetail-CZXWDawC.js → StreamMessageDetail-DyJyZwBl.js} +2 -2
  167. package/dashboard/dist/assets/{StreamMessageDetail-CZXWDawC.js.map → StreamMessageDetail-DyJyZwBl.js.map} +1 -1
  168. package/dashboard/dist/assets/{SwimlaneTimeline-fWY0gaf3.js → SwimlaneTimeline-BlzV74V5.js} +2 -2
  169. package/dashboard/dist/assets/{SwimlaneTimeline-fWY0gaf3.js.map → SwimlaneTimeline-BlzV74V5.js.map} +1 -1
  170. package/dashboard/dist/assets/{TagInput-CDKbslLx.js → TagInput-BbZ25nNe.js} +2 -2
  171. package/dashboard/dist/assets/{TagInput-CDKbslLx.js.map → TagInput-BbZ25nNe.js.map} +1 -1
  172. package/dashboard/dist/assets/{TaskDetailPage-BjE4G2yn.js → TaskDetailPage-B0p_Z4J_.js} +2 -2
  173. package/dashboard/dist/assets/{TaskDetailPage-BjE4G2yn.js.map → TaskDetailPage-B0p_Z4J_.js.map} +1 -1
  174. package/dashboard/dist/assets/{TaskQueuePill-G3RuYRNZ.js → TaskQueuePill-D0QKBrN3.js} +2 -2
  175. package/dashboard/dist/assets/{TaskQueuePill-G3RuYRNZ.js.map → TaskQueuePill-D0QKBrN3.js.map} +1 -1
  176. package/dashboard/dist/assets/{TasksListPage-KAhmCWB2.js → TasksListPage-CiGR2QiQ.js} +2 -2
  177. package/dashboard/dist/assets/{TasksListPage-KAhmCWB2.js.map → TasksListPage-CiGR2QiQ.js.map} +1 -1
  178. package/dashboard/dist/assets/TimeAgo-D_DA9ucC.js +2 -0
  179. package/dashboard/dist/assets/{TimeAgo-C_H2TyZw.js.map → TimeAgo-D_DA9ucC.js.map} +1 -1
  180. package/dashboard/dist/assets/{TimestampCell-COG_4Flg.js → TimestampCell-C7rkC9nh.js} +2 -2
  181. package/dashboard/dist/assets/{TimestampCell-COG_4Flg.js.map → TimestampCell-C7rkC9nh.js.map} +1 -1
  182. package/dashboard/dist/assets/{ToolPill-ChSyRJZC.js → ToolPill-8xY9rkoc.js} +2 -2
  183. package/dashboard/dist/assets/{ToolPill-ChSyRJZC.js.map → ToolPill-8xY9rkoc.js.map} +1 -1
  184. package/dashboard/dist/assets/{ToolTestPanel-BPdJECW0.js → ToolTestPanel-E8efYGYs.js} +2 -2
  185. package/dashboard/dist/assets/{ToolTestPanel-BPdJECW0.js.map → ToolTestPanel-E8efYGYs.js.map} +1 -1
  186. package/dashboard/dist/assets/{TopicDetailPage-DAqx5JqA.js → TopicDetailPage-B455XrRc.js} +3 -3
  187. package/dashboard/dist/assets/{TopicDetailPage-DAqx5JqA.js.map → TopicDetailPage-B455XrRc.js.map} +1 -1
  188. package/dashboard/dist/assets/TopicsPage-1VAc29Qw.js +2 -0
  189. package/dashboard/dist/assets/{TopicsPage-DoGqAdPm.js.map → TopicsPage-1VAc29Qw.js.map} +1 -1
  190. package/dashboard/dist/assets/UserName-DikzjQHJ.js +2 -0
  191. package/dashboard/dist/assets/{UserName-CKO_rk1R.js.map → UserName-DikzjQHJ.js.map} +1 -1
  192. package/dashboard/dist/assets/{WorkflowExecutionPage-D3VQ9iQV.js → WorkflowExecutionPage-C15GSAoe.js} +2 -2
  193. package/dashboard/dist/assets/{WorkflowExecutionPage-D3VQ9iQV.js.map → WorkflowExecutionPage-C15GSAoe.js.map} +1 -1
  194. package/dashboard/dist/assets/{WorkflowPill-CNbwug5p.js → WorkflowPill-Da406nEj.js} +2 -2
  195. package/dashboard/dist/assets/{WorkflowPill-CNbwug5p.js.map → WorkflowPill-Da406nEj.js.map} +1 -1
  196. package/dashboard/dist/assets/{WorkflowsDashboard-DdJ86We6.js → WorkflowsDashboard-BMQd_0tW.js} +2 -2
  197. package/dashboard/dist/assets/{WorkflowsDashboard-DdJ86We6.js.map → WorkflowsDashboard-BMQd_0tW.js.map} +1 -1
  198. package/dashboard/dist/assets/{WorkflowsOverview-ZfFBzePp.js → WorkflowsOverview-CdxjVifp.js} +2 -2
  199. package/dashboard/dist/assets/{WorkflowsOverview-ZfFBzePp.js.map → WorkflowsOverview-CdxjVifp.js.map} +1 -1
  200. package/dashboard/dist/assets/{YamlWorkflowDetailPage-4bd5yXdA.js → YamlWorkflowDetailPage-DNVffIXa.js} +13 -13
  201. package/dashboard/dist/assets/{YamlWorkflowDetailPage-4bd5yXdA.js.map → YamlWorkflowDetailPage-DNVffIXa.js.map} +1 -1
  202. package/dashboard/dist/assets/{YamlWorkflowsPage-iHPNXjQj.js → YamlWorkflowsPage-BGP8wuos.js} +2 -2
  203. package/dashboard/dist/assets/{YamlWorkflowsPage-iHPNXjQj.js.map → YamlWorkflowsPage-BGP8wuos.js.map} +1 -1
  204. package/dashboard/dist/assets/{agents-DjD5U3Wb.js → agents-BZJLIJ4h.js} +2 -2
  205. package/dashboard/dist/assets/{agents-DjD5U3Wb.js.map → agents-BZJLIJ4h.js.map} +1 -1
  206. package/dashboard/dist/assets/{bots-DiljVapH.js → bots-ClLcDGJb.js} +2 -2
  207. package/dashboard/dist/assets/{bots-DiljVapH.js.map → bots-ClLcDGJb.js.map} +1 -1
  208. package/dashboard/dist/assets/capabilities-IaCcS7ge.js +2 -0
  209. package/dashboard/dist/assets/{capabilities-DV_5ghHT.js.map → capabilities-IaCcS7ge.js.map} +1 -1
  210. package/dashboard/dist/assets/{controlplane-BKMvfWCB.js → controlplane-Zi4m_MSx.js} +2 -2
  211. package/dashboard/dist/assets/{controlplane-BKMvfWCB.js.map → controlplane-Zi4m_MSx.js.map} +1 -1
  212. package/dashboard/dist/assets/{escalation-columns-BQpCaJId.js → escalation-columns-BY2mg9DY.js} +2 -2
  213. package/dashboard/dist/assets/{escalation-columns-BQpCaJId.js.map → escalation-columns-BY2mg9DY.js.map} +1 -1
  214. package/dashboard/dist/assets/{index-Tx_ETzcH.js → index-BqGnhkh0.js} +2 -2
  215. package/dashboard/dist/assets/{index-Tx_ETzcH.js.map → index-BqGnhkh0.js.map} +1 -1
  216. package/dashboard/dist/assets/index-BzkE48xJ.js +6 -0
  217. package/dashboard/dist/assets/index-BzkE48xJ.js.map +1 -0
  218. package/dashboard/dist/assets/{index-CI8rrKjx.js → index-C3o4OisO.js} +2 -2
  219. package/dashboard/dist/assets/{index-CI8rrKjx.js.map → index-C3o4OisO.js.map} +1 -1
  220. package/dashboard/dist/assets/{index-BO-7S9Xw.js → index-CJu2PBNx.js} +2 -2
  221. package/dashboard/dist/assets/{index-BO-7S9Xw.js.map → index-CJu2PBNx.js.map} +1 -1
  222. package/dashboard/dist/assets/{index-CItsikDw.js → index-CLmZaNTK.js} +2 -2
  223. package/dashboard/dist/assets/{index-CItsikDw.js.map → index-CLmZaNTK.js.map} +1 -1
  224. package/dashboard/dist/assets/index-CfAi1OsI.js +65 -0
  225. package/dashboard/dist/assets/index-CfAi1OsI.js.map +1 -0
  226. package/dashboard/dist/assets/{index-BaV3l0UE.js → index-CmnNqpWg.js} +2 -2
  227. package/dashboard/dist/assets/{index-BaV3l0UE.js.map → index-CmnNqpWg.js.map} +1 -1
  228. package/dashboard/dist/assets/{index-nIrYejxe.js → index-CvNBdkB1.js} +3 -3
  229. package/dashboard/dist/assets/{index-nIrYejxe.js.map → index-CvNBdkB1.js.map} +1 -1
  230. package/dashboard/dist/assets/{index-xZqQxqu2.js → index-D0zFReGL.js} +2 -2
  231. package/dashboard/dist/assets/{index-xZqQxqu2.js.map → index-D0zFReGL.js.map} +1 -1
  232. package/dashboard/dist/assets/{index-CStR4uIU.js → index-Dldi3Q3M.js} +2 -2
  233. package/dashboard/dist/assets/{index-CStR4uIU.js.map → index-Dldi3Q3M.js.map} +1 -1
  234. package/dashboard/dist/assets/{index-DhATO1cS.js → index-kiKZresb.js} +2 -2
  235. package/dashboard/dist/assets/{index-DhATO1cS.js.map → index-kiKZresb.js.map} +1 -1
  236. package/dashboard/dist/assets/index-mKcQGi2B.js +3 -0
  237. package/dashboard/dist/assets/index-mKcQGi2B.js.map +1 -0
  238. package/dashboard/dist/assets/{index-BsOxMMmb.js → index-yGNt29V9.js} +2 -2
  239. package/dashboard/dist/assets/{index-BsOxMMmb.js.map → index-yGNt29V9.js.map} +1 -1
  240. package/dashboard/dist/assets/index-zQiUPfxA.css +1 -0
  241. package/dashboard/dist/assets/{knowledge-BocTnSiA.js → knowledge-DWLxGTib.js} +2 -2
  242. package/dashboard/dist/assets/{knowledge-BocTnSiA.js.map → knowledge-DWLxGTib.js.map} +1 -1
  243. package/dashboard/dist/assets/{mcp-C1KBjKQ_.js → mcp-B6AARZ2I.js} +2 -2
  244. package/dashboard/dist/assets/{mcp-C1KBjKQ_.js.map → mcp-B6AARZ2I.js.map} +1 -1
  245. package/dashboard/dist/assets/{mcp-query-B3cjukkA.js → mcp-query-DrkvBU3a.js} +2 -2
  246. package/dashboard/dist/assets/{mcp-query-B3cjukkA.js.map → mcp-query-DrkvBU3a.js.map} +1 -1
  247. package/dashboard/dist/assets/{personas-DiA2bJaX.js → personas-Cmz2SAEU.js} +2 -2
  248. package/dashboard/dist/assets/{personas-DiA2bJaX.js.map → personas-Cmz2SAEU.js.map} +1 -1
  249. package/dashboard/dist/assets/{pipelines-Dt2d2EFR.js → pipelines-CSgfVCMy.js} +2 -2
  250. package/dashboard/dist/assets/{pipelines-Dt2d2EFR.js.map → pipelines-CSgfVCMy.js.map} +1 -1
  251. package/dashboard/dist/assets/{tasks-cDh2hNml.js → tasks-UOtUkDk-.js} +2 -2
  252. package/dashboard/dist/assets/{tasks-cDh2hNml.js.map → tasks-UOtUkDk-.js.map} +1 -1
  253. package/dashboard/dist/assets/{topics-yFlGF-u1.js → topics-Df5hGh6o.js} +2 -2
  254. package/dashboard/dist/assets/{topics-yFlGF-u1.js.map → topics-Df5hGh6o.js.map} +1 -1
  255. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js → useDebouncedValue-C4P2jQuh.js} +2 -2
  256. package/dashboard/dist/assets/{useDebouncedValue-BA5S7V54.js.map → useDebouncedValue-C4P2jQuh.js.map} +1 -1
  257. package/dashboard/dist/assets/{useEventHooks-D2R_ckS8.js → useEventHooks-PDbuSJ12.js} +2 -2
  258. package/dashboard/dist/assets/{useEventHooks-D2R_ckS8.js.map → useEventHooks-PDbuSJ12.js.map} +1 -1
  259. package/dashboard/dist/assets/{useFilterParams-B7suPsIK.js → useFilterParams-crmlBw_l.js} +2 -2
  260. package/dashboard/dist/assets/{useFilterParams-B7suPsIK.js.map → useFilterParams-crmlBw_l.js.map} +1 -1
  261. package/dashboard/dist/assets/{useNamespace-u-V1GVUD.js → useNamespace-tZSOlge3.js} +2 -2
  262. package/dashboard/dist/assets/{useNamespace-u-V1GVUD.js.map → useNamespace-tZSOlge3.js.map} +1 -1
  263. package/dashboard/dist/assets/{useYamlActivityEvents-BhOZeqgE.js → useYamlActivityEvents-CINLzE32.js} +2 -2
  264. package/dashboard/dist/assets/{useYamlActivityEvents-BhOZeqgE.js.map → useYamlActivityEvents-CINLzE32.js.map} +1 -1
  265. package/dashboard/dist/assets/{users-BoXPwdee.js → users-G8qwyZKS.js} +2 -2
  266. package/dashboard/dist/assets/{users-BoXPwdee.js.map → users-G8qwyZKS.js.map} +1 -1
  267. package/dashboard/dist/assets/{vendor-icons-D71XjkNy.js → vendor-icons-BpZiWH2f.js} +135 -130
  268. package/dashboard/dist/assets/vendor-icons-BpZiWH2f.js.map +1 -0
  269. package/dashboard/dist/assets/{vendor-query-B2UbickB.js → vendor-query-RUZdMvN6.js} +2 -2
  270. package/dashboard/dist/assets/{vendor-query-B2UbickB.js.map → vendor-query-RUZdMvN6.js.map} +1 -1
  271. package/dashboard/dist/assets/{vendor-react-C1YOyCSV.js → vendor-react-CdqEC2zv.js} +2 -2
  272. package/dashboard/dist/assets/{vendor-react-C1YOyCSV.js.map → vendor-react-CdqEC2zv.js.map} +1 -1
  273. package/dashboard/dist/assets/{workflows-mCoyKuLZ.js → workflows-DbPqi1TW.js} +2 -2
  274. package/dashboard/dist/assets/{workflows-mCoyKuLZ.js.map → workflows-DbPqi1TW.js.map} +1 -1
  275. package/dashboard/dist/assets/{yaml-workflows-CWxXGDpn.js → yaml-workflows-DozD8hpR.js} +2 -2
  276. package/dashboard/dist/assets/{yaml-workflows-CWxXGDpn.js.map → yaml-workflows-DozD8hpR.js.map} +1 -1
  277. package/dashboard/dist/index.html +5 -5
  278. package/docs/hitl/x-lt-transition.md +105 -0
  279. package/docs/scan-codes.md +243 -0
  280. package/package.json +2 -2
  281. package/dashboard/dist/assets/BotPicker-C4uGH2x9.js +0 -2
  282. package/dashboard/dist/assets/ListToolbar-B2fub0DY.js +0 -2
  283. package/dashboard/dist/assets/TimeAgo-C_H2TyZw.js +0 -2
  284. package/dashboard/dist/assets/TopicsPage-DoGqAdPm.js +0 -2
  285. package/dashboard/dist/assets/UserName-CKO_rk1R.js +0 -2
  286. package/dashboard/dist/assets/capabilities-DV_5ghHT.js +0 -2
  287. package/dashboard/dist/assets/index-B-WkiNRN.js +0 -6
  288. package/dashboard/dist/assets/index-B-WkiNRN.js.map +0 -1
  289. package/dashboard/dist/assets/index-DbTD-dio.js +0 -63
  290. package/dashboard/dist/assets/index-DbTD-dio.js.map +0 -1
  291. package/dashboard/dist/assets/index-DnlsDaAw.css +0 -1
  292. package/dashboard/dist/assets/index-kzIIeVbx.js +0 -5
  293. package/dashboard/dist/assets/index-kzIIeVbx.js.map +0 -1
  294. package/dashboard/dist/assets/vendor-icons-D71XjkNy.js.map +0 -1
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseScanCode = parseScanCode;
4
+ exports.interpolateScanTemplate = interpolateScanTemplate;
5
+ const types_1 = require("../../types");
6
+ /**
7
+ * Parse a raw scan string against the configured schemes. Pure — no I/O.
8
+ *
9
+ * The leading TWO digits pick the scheme (10-99, so a code never starts with a
10
+ * leading zero); the scheme then defines how the remainder splits into a
11
+ * single-digit category (0-9) and the target:
12
+ * - delimited: `10:1:ABC-123` (delimiter from the scheme row)
13
+ * - fixed: `1017554332` (one category digit, then target_length digits)
14
+ */
15
+ function parseScanCode(raw, schemes) {
16
+ const code = raw.trim();
17
+ if (!code) {
18
+ return { ok: false, failure: { reason: 'empty', detail: 'empty scan code' } };
19
+ }
20
+ const versionToken = code.slice(0, 2);
21
+ const version = Number(versionToken);
22
+ if (!/^[0-9]{2}$/.test(versionToken) || version < 10 || version > 99) {
23
+ return {
24
+ ok: false,
25
+ failure: { reason: 'unknown_version', detail: `code must start with a two-digit scheme 10-99, got "${versionToken}"` },
26
+ };
27
+ }
28
+ const scheme = schemes.find((s) => s.version === version);
29
+ if (!scheme) {
30
+ return {
31
+ ok: false,
32
+ failure: { reason: 'unknown_version', detail: `no scan scheme configured for version ${version}` },
33
+ };
34
+ }
35
+ if (!scheme.enabled) {
36
+ return {
37
+ ok: false,
38
+ failure: { reason: 'scheme_disabled', detail: `scan scheme ${version} ("${scheme.name}") is disabled` },
39
+ };
40
+ }
41
+ if (scheme.encoding === types_1.SCAN_ENCODINGS.DELIMITED) {
42
+ return parseDelimited(code, version, scheme);
43
+ }
44
+ return parseFixed(code, version, scheme);
45
+ }
46
+ function parseDelimited(code, version, scheme) {
47
+ const d = scheme.delimiter;
48
+ // version(2 digits) <d> category(1 digit) <d> target(rest, non-empty)
49
+ if (code[2] !== d) {
50
+ return malformed(scheme, `expected "${d}" after the two-digit scheme`);
51
+ }
52
+ const category = code.slice(3, 4);
53
+ if (!/^[0-9]$/.test(category)) {
54
+ return malformed(scheme, 'category must be a single digit');
55
+ }
56
+ if (code[4] !== d) {
57
+ return malformed(scheme, `expected "${d}" after the category`);
58
+ }
59
+ const target = code.slice(5);
60
+ if (!target) {
61
+ return malformed(scheme, 'target is empty');
62
+ }
63
+ return { ok: true, parsed: { version, category, target }, scheme };
64
+ }
65
+ function parseFixed(code, version, scheme) {
66
+ const targetLength = scheme.target_length ?? 0;
67
+ const expected = 2 + 1 + targetLength;
68
+ // UPC-A wedges deliver the trailing check digit too; accept it as slack.
69
+ if (!/^[0-9]+$/.test(code)) {
70
+ return malformed(scheme, 'fixed encoding accepts digits only');
71
+ }
72
+ if (code.length !== expected && code.length !== expected + 1) {
73
+ return malformed(scheme, `expected ${expected} digits (or ${expected + 1} with check digit), got ${code.length}`);
74
+ }
75
+ const category = code.slice(2, 3);
76
+ const target = code.slice(3, 3 + targetLength);
77
+ return { ok: true, parsed: { version, category, target }, scheme };
78
+ }
79
+ function malformed(scheme, detail) {
80
+ return {
81
+ ok: false,
82
+ failure: { reason: 'malformed', detail: `scheme ${scheme.version} ("${scheme.name}"): ${detail}` },
83
+ };
84
+ }
85
+ /**
86
+ * Replace SCAN_TEMPLATE_TOKENS inside string values of a params object.
87
+ * Deep, pure, non-mutating. Only exact-token and in-string replacement of
88
+ * the three known tokens — no expression language.
89
+ */
90
+ function interpolateScanTemplate(value, ctx) {
91
+ if (typeof value === 'string') {
92
+ return value
93
+ .split(types_1.SCAN_TEMPLATE_TOKENS.TARGET).join(ctx.target)
94
+ .split(types_1.SCAN_TEMPLATE_TOKENS.CATEGORY).join(ctx.category)
95
+ .split(types_1.SCAN_TEMPLATE_TOKENS.SCANNED_AT).join(ctx.scannedAt);
96
+ }
97
+ if (Array.isArray(value)) {
98
+ return value.map((v) => interpolateScanTemplate(v, ctx));
99
+ }
100
+ if (value && typeof value === 'object') {
101
+ const out = {};
102
+ for (const [k, v] of Object.entries(value)) {
103
+ out[k] = interpolateScanTemplate(v, ctx);
104
+ }
105
+ return out;
106
+ }
107
+ return value;
108
+ }
@@ -0,0 +1,5 @@
1
+ import type { ScanScheme, ScanRule } from '../../types';
2
+ export declare function listScanSchemes(): Promise<ScanScheme[]>;
3
+ export declare function getScanScheme(version: number): Promise<ScanScheme | null>;
4
+ export declare function listScanRules(schemeVersion: number): Promise<ScanRule[]>;
5
+ export declare function getScanRule(schemeVersion: number, category: string): Promise<ScanRule | null>;
@@ -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;