@hotmeshio/long-tail 0.30.2 → 0.30.4

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 (282) hide show
  1. package/build/api/escalations/accumulate.d.ts +2 -1
  2. package/build/api/escalations/accumulate.js +2 -1
  3. package/build/api/escalations/metadata.d.ts +3 -2
  4. package/build/api/escalations/metadata.js +4 -3
  5. package/build/api/escalations/resolve-batch.d.ts +3 -1
  6. package/build/api/escalations/resolve-batch.js +14 -1
  7. package/build/api/scan-codes/choice.js +3 -2
  8. package/build/api/scan-codes/context.d.ts +6 -0
  9. package/build/api/scan-codes/context.js +10 -1
  10. package/build/api/scan-codes/locate.js +1 -0
  11. package/build/api/scan-codes/subject.js +32 -3
  12. package/build/api/scan-codes/verb-accumulate.js +1 -1
  13. package/build/api/scan-codes/verb-fill.js +2 -1
  14. package/build/api/scan-codes/verb-into-subject.js +1 -1
  15. package/build/api/scan-codes/verbs-subject.d.ts +3 -1
  16. package/build/api/scan-codes/verbs-subject.js +8 -5
  17. package/build/api/scan-codes/verbs.js +4 -4
  18. package/build/lib/db/schemas/043_scan_pattern_and_member_targets.sql +26 -0
  19. package/build/lib/facet-value.d.ts +3 -0
  20. package/build/lib/facet-value.js +9 -0
  21. package/build/routes/scan-codes.js +3 -0
  22. package/build/sdk/index.d.ts +3 -3
  23. package/build/services/escalation/batch.d.ts +4 -3
  24. package/build/services/escalation/batch.js +5 -3
  25. package/build/services/escalation/claim-asserted.d.ts +2 -1
  26. package/build/services/escalation/crud.d.ts +3 -2
  27. package/build/services/orchestrator/condition.d.ts +6 -0
  28. package/build/services/orchestrator/condition.js +6 -0
  29. package/build/services/scan-code/read.js +3 -0
  30. package/build/services/scan-code/sql.d.ts +3 -3
  31. package/build/services/scan-code/sql.js +19 -8
  32. package/build/services/scan-code/validate-scheme-pattern.d.ts +16 -0
  33. package/build/services/scan-code/validate-scheme-pattern.js +75 -0
  34. package/build/services/scan-code/validate.d.ts +3 -1
  35. package/build/services/scan-code/validate.js +6 -1
  36. package/build/services/scan-code/write.d.ts +3 -0
  37. package/build/services/scan-code/write.js +3 -0
  38. package/build/shared/scan-code/index.d.ts +2 -1
  39. package/build/shared/scan-code/index.js +8 -1
  40. package/build/shared/scan-code/parse.d.ts +22 -1
  41. package/build/shared/scan-code/parse.js +78 -0
  42. package/build/shared/scan-code/target.d.ts +4 -0
  43. package/build/shared/scan-code/target.js +14 -0
  44. package/build/system/mcp-servers/admin/schemas.d.ts +86 -77
  45. package/build/system/mcp-servers/admin/schemas.js +4 -1
  46. package/build/system/mcp-servers/human-queue-lookups.d.ts +7 -0
  47. package/build/system/mcp-servers/human-queue-lookups.js +31 -0
  48. package/build/system/mcp-servers/human-queue-schemas.d.ts +7 -0
  49. package/build/system/mcp-servers/human-queue-schemas.js +4 -1
  50. package/build/system/mcp-servers/human-queue.d.ts +1 -0
  51. package/build/system/mcp-servers/human-queue.js +3 -0
  52. package/build/system/seed/tool-manifests-admin.js +1 -1
  53. package/build/system/seed/tool-manifests-escalation.js +2 -2
  54. package/build/tsconfig.tsbuildinfo +1 -1
  55. package/build/types/escalation.d.ts +15 -0
  56. package/build/types/escalation.js +16 -1
  57. package/build/types/facets.d.ts +5 -0
  58. package/build/types/index.d.ts +3 -3
  59. package/build/types/index.js +5 -1
  60. package/build/types/scan-code/constants.d.ts +20 -0
  61. package/build/types/scan-code/constants.js +20 -1
  62. package/build/types/scan-code/response.d.ts +2 -1
  63. package/build/types/scan-code/rule.d.ts +12 -2
  64. package/dashboard/dist/assets/{AdminDashboard-NVtdLI4I.js → AdminDashboard-VQ1fhhJP.js} +2 -2
  65. package/dashboard/dist/assets/{AdminDashboard-NVtdLI4I.js.map → AdminDashboard-VQ1fhhJP.js.map} +1 -1
  66. package/dashboard/dist/assets/{AgentConfigPage-Db1Oi72V.js → AgentConfigPage-BOe_W2Ij.js} +2 -2
  67. package/dashboard/dist/assets/{AgentConfigPage-Db1Oi72V.js.map → AgentConfigPage-BOe_W2Ij.js.map} +1 -1
  68. package/dashboard/dist/assets/{AgentDetailPage-BF4mw1bD.js → AgentDetailPage-5ov5D9V2.js} +2 -2
  69. package/dashboard/dist/assets/{AgentDetailPage-BF4mw1bD.js.map → AgentDetailPage-5ov5D9V2.js.map} +1 -1
  70. package/dashboard/dist/assets/{AgentsPage-DmF0m3Ro.js → AgentsPage-DDFMKHhI.js} +2 -2
  71. package/dashboard/dist/assets/{AgentsPage-DmF0m3Ro.js.map → AgentsPage-DDFMKHhI.js.map} +1 -1
  72. package/dashboard/dist/assets/{AvailableEscalationsPage-jy2WKDjr.js → AvailableEscalationsPage-GFn8Sgg1.js} +2 -2
  73. package/dashboard/dist/assets/{AvailableEscalationsPage-jy2WKDjr.js.map → AvailableEscalationsPage-GFn8Sgg1.js.map} +1 -1
  74. package/dashboard/dist/assets/{BotPicker-HJtVHdNe.js → BotPicker-Dqpo36dM.js} +2 -2
  75. package/dashboard/dist/assets/{BotPicker-HJtVHdNe.js.map → BotPicker-Dqpo36dM.js.map} +1 -1
  76. package/dashboard/dist/assets/{BulkAssignModal-DsJJZ9X4.js → BulkAssignModal-CmLVxkz-.js} +2 -2
  77. package/dashboard/dist/assets/{BulkAssignModal-DsJJZ9X4.js.map → BulkAssignModal-CmLVxkz-.js.map} +1 -1
  78. package/dashboard/dist/assets/{CapabilitiesPage-iCn7PxDP.js → CapabilitiesPage-Dfkip6_b.js} +2 -2
  79. package/dashboard/dist/assets/{CapabilitiesPage-iCn7PxDP.js.map → CapabilitiesPage-Dfkip6_b.js.map} +1 -1
  80. package/dashboard/dist/assets/{CollapsibleSection-DFfVr_Ut.js → CollapsibleSection-CYNYMYSa.js} +2 -2
  81. package/dashboard/dist/assets/{CollapsibleSection-DFfVr_Ut.js.map → CollapsibleSection-CYNYMYSa.js.map} +1 -1
  82. package/dashboard/dist/assets/{ConfirmDeleteModal-D6TwO-yT.js → ConfirmDeleteModal-CpJNP-8w.js} +2 -2
  83. package/dashboard/dist/assets/{ConfirmDeleteModal-D6TwO-yT.js.map → ConfirmDeleteModal-CpJNP-8w.js.map} +1 -1
  84. package/dashboard/dist/assets/{ConnectedAppsPage-BOD-tgY0.js → ConnectedAppsPage-DXIp2Dpl.js} +2 -2
  85. package/dashboard/dist/assets/{ConnectedAppsPage-BOD-tgY0.js.map → ConnectedAppsPage-DXIp2Dpl.js.map} +1 -1
  86. package/dashboard/dist/assets/{CountdownTimer-u_o3OygV.js → CountdownTimer-CuPY7zkb.js} +2 -2
  87. package/dashboard/dist/assets/{CountdownTimer-u_o3OygV.js.map → CountdownTimer-CuPY7zkb.js.map} +1 -1
  88. package/dashboard/dist/assets/{CredentialsPage-C3dnRsMh.js → CredentialsPage-CtrnkHcj.js} +2 -2
  89. package/dashboard/dist/assets/{CredentialsPage-C3dnRsMh.js.map → CredentialsPage-CtrnkHcj.js.map} +1 -1
  90. package/dashboard/dist/assets/{CronLabel-BFh5TCsB.js → CronLabel-DVjTw5Ri.js} +2 -2
  91. package/dashboard/dist/assets/{CronLabel-BFh5TCsB.js.map → CronLabel-DVjTw5Ri.js.map} +1 -1
  92. package/dashboard/dist/assets/{ElapsedCell-D0jYuFKh.js → ElapsedCell-gY_mGMTF.js} +2 -2
  93. package/dashboard/dist/assets/{ElapsedCell-D0jYuFKh.js.map → ElapsedCell-gY_mGMTF.js.map} +1 -1
  94. package/dashboard/dist/assets/{EntityTimelinePanel-Ch-BsRu8.js → EntityTimelinePanel-DJN_ZEQa.js} +2 -2
  95. package/dashboard/dist/assets/{EntityTimelinePanel-Ch-BsRu8.js.map → EntityTimelinePanel-DJN_ZEQa.js.map} +1 -1
  96. package/dashboard/dist/assets/{EscalationListSchemaPage-DuSLiInU.js → EscalationListSchemaPage-A4KpTdJA.js} +3 -3
  97. package/dashboard/dist/assets/{EscalationListSchemaPage-DuSLiInU.js.map → EscalationListSchemaPage-A4KpTdJA.js.map} +1 -1
  98. package/dashboard/dist/assets/{EscalationSchemaPage-D_mYri6e.js → EscalationSchemaPage-nfCn42hT.js} +2 -2
  99. package/dashboard/dist/assets/{EscalationSchemaPage-D_mYri6e.js.map → EscalationSchemaPage-nfCn42hT.js.map} +1 -1
  100. package/dashboard/dist/assets/{EscalationTimeline-DiN8ImWF.js → EscalationTimeline-CLvSr1SD.js} +2 -2
  101. package/dashboard/dist/assets/{EscalationTimeline-DiN8ImWF.js.map → EscalationTimeline-CLvSr1SD.js.map} +1 -1
  102. package/dashboard/dist/assets/{EscalationTitleSelect-36tkc2TE.js → EscalationTitleSelect-CT7mYHkb.js} +2 -2
  103. package/dashboard/dist/assets/{EscalationTitleSelect-36tkc2TE.js.map → EscalationTitleSelect-CT7mYHkb.js.map} +1 -1
  104. package/dashboard/dist/assets/{EscalationsOverview-yHY6JKiV.js → EscalationsOverview-CKaGRh-E.js} +2 -2
  105. package/dashboard/dist/assets/{EscalationsOverview-yHY6JKiV.js.map → EscalationsOverview-CKaGRh-E.js.map} +1 -1
  106. package/dashboard/dist/assets/{EventTable-DTtu2iM_.js → EventTable-2ywJsOLy.js} +2 -2
  107. package/dashboard/dist/assets/{EventTable-DTtu2iM_.js.map → EventTable-2ywJsOLy.js.map} +1 -1
  108. package/dashboard/dist/assets/{FilterBar-ByZiD0ty.js → FilterBar-Dy0b7wwf.js} +2 -2
  109. package/dashboard/dist/assets/{FilterBar-ByZiD0ty.js.map → FilterBar-Dy0b7wwf.js.map} +1 -1
  110. package/dashboard/dist/assets/{GraphInvokePage-Cbn6igr_.js → GraphInvokePage-yOVpraAy.js} +2 -2
  111. package/dashboard/dist/assets/{GraphInvokePage-Cbn6igr_.js.map → GraphInvokePage-yOVpraAy.js.map} +1 -1
  112. package/dashboard/dist/assets/{HomePage-CtLKm_S4.js → HomePage-67xXjKjN.js} +2 -2
  113. package/dashboard/dist/assets/{HomePage-CtLKm_S4.js.map → HomePage-67xXjKjN.js.map} +1 -1
  114. package/dashboard/dist/assets/{LinePage-Q5Cgjd3N.js → LinePage-CMsYtukW.js} +3 -3
  115. package/dashboard/dist/assets/{LinePage-Q5Cgjd3N.js.map → LinePage-CMsYtukW.js.map} +1 -1
  116. package/dashboard/dist/assets/{LinesPage-BX3d-rj0.js → LinesPage-pwL46mOS.js} +3 -3
  117. package/dashboard/dist/assets/{LinesPage-BX3d-rj0.js.map → LinesPage-pwL46mOS.js.map} +1 -1
  118. package/dashboard/dist/assets/{ListToolbar-bj2sgAK4.js → ListToolbar-CJmvGy2B.js} +2 -2
  119. package/dashboard/dist/assets/{ListToolbar-bj2sgAK4.js.map → ListToolbar-CJmvGy2B.js.map} +1 -1
  120. package/dashboard/dist/assets/{McpOverview-BD3UWbcC.js → McpOverview-DA9LLvNG.js} +2 -2
  121. package/dashboard/dist/assets/{McpOverview-BD3UWbcC.js.map → McpOverview-DA9LLvNG.js.map} +1 -1
  122. package/dashboard/dist/assets/{McpQueryDetailPage-ISzY-BfT.js → McpQueryDetailPage-N7qLmfE8.js} +2 -2
  123. package/dashboard/dist/assets/{McpQueryDetailPage-ISzY-BfT.js.map → McpQueryDetailPage-N7qLmfE8.js.map} +1 -1
  124. package/dashboard/dist/assets/{McpQueryPage-t555QJ3m.js → McpQueryPage-CpsP3w7x.js} +2 -2
  125. package/dashboard/dist/assets/{McpQueryPage-t555QJ3m.js.map → McpQueryPage-CpsP3w7x.js.map} +1 -1
  126. package/dashboard/dist/assets/{McpRunDetailPage-C4jozQFh.js → McpRunDetailPage-qHRQ1pEY.js} +2 -2
  127. package/dashboard/dist/assets/{McpRunDetailPage-C4jozQFh.js.map → McpRunDetailPage-qHRQ1pEY.js.map} +1 -1
  128. package/dashboard/dist/assets/{McpRunsPage-Z-mtyRBp.js → McpRunsPage-BRDDYpTM.js} +2 -2
  129. package/dashboard/dist/assets/{McpRunsPage-Z-mtyRBp.js.map → McpRunsPage-BRDDYpTM.js.map} +1 -1
  130. package/dashboard/dist/assets/{OperationsPage-ClYilVyZ.js → OperationsPage-zUaab-CL.js} +3 -3
  131. package/dashboard/dist/assets/{OperationsPage-ClYilVyZ.js.map → OperationsPage-zUaab-CL.js.map} +1 -1
  132. package/dashboard/dist/assets/{OperatorDashboard-3Hi2IiHi.js → OperatorDashboard-el5BquXN.js} +2 -2
  133. package/dashboard/dist/assets/{OperatorDashboard-3Hi2IiHi.js.map → OperatorDashboard-el5BquXN.js.map} +1 -1
  134. package/dashboard/dist/assets/{PersonaDetailPage-xb7O3tn9.js → PersonaDetailPage-B_tb8gfl.js} +2 -2
  135. package/dashboard/dist/assets/{PersonaDetailPage-xb7O3tn9.js.map → PersonaDetailPage-B_tb8gfl.js.map} +1 -1
  136. package/dashboard/dist/assets/{PersonasPage-uCYVhRBB.js → PersonasPage-BPI7mqM8.js} +2 -2
  137. package/dashboard/dist/assets/{PersonasPage-uCYVhRBB.js.map → PersonasPage-BPI7mqM8.js.map} +1 -1
  138. package/dashboard/dist/assets/{PortalPage-D1MOMJ9Q.js → PortalPage-e_rBb1do.js} +2 -2
  139. package/dashboard/dist/assets/{PortalPage-D1MOMJ9Q.js.map → PortalPage-e_rBb1do.js.map} +1 -1
  140. package/dashboard/dist/assets/{ProcessDetailPage-Tf8FQCUm.js → ProcessDetailPage-D35RX1bB.js} +2 -2
  141. package/dashboard/dist/assets/{ProcessDetailPage-Tf8FQCUm.js.map → ProcessDetailPage-D35RX1bB.js.map} +1 -1
  142. package/dashboard/dist/assets/{ProcessesListPage-DPLRgznC.js → ProcessesListPage-CT81miI5.js} +2 -2
  143. package/dashboard/dist/assets/{ProcessesListPage-DPLRgznC.js.map → ProcessesListPage-CT81miI5.js.map} +1 -1
  144. package/dashboard/dist/assets/{ResolverForm-BXqJEPte.js → ResolverForm-BxJkoKAO.js} +2 -2
  145. package/dashboard/dist/assets/{ResolverForm-BXqJEPte.js.map → ResolverForm-BxJkoKAO.js.map} +1 -1
  146. package/dashboard/dist/assets/{RoleDetailPage-KJnZGPPY.js → RoleDetailPage-DtU7vsJm.js} +2 -2
  147. package/dashboard/dist/assets/{RoleDetailPage-KJnZGPPY.js.map → RoleDetailPage-DtU7vsJm.js.map} +1 -1
  148. package/dashboard/dist/assets/{RolesPage-C5f-3zcs.js → RolesPage-BE7RWt9q.js} +2 -2
  149. package/dashboard/dist/assets/{RolesPage-C5f-3zcs.js.map → RolesPage-BE7RWt9q.js.map} +1 -1
  150. package/dashboard/dist/assets/{RosterWidget-WCtpUEzc.js → RosterWidget-BJMx0a8Z.js} +2 -2
  151. package/dashboard/dist/assets/{RosterWidget-WCtpUEzc.js.map → RosterWidget-BJMx0a8Z.js.map} +1 -1
  152. package/dashboard/dist/assets/{RunAsSelector-CzabsFYU.js → RunAsSelector-Co6s9bqA.js} +2 -2
  153. package/dashboard/dist/assets/{RunAsSelector-CzabsFYU.js.map → RunAsSelector-Co6s9bqA.js.map} +1 -1
  154. package/dashboard/dist/assets/ScanCodesPage-C2TETaj5.js +2 -0
  155. package/dashboard/dist/assets/ScanCodesPage-C2TETaj5.js.map +1 -0
  156. package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js +5 -0
  157. package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js.map +1 -0
  158. package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js +2 -0
  159. package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js.map +1 -0
  160. package/dashboard/dist/assets/SchemeMatchFields-9H7SmbED.js +4 -0
  161. package/dashboard/dist/assets/SchemeMatchFields-9H7SmbED.js.map +1 -0
  162. package/dashboard/dist/assets/{StickyPagination-C2fzclxr.js → StickyPagination-miUdVAKw.js} +2 -2
  163. package/dashboard/dist/assets/{StickyPagination-C2fzclxr.js.map → StickyPagination-miUdVAKw.js.map} +1 -1
  164. package/dashboard/dist/assets/{StreamMessageDetail-wF4NM8gi.js → StreamMessageDetail-D5Rk7pn7.js} +2 -2
  165. package/dashboard/dist/assets/{StreamMessageDetail-wF4NM8gi.js.map → StreamMessageDetail-D5Rk7pn7.js.map} +1 -1
  166. package/dashboard/dist/assets/{SwimlaneTimeline-B4Hg97qO.js → SwimlaneTimeline-B1QY1ZzH.js} +2 -2
  167. package/dashboard/dist/assets/{SwimlaneTimeline-B4Hg97qO.js.map → SwimlaneTimeline-B1QY1ZzH.js.map} +1 -1
  168. package/dashboard/dist/assets/{TaskDetailPage-DAxxcFDD.js → TaskDetailPage-DKUM37o8.js} +2 -2
  169. package/dashboard/dist/assets/{TaskDetailPage-DAxxcFDD.js.map → TaskDetailPage-DKUM37o8.js.map} +1 -1
  170. package/dashboard/dist/assets/{TasksListPage-BmghuHbc.js → TasksListPage-CUulwvm-.js} +2 -2
  171. package/dashboard/dist/assets/{TasksListPage-BmghuHbc.js.map → TasksListPage-CUulwvm-.js.map} +1 -1
  172. package/dashboard/dist/assets/{TimeAgo-CFeB6U2O.js → TimeAgo-CHTelacB.js} +2 -2
  173. package/dashboard/dist/assets/{TimeAgo-CFeB6U2O.js.map → TimeAgo-CHTelacB.js.map} +1 -1
  174. package/dashboard/dist/assets/{TimestampCell-M_FD9JEc.js → TimestampCell-NanLWLKo.js} +2 -2
  175. package/dashboard/dist/assets/{TimestampCell-M_FD9JEc.js.map → TimestampCell-NanLWLKo.js.map} +1 -1
  176. package/dashboard/dist/assets/{ToolTestPanel-D7PihZG9.js → ToolTestPanel-CF1CHzgz.js} +2 -2
  177. package/dashboard/dist/assets/{ToolTestPanel-D7PihZG9.js.map → ToolTestPanel-CF1CHzgz.js.map} +1 -1
  178. package/dashboard/dist/assets/{TopicDetailPage-T0dLt7Ao.js → TopicDetailPage-CGO8XV_a.js} +2 -2
  179. package/dashboard/dist/assets/{TopicDetailPage-T0dLt7Ao.js.map → TopicDetailPage-CGO8XV_a.js.map} +1 -1
  180. package/dashboard/dist/assets/{TopicsPage-DP5ox5oX.js → TopicsPage-Bt8gOKYr.js} +2 -2
  181. package/dashboard/dist/assets/{TopicsPage-DP5ox5oX.js.map → TopicsPage-Bt8gOKYr.js.map} +1 -1
  182. package/dashboard/dist/assets/{UserName-ET3r3u-A.js → UserName-DKXnK7DD.js} +2 -2
  183. package/dashboard/dist/assets/{UserName-ET3r3u-A.js.map → UserName-DKXnK7DD.js.map} +1 -1
  184. package/dashboard/dist/assets/{WorkflowExecutionPage-DBq2lZ_C.js → WorkflowExecutionPage-Crf7AIFc.js} +2 -2
  185. package/dashboard/dist/assets/{WorkflowExecutionPage-DBq2lZ_C.js.map → WorkflowExecutionPage-Crf7AIFc.js.map} +1 -1
  186. package/dashboard/dist/assets/{WorkflowsDashboard-WO4cH8sU.js → WorkflowsDashboard--isjt06C.js} +2 -2
  187. package/dashboard/dist/assets/{WorkflowsDashboard-WO4cH8sU.js.map → WorkflowsDashboard--isjt06C.js.map} +1 -1
  188. package/dashboard/dist/assets/{WorkflowsOverview-CJfg0rQH.js → WorkflowsOverview-D7Oqf4-V.js} +2 -2
  189. package/dashboard/dist/assets/{WorkflowsOverview-CJfg0rQH.js.map → WorkflowsOverview-D7Oqf4-V.js.map} +1 -1
  190. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C8rkvYCp.js → YamlWorkflowDetailPage-B0wxgrGP.js} +8 -8
  191. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C8rkvYCp.js.map → YamlWorkflowDetailPage-B0wxgrGP.js.map} +1 -1
  192. package/dashboard/dist/assets/{YamlWorkflowsPage-DHQ4ZVzM.js → YamlWorkflowsPage-BVdLnm6K.js} +2 -2
  193. package/dashboard/dist/assets/{YamlWorkflowsPage-DHQ4ZVzM.js.map → YamlWorkflowsPage-BVdLnm6K.js.map} +1 -1
  194. package/dashboard/dist/assets/{agents-zulmHig2.js → agents-CHjbjHXA.js} +2 -2
  195. package/dashboard/dist/assets/{agents-zulmHig2.js.map → agents-CHjbjHXA.js.map} +1 -1
  196. package/dashboard/dist/assets/{bots-D4mtcPHB.js → bots-WrUhEPWs.js} +2 -2
  197. package/dashboard/dist/assets/{bots-D4mtcPHB.js.map → bots-WrUhEPWs.js.map} +1 -1
  198. package/dashboard/dist/assets/{capabilities-rFZDH0zF.js → capabilities-CunMmkj8.js} +2 -2
  199. package/dashboard/dist/assets/{capabilities-rFZDH0zF.js.map → capabilities-CunMmkj8.js.map} +1 -1
  200. package/dashboard/dist/assets/{controlplane-INfcW_9F.js → controlplane-D6IZIZoh.js} +2 -2
  201. package/dashboard/dist/assets/{controlplane-INfcW_9F.js.map → controlplane-D6IZIZoh.js.map} +1 -1
  202. package/dashboard/dist/assets/{escalation-columns-8ker-czW.js → escalation-columns-Bvo6JI4Z.js} +2 -2
  203. package/dashboard/dist/assets/{escalation-columns-8ker-czW.js.map → escalation-columns-Bvo6JI4Z.js.map} +1 -1
  204. package/dashboard/dist/assets/{escalation-items-B6eDMoTN.js → escalation-items-DFGRwo49.js} +2 -2
  205. package/dashboard/dist/assets/{escalation-items-B6eDMoTN.js.map → escalation-items-DFGRwo49.js.map} +1 -1
  206. package/dashboard/dist/assets/{index-Cfg4TFDb.js → index-B8qrHwp9.js} +2 -2
  207. package/dashboard/dist/assets/{index-Cfg4TFDb.js.map → index-B8qrHwp9.js.map} +1 -1
  208. package/dashboard/dist/assets/{index-D-Fd0gQ_.js → index-B95LbYhW.js} +2 -2
  209. package/dashboard/dist/assets/{index-D-Fd0gQ_.js.map → index-B95LbYhW.js.map} +1 -1
  210. package/dashboard/dist/assets/{index-BpillEP7.js → index-BZFSXEkr.js} +2 -2
  211. package/dashboard/dist/assets/{index-BpillEP7.js.map → index-BZFSXEkr.js.map} +1 -1
  212. package/dashboard/dist/assets/index-BmzscsXK.css +1 -0
  213. package/dashboard/dist/assets/{index-ChF-l2z9.js → index-Bo8QU31k.js} +2 -2
  214. package/dashboard/dist/assets/{index-ChF-l2z9.js.map → index-Bo8QU31k.js.map} +1 -1
  215. package/dashboard/dist/assets/{index-0LXkjZjt.js → index-C7EIu1mG.js} +2 -2
  216. package/dashboard/dist/assets/{index-0LXkjZjt.js.map → index-C7EIu1mG.js.map} +1 -1
  217. package/dashboard/dist/assets/{index-Cm6_Peh7.js → index-CpCchhQv.js} +2 -2
  218. package/dashboard/dist/assets/{index-Cm6_Peh7.js.map → index-CpCchhQv.js.map} +1 -1
  219. package/dashboard/dist/assets/{index-5XUBZtlv.js → index-DCJ483vt.js} +2 -2
  220. package/dashboard/dist/assets/{index-5XUBZtlv.js.map → index-DCJ483vt.js.map} +1 -1
  221. package/dashboard/dist/assets/{index-BcVkiaCv.js → index-DRK7M1_9.js} +2 -2
  222. package/dashboard/dist/assets/{index-BcVkiaCv.js.map → index-DRK7M1_9.js.map} +1 -1
  223. package/dashboard/dist/assets/{index-D-EVgGsm.js → index-DRw0FXdX.js} +2 -2
  224. package/dashboard/dist/assets/{index-D-EVgGsm.js.map → index-DRw0FXdX.js.map} +1 -1
  225. package/dashboard/dist/assets/{index-CV7KmPdF.js → index-OuKQ_0eB.js} +2 -2
  226. package/dashboard/dist/assets/{index-CV7KmPdF.js.map → index-OuKQ_0eB.js.map} +1 -1
  227. package/dashboard/dist/assets/index-P-DlgAWj.js +3 -0
  228. package/dashboard/dist/assets/index-P-DlgAWj.js.map +1 -0
  229. package/dashboard/dist/assets/{index-Cg9W61lM.js → index-boT612Jo.js} +2 -2
  230. package/dashboard/dist/assets/{index-Cg9W61lM.js.map → index-boT612Jo.js.map} +1 -1
  231. package/dashboard/dist/assets/index-ygxyAKcc.js +67 -0
  232. package/dashboard/dist/assets/index-ygxyAKcc.js.map +1 -0
  233. package/dashboard/dist/assets/{knowledge-_WaBsrbC.js → knowledge-BubJBTwg.js} +2 -2
  234. package/dashboard/dist/assets/{knowledge-_WaBsrbC.js.map → knowledge-BubJBTwg.js.map} +1 -1
  235. package/dashboard/dist/assets/{machines-D6ig2Q8z.js → machines-DSm5NFgs.js} +2 -2
  236. package/dashboard/dist/assets/{machines-D6ig2Q8z.js.map → machines-DSm5NFgs.js.map} +1 -1
  237. package/dashboard/dist/assets/{mcp-DtWRQM1G.js → mcp-D6MckqOV.js} +2 -2
  238. package/dashboard/dist/assets/{mcp-DtWRQM1G.js.map → mcp-D6MckqOV.js.map} +1 -1
  239. package/dashboard/dist/assets/{mcp-query-vQm92kTd.js → mcp-query-VyCdOag6.js} +2 -2
  240. package/dashboard/dist/assets/{mcp-query-vQm92kTd.js.map → mcp-query-VyCdOag6.js.map} +1 -1
  241. package/dashboard/dist/assets/{personas-BLxQpGNz.js → personas-CyJc10xe.js} +2 -2
  242. package/dashboard/dist/assets/{personas-BLxQpGNz.js.map → personas-CyJc10xe.js.map} +1 -1
  243. package/dashboard/dist/assets/{pipelines-ClmRtlkR.js → pipelines-B2inDtx3.js} +2 -2
  244. package/dashboard/dist/assets/{pipelines-ClmRtlkR.js.map → pipelines-B2inDtx3.js.map} +1 -1
  245. package/dashboard/dist/assets/{tasks-CVZT1pf0.js → tasks-DOP4d3M6.js} +2 -2
  246. package/dashboard/dist/assets/{tasks-CVZT1pf0.js.map → tasks-DOP4d3M6.js.map} +1 -1
  247. package/dashboard/dist/assets/{topics-rkG9-6El.js → topics-CNOjSWpX.js} +2 -2
  248. package/dashboard/dist/assets/{topics-rkG9-6El.js.map → topics-CNOjSWpX.js.map} +1 -1
  249. package/dashboard/dist/assets/{useDebouncedValue-D2aCC74y.js → useDebouncedValue-CgO0TGMd.js} +2 -2
  250. package/dashboard/dist/assets/{useDebouncedValue-D2aCC74y.js.map → useDebouncedValue-CgO0TGMd.js.map} +1 -1
  251. package/dashboard/dist/assets/{useNamespace-BGfkF4ej.js → useNamespace-BWHvUKtK.js} +2 -2
  252. package/dashboard/dist/assets/{useNamespace-BGfkF4ej.js.map → useNamespace-BWHvUKtK.js.map} +1 -1
  253. package/dashboard/dist/assets/{useYamlActivityEvents-DOU0_nfZ.js → useYamlActivityEvents-BZQ__ZGD.js} +2 -2
  254. package/dashboard/dist/assets/{useYamlActivityEvents-DOU0_nfZ.js.map → useYamlActivityEvents-BZQ__ZGD.js.map} +1 -1
  255. package/dashboard/dist/assets/{validate-bHZ917pZ.js → validate-CAin6WM_.js} +2 -2
  256. package/dashboard/dist/assets/{validate-bHZ917pZ.js.map → validate-CAin6WM_.js.map} +1 -1
  257. package/dashboard/dist/assets/{yaml-workflows-S7qlgdg6.js → yaml-workflows-Dyln3od-.js} +2 -2
  258. package/dashboard/dist/assets/{yaml-workflows-S7qlgdg6.js.map → yaml-workflows-Dyln3od-.js.map} +1 -1
  259. package/dashboard/dist/index.html +2 -2
  260. package/docs/accumulator.md +1 -1
  261. package/docs/api/http/escalations.md +1 -1
  262. package/docs/api/mcp/human-queue.md +5 -1
  263. package/docs/api/sdk/escalations.md +1 -1
  264. package/docs/dashboard.md +4 -2
  265. package/docs/hitl/escalation.md +16 -0
  266. package/docs/hitl/lookups.md +2 -0
  267. package/docs/mcp.md +2 -0
  268. package/docs/scan-codes.md +34 -11
  269. package/package.json +2 -2
  270. package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js +0 -2
  271. package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js.map +0 -1
  272. package/dashboard/dist/assets/ScanCodesPage-D51d17HH.js +0 -2
  273. package/dashboard/dist/assets/ScanCodesPage-D51d17HH.js.map +0 -1
  274. package/dashboard/dist/assets/ScanSchemeDetailPage-CUK6Skxj.js +0 -2
  275. package/dashboard/dist/assets/ScanSchemeDetailPage-CUK6Skxj.js.map +0 -1
  276. package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js +0 -2
  277. package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js.map +0 -1
  278. package/dashboard/dist/assets/index-BpJ77OST.js +0 -3
  279. package/dashboard/dist/assets/index-BpJ77OST.js.map +0 -1
  280. package/dashboard/dist/assets/index-C_dp4WgY.css +0 -1
  281. package/dashboard/dist/assets/index-xycFf66M.js +0 -67
  282. package/dashboard/dist/assets/index-xycFf66M.js.map +0 -1
@@ -18,8 +18,9 @@ SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2
18
18
  exports.UPSERT_SCHEME = `\
19
19
  INSERT INTO lt_config_scan_schemes
20
20
  (version, name, description, target_facet, encoding, delimiter, target_length,
21
- kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)
22
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
21
+ kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,
22
+ patterns, precedes_gtin, target_match)
23
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
23
24
  ON CONFLICT (version) DO UPDATE SET
24
25
  name = EXCLUDED.name,
25
26
  description = EXCLUDED.description,
@@ -31,6 +32,9 @@ ON CONFLICT (version) DO UPDATE SET
31
32
  grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,
32
33
  grant_max_uses = EXCLUDED.grant_max_uses,
33
34
  grant_scope = EXCLUDED.grant_scope,
35
+ patterns = EXCLUDED.patterns,
36
+ precedes_gtin = EXCLUDED.precedes_gtin,
37
+ target_match = EXCLUDED.target_match,
34
38
  enabled = EXCLUDED.enabled
35
39
  RETURNING *`;
36
40
  exports.DELETE_SCHEME = `\
@@ -54,8 +58,9 @@ DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2`;
54
58
  exports.SEED_SCHEME = `\
55
59
  INSERT INTO lt_config_scan_schemes
56
60
  (version, name, description, target_facet, encoding, delimiter, target_length,
57
- kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)
58
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
61
+ kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,
62
+ patterns, precedes_gtin, target_match)
63
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
59
64
  ON CONFLICT (version) DO NOTHING`;
60
65
  exports.SEED_ACTION = `\
61
66
  INSERT INTO lt_config_scan_actions
@@ -73,8 +78,9 @@ ON CONFLICT (scheme_version, category) DO NOTHING`;
73
78
  exports.APPLY_SCHEME = `\
74
79
  INSERT INTO lt_config_scan_schemes
75
80
  (version, name, description, target_facet, encoding, delimiter, target_length,
76
- kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)
77
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
81
+ kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,
82
+ patterns, precedes_gtin, target_match)
83
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
78
84
  ON CONFLICT (version) DO UPDATE SET
79
85
  name = EXCLUDED.name,
80
86
  description = EXCLUDED.description,
@@ -86,6 +92,9 @@ ON CONFLICT (version) DO UPDATE SET
86
92
  grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,
87
93
  grant_max_uses = EXCLUDED.grant_max_uses,
88
94
  grant_scope = EXCLUDED.grant_scope,
95
+ patterns = EXCLUDED.patterns,
96
+ precedes_gtin = EXCLUDED.precedes_gtin,
97
+ target_match = EXCLUDED.target_match,
89
98
  enabled = EXCLUDED.enabled,
90
99
  updated_at = NOW()
91
100
  WHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,
@@ -93,12 +102,14 @@ WHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,
93
102
  lt_config_scan_schemes.delimiter, lt_config_scan_schemes.target_length,
94
103
  lt_config_scan_schemes.kind, lt_config_scan_schemes.grant_ttl_seconds,
95
104
  lt_config_scan_schemes.grant_max_uses, lt_config_scan_schemes.enabled,
96
- lt_config_scan_schemes.grant_scope)
105
+ lt_config_scan_schemes.grant_scope, lt_config_scan_schemes.patterns,
106
+ lt_config_scan_schemes.precedes_gtin, lt_config_scan_schemes.target_match)
97
107
  IS DISTINCT FROM
98
108
  (EXCLUDED.name, EXCLUDED.description, EXCLUDED.target_facet,
99
109
  EXCLUDED.encoding, EXCLUDED.delimiter, EXCLUDED.target_length,
100
110
  EXCLUDED.kind, EXCLUDED.grant_ttl_seconds, EXCLUDED.grant_max_uses,
101
- EXCLUDED.enabled, EXCLUDED.grant_scope)
111
+ EXCLUDED.enabled, EXCLUDED.grant_scope, EXCLUDED.patterns,
112
+ EXCLUDED.precedes_gtin, EXCLUDED.target_match)
102
113
  RETURNING (xmax = 0) AS inserted`;
103
114
  exports.APPLY_ACTION = `\
104
115
  INSERT INTO lt_config_scan_actions
@@ -0,0 +1,16 @@
1
+ import { type ScanScheme } from '../../types';
2
+ /**
3
+ * The pattern-encoding fields and the target match. A pattern scheme
4
+ * declares 1 to SCAN_PATTERNS_MAX expressions, each compiling and none
5
+ * matching an empty code; other encodings declare none. A list-valued
6
+ * target (`member`) applies to action schemes, whose targets resolve
7
+ * against escalation metadata.
8
+ */
9
+ export declare function assertValidPatternFields(scheme: Partial<ScanScheme>): void;
10
+ /**
11
+ * A pattern scheme and an enabled gtin scheme may both read a digits-only
12
+ * code, so while both are enabled the pattern scheme declares which reads it
13
+ * first (`precedes_gtin`). Checked from either side of the pair; throws
14
+ * naming both schemes.
15
+ */
16
+ export declare function assertGtinOrderDeclared(candidate: Partial<ScanScheme>, others: ScanScheme[]): void;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertValidPatternFields = assertValidPatternFields;
4
+ exports.assertGtinOrderDeclared = assertGtinOrderDeclared;
5
+ const types_1 = require("../../types");
6
+ const scan_code_1 = require("../../shared/scan-code");
7
+ /**
8
+ * The pattern-encoding fields and the target match. A pattern scheme
9
+ * declares 1 to SCAN_PATTERNS_MAX expressions, each compiling and none
10
+ * matching an empty code; other encodings declare none. A list-valued
11
+ * target (`member`) applies to action schemes, whose targets resolve
12
+ * against escalation metadata.
13
+ */
14
+ function assertValidPatternFields(scheme) {
15
+ const encoding = scheme.encoding ?? types_1.SCAN_ENCODINGS.FIXED;
16
+ const patterns = scheme.patterns ?? [];
17
+ if (!Array.isArray(patterns))
18
+ throw new Error('patterns must be a list of regular expressions');
19
+ if (encoding === types_1.SCAN_ENCODINGS.PATTERN) {
20
+ if (patterns.length < 1 || patterns.length > types_1.SCAN_PATTERNS_MAX) {
21
+ throw new Error(`pattern encoding requires 1 to ${types_1.SCAN_PATTERNS_MAX} patterns`);
22
+ }
23
+ for (const pattern of patterns)
24
+ assertValidPattern(pattern);
25
+ }
26
+ else {
27
+ if (patterns.length > 0)
28
+ throw new Error('patterns apply only to pattern encoding');
29
+ if (scheme.precedes_gtin === true)
30
+ throw new Error('precedes_gtin applies only to pattern encoding');
31
+ }
32
+ const match = scheme.target_match ?? types_1.SCAN_TARGET_MATCH.VALUE;
33
+ if (!Object.values(types_1.SCAN_TARGET_MATCH).includes(match)) {
34
+ throw new Error(`unknown target_match "${match}"`);
35
+ }
36
+ if (match === types_1.SCAN_TARGET_MATCH.MEMBER && (scheme.kind ?? types_1.SCAN_SCHEME_KINDS.ACTION) !== types_1.SCAN_SCHEME_KINDS.ACTION) {
37
+ throw new Error('target_match member applies only to action schemes');
38
+ }
39
+ }
40
+ /**
41
+ * A pattern scheme and an enabled gtin scheme may both read a digits-only
42
+ * code, so while both are enabled the pattern scheme declares which reads it
43
+ * first (`precedes_gtin`). Checked from either side of the pair; throws
44
+ * naming both schemes.
45
+ */
46
+ function assertGtinOrderDeclared(candidate, others) {
47
+ if (!(candidate.enabled ?? true))
48
+ return;
49
+ const encoding = candidate.encoding ?? types_1.SCAN_ENCODINGS.FIXED;
50
+ if (encoding === types_1.SCAN_ENCODINGS.PATTERN && candidate.precedes_gtin == null) {
51
+ const gtin = others.find((s) => s.enabled && s.encoding === types_1.SCAN_ENCODINGS.GTIN);
52
+ if (gtin) {
53
+ throw new Error(`gtin scheme ${gtin.version} ("${gtin.name}") also reads digits-only codes; declare precedes_gtin: true to read them with these patterns first, or false to leave them to the gtin scheme`);
54
+ }
55
+ }
56
+ if (encoding === types_1.SCAN_ENCODINGS.GTIN) {
57
+ const pattern = others.find((s) => s.enabled && s.encoding === types_1.SCAN_ENCODINGS.PATTERN && s.precedes_gtin == null);
58
+ if (pattern) {
59
+ throw new Error(`pattern scheme ${pattern.version} ("${pattern.name}") has not declared precedes_gtin; declare whether its patterns read digits-only codes before the gtin scheme, then enable the gtin scheme`);
60
+ }
61
+ }
62
+ }
63
+ function assertValidPattern(pattern) {
64
+ if (typeof pattern !== 'string' || pattern.length === 0) {
65
+ throw new Error('each pattern must be a non-empty string');
66
+ }
67
+ if (pattern.length > types_1.SCAN_PATTERN_MAX_LENGTH) {
68
+ throw new Error(`pattern "${pattern.slice(0, 32)}…" exceeds ${types_1.SCAN_PATTERN_MAX_LENGTH} characters`);
69
+ }
70
+ const regex = (0, scan_code_1.compilePattern)(pattern);
71
+ if (!regex)
72
+ throw new Error(`pattern "${pattern}" is not a valid regular expression`);
73
+ if (regex.test(''))
74
+ throw new Error(`pattern "${pattern}" matches an empty code`);
75
+ }
@@ -9,7 +9,9 @@ export declare function assertValidScheme(scheme: Partial<ScanScheme>): void;
9
9
  * A scheme must read codes no other scheme reads. Delimited and fixed
10
10
  * schemes are told apart by their version prefix; a gtin scheme has none,
11
11
  * so there is at most one, and no enabled fixed scheme may accept a GTIN
12
- * length while it is enabled. Throws naming both schemes.
12
+ * length while it is enabled. Pattern schemes read only codes no prefixed
13
+ * scheme reads, lowest version first, and beside an enabled gtin scheme
14
+ * they declare `precedes_gtin`. Throws naming both schemes.
13
15
  */
14
16
  export declare function assertSchemesCoexist(candidate: Partial<ScanScheme>, existing: ScanScheme[]): void;
15
17
  /** Identity rules never walk steps — their fallback is the unknown-badge screen. */
@@ -10,6 +10,7 @@ const facet_sql_1 = require("../escalation/facet-sql");
10
10
  const validate_subject_1 = require("./validate-subject");
11
11
  const validate_query_1 = require("./validate-query");
12
12
  const validate_facts_1 = require("./validate-facts");
13
+ const validate_scheme_pattern_1 = require("./validate-scheme-pattern");
13
14
  const VALID_VERBS = new Set(Object.values(types_1.SCAN_VERBS));
14
15
  /** Double-scan selection tokens — short, label-printable, never scheme-shaped. */
15
16
  const CHOICE_CODE = /^[A-Za-z0-9_-]{1,32}$/;
@@ -68,15 +69,19 @@ function assertValidScheme(scheme) {
68
69
  || (scheme.grant_scope ?? types_1.SCAN_GRANT_SCOPES.ACTION) !== types_1.SCAN_GRANT_SCOPES.ACTION) {
69
70
  throw new Error('grant policy applies only to identity schemes');
70
71
  }
72
+ (0, validate_scheme_pattern_1.assertValidPatternFields)(scheme);
71
73
  }
72
74
  /**
73
75
  * A scheme must read codes no other scheme reads. Delimited and fixed
74
76
  * schemes are told apart by their version prefix; a gtin scheme has none,
75
77
  * so there is at most one, and no enabled fixed scheme may accept a GTIN
76
- * length while it is enabled. Throws naming both schemes.
78
+ * length while it is enabled. Pattern schemes read only codes no prefixed
79
+ * scheme reads, lowest version first, and beside an enabled gtin scheme
80
+ * they declare `precedes_gtin`. Throws naming both schemes.
77
81
  */
78
82
  function assertSchemesCoexist(candidate, existing) {
79
83
  const others = existing.filter((s) => s.version !== candidate.version);
84
+ (0, validate_scheme_pattern_1.assertGtinOrderDeclared)(candidate, others);
80
85
  const encoding = candidate.encoding ?? types_1.SCAN_ENCODINGS.FIXED;
81
86
  const enabled = candidate.enabled ?? true;
82
87
  if (encoding === types_1.SCAN_ENCODINGS.GTIN) {
@@ -11,6 +11,9 @@ export interface ScanSchemeInput {
11
11
  grant_ttl_seconds?: number | null;
12
12
  grant_max_uses?: number;
13
13
  grant_scope?: ScanScheme['grant_scope'];
14
+ patterns?: string[];
15
+ precedes_gtin?: boolean | null;
16
+ target_match?: ScanScheme['target_match'];
14
17
  enabled?: boolean;
15
18
  }
16
19
  export interface ScanRuleInput {
@@ -32,6 +32,9 @@ function schemeParams(input) {
32
32
  input.grant_max_uses ?? 0,
33
33
  input.enabled ?? true,
34
34
  input.grant_scope ?? types_1.SCAN_GRANT_SCOPES.ACTION,
35
+ JSON.stringify(input.patterns ?? []),
36
+ input.encoding === types_1.SCAN_ENCODINGS.PATTERN ? input.precedes_gtin ?? null : null,
37
+ input.target_match ?? types_1.SCAN_TARGET_MATCH.VALUE,
35
38
  ];
36
39
  }
37
40
  function ruleParams(input) {
@@ -1,2 +1,3 @@
1
- export { parseScanCode, fixedCodeLengths, type ParseableScheme, type ParsedCode, type ScanParseFailure, type ScanParseResult, } from './parse';
1
+ export { parseScanCode, fixedCodeLengths, compilePattern, patternsMatch, PATTERN_CODE_MAX_LENGTH, unanchorPattern, type ParseableScheme, type ParsedCode, type ScanParseFailure, type ScanParseResult, } from './parse';
2
+ export { facetHolds, facetTarget } from './target';
2
3
  export { isValidGtin, normalizeGtin, displayGtin, GTIN_CODE_LENGTHS } from './gtin';
@@ -1,9 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GTIN_CODE_LENGTHS = exports.displayGtin = exports.normalizeGtin = exports.isValidGtin = exports.fixedCodeLengths = exports.parseScanCode = void 0;
3
+ exports.GTIN_CODE_LENGTHS = exports.displayGtin = exports.normalizeGtin = exports.isValidGtin = exports.facetTarget = exports.facetHolds = exports.unanchorPattern = exports.PATTERN_CODE_MAX_LENGTH = exports.patternsMatch = exports.compilePattern = exports.fixedCodeLengths = exports.parseScanCode = void 0;
4
4
  var parse_1 = require("./parse");
5
5
  Object.defineProperty(exports, "parseScanCode", { enumerable: true, get: function () { return parse_1.parseScanCode; } });
6
6
  Object.defineProperty(exports, "fixedCodeLengths", { enumerable: true, get: function () { return parse_1.fixedCodeLengths; } });
7
+ Object.defineProperty(exports, "compilePattern", { enumerable: true, get: function () { return parse_1.compilePattern; } });
8
+ Object.defineProperty(exports, "patternsMatch", { enumerable: true, get: function () { return parse_1.patternsMatch; } });
9
+ Object.defineProperty(exports, "PATTERN_CODE_MAX_LENGTH", { enumerable: true, get: function () { return parse_1.PATTERN_CODE_MAX_LENGTH; } });
10
+ Object.defineProperty(exports, "unanchorPattern", { enumerable: true, get: function () { return parse_1.unanchorPattern; } });
11
+ var target_1 = require("./target");
12
+ Object.defineProperty(exports, "facetHolds", { enumerable: true, get: function () { return target_1.facetHolds; } });
13
+ Object.defineProperty(exports, "facetTarget", { enumerable: true, get: function () { return target_1.facetTarget; } });
7
14
  var gtin_1 = require("./gtin");
8
15
  Object.defineProperty(exports, "isValidGtin", { enumerable: true, get: function () { return gtin_1.isValidGtin; } });
9
16
  Object.defineProperty(exports, "normalizeGtin", { enumerable: true, get: function () { return gtin_1.normalizeGtin; } });
@@ -2,9 +2,13 @@
2
2
  export interface ParseableScheme {
3
3
  version: number;
4
4
  name: string;
5
- encoding: 'fixed' | 'delimited' | 'gtin';
5
+ encoding: 'fixed' | 'delimited' | 'gtin' | 'pattern';
6
6
  delimiter: string;
7
7
  target_length: number | null;
8
+ /** Pattern encoding: regular expressions over the whole code. */
9
+ patterns?: string[];
10
+ /** Pattern encoding: true reads a digits-only code before the gtin scheme does. */
11
+ precedes_gtin?: boolean | null;
8
12
  enabled: boolean;
9
13
  }
10
14
  export interface ParsedCode {
@@ -27,6 +31,12 @@ export type ScanParseResult<S extends ParseableScheme = ParseableScheme> = {
27
31
  ok: false;
28
32
  failure: ScanParseFailure;
29
33
  };
34
+ /**
35
+ * The longest code a pattern scheme reads. Declared expressions run only on
36
+ * codes up to this length, which bounds their cost on any input; carrier
37
+ * tracking numbers run to 34 characters.
38
+ */
39
+ export declare const PATTERN_CODE_MAX_LENGTH = 64;
30
40
  /**
31
41
  * Parse a raw scan string against the configured schemes.
32
42
  *
@@ -40,7 +50,18 @@ export type ScanParseResult<S extends ParseableScheme = ParseableScheme> = {
40
50
  * when a gtin scheme is configured and its check digit holds: the target is
41
51
  * the 14-digit GTIN and the category is '0'. Config validation keeps fixed
42
52
  * and gtin lengths apart, so the order here never decides a real code.
53
+ *
54
+ * A code no prefixed scheme reads is matched against the pattern schemes'
55
+ * declared expressions, lowest version first: the target is the code as
56
+ * scanned and the category is '0'. A pattern scheme with `precedes_gtin`
57
+ * reads a digits-only code before the gtin scheme does.
43
58
  */
44
59
  export declare function parseScanCode<S extends ParseableScheme>(raw: string, schemes: S[]): ScanParseResult<S>;
60
+ /** True when the code is within the pattern length and one of the expressions matches all of it. */
61
+ export declare function patternsMatch(patterns: string[], code: string): boolean;
62
+ /** A declared expression anchored to the whole code; null when it does not compile. */
63
+ export declare function compilePattern(pattern: string): RegExp | null;
64
+ /** The expression without one leading `^` and one unescaped trailing `$`. */
65
+ export declare function unanchorPattern(pattern: string): string;
45
66
  /** The total code lengths a fixed scheme accepts (with and without the check-digit slack). */
46
67
  export declare function fixedCodeLengths(scheme: Pick<ParseableScheme, 'target_length'>): number[];
@@ -2,10 +2,21 @@
2
2
  // Scan-code parsing. Pure and isomorphic: the server parses every scan with
3
3
  // it, and the dashboard parses locally to route a scan into an open form.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.PATTERN_CODE_MAX_LENGTH = void 0;
5
6
  exports.parseScanCode = parseScanCode;
7
+ exports.patternsMatch = patternsMatch;
8
+ exports.compilePattern = compilePattern;
9
+ exports.unanchorPattern = unanchorPattern;
6
10
  exports.fixedCodeLengths = fixedCodeLengths;
7
11
  const gtin_1 = require("./gtin");
8
12
  const GTIN_CATEGORY = '0';
13
+ const PATTERN_CATEGORY = '0';
14
+ /**
15
+ * The longest code a pattern scheme reads. Declared expressions run only on
16
+ * codes up to this length, which bounds their cost on any input; carrier
17
+ * tracking numbers run to 34 characters.
18
+ */
19
+ exports.PATTERN_CODE_MAX_LENGTH = 64;
9
20
  /**
10
21
  * Parse a raw scan string against the configured schemes.
11
22
  *
@@ -19,16 +30,31 @@ const GTIN_CATEGORY = '0';
19
30
  * when a gtin scheme is configured and its check digit holds: the target is
20
31
  * the 14-digit GTIN and the category is '0'. Config validation keeps fixed
21
32
  * and gtin lengths apart, so the order here never decides a real code.
33
+ *
34
+ * A code no prefixed scheme reads is matched against the pattern schemes'
35
+ * declared expressions, lowest version first: the target is the code as
36
+ * scanned and the category is '0'. A pattern scheme with `precedes_gtin`
37
+ * reads a digits-only code before the gtin scheme does.
22
38
  */
23
39
  function parseScanCode(raw, schemes) {
24
40
  const code = raw.trim();
25
41
  if (!code) {
26
42
  return { ok: false, failure: { reason: 'empty', detail: 'empty scan code' } };
27
43
  }
44
+ const prefixed = parsePrefixed(code, schemes);
45
+ if (prefixed.ok)
46
+ return prefixed;
47
+ return parsePattern(code, schemes, false) ?? prefixed;
48
+ }
49
+ /** The fixed, gtin and delimited reading of a code, with the gtin-first pattern schemes. */
50
+ function parsePrefixed(code, schemes) {
28
51
  if (/^[0-9]+$/.test(code)) {
29
52
  const fixed = schemes.find((s) => s.encoding === 'fixed' && s.version === Number(code.slice(0, 2)));
30
53
  const fixedFits = fixed?.enabled && fitsFixed(code, fixed);
31
54
  if (!fixedFits) {
55
+ const first = parsePattern(code, schemes, true);
56
+ if (first)
57
+ return first;
32
58
  const gtin = parseGtin(code, schemes);
33
59
  if (gtin)
34
60
  return gtin;
@@ -58,6 +84,9 @@ function parseScanCode(raw, schemes) {
58
84
  if (scheme.encoding === 'gtin') {
59
85
  return malformed(scheme, 'reads manufacturer barcodes, which carry no scheme prefix');
60
86
  }
87
+ if (scheme.encoding === 'pattern') {
88
+ return malformed(scheme, 'reads codes by its declared patterns, which carry no scheme prefix');
89
+ }
61
90
  if (scheme.encoding === 'delimited') {
62
91
  return parseDelimited(code, version, scheme);
63
92
  }
@@ -87,6 +116,55 @@ function parseGtin(code, schemes) {
87
116
  scheme: gtin,
88
117
  };
89
118
  }
119
+ /**
120
+ * The pattern scheme whose expressions match the whole code, lowest version
121
+ * first, or null. `gtinFirst` limits the search to schemes that precede gtin.
122
+ * A match on a disabled scheme only answers when no enabled one matches.
123
+ */
124
+ function parsePattern(code, schemes, gtinFirst) {
125
+ const matching = schemes
126
+ .filter((s) => s.encoding === 'pattern' && (!gtinFirst || s.precedes_gtin))
127
+ .filter((s) => patternsMatch(s.patterns ?? [], code))
128
+ .sort((a, b) => a.version - b.version);
129
+ const scheme = matching.find((s) => s.enabled) ?? matching[0];
130
+ if (!scheme)
131
+ return null;
132
+ if (!scheme.enabled) {
133
+ return {
134
+ ok: false,
135
+ failure: { reason: 'scheme_disabled', detail: `scan scheme ${scheme.version} ("${scheme.name}") is disabled` },
136
+ };
137
+ }
138
+ return { ok: true, parsed: { version: scheme.version, category: PATTERN_CATEGORY, target: code }, scheme };
139
+ }
140
+ /** True when the code is within the pattern length and one of the expressions matches all of it. */
141
+ function patternsMatch(patterns, code) {
142
+ if (code.length > exports.PATTERN_CODE_MAX_LENGTH)
143
+ return false;
144
+ return patterns.some((p) => compilePattern(p)?.test(code));
145
+ }
146
+ const compiled = new Map();
147
+ /** A declared expression anchored to the whole code; null when it does not compile. */
148
+ function compilePattern(pattern) {
149
+ if (compiled.has(pattern))
150
+ return compiled.get(pattern);
151
+ let regex;
152
+ try {
153
+ regex = new RegExp(`^(?:${unanchorPattern(pattern)})$`);
154
+ }
155
+ catch {
156
+ regex = null;
157
+ }
158
+ compiled.set(pattern, regex);
159
+ return regex;
160
+ }
161
+ /** The expression without one leading `^` and one unescaped trailing `$`. */
162
+ function unanchorPattern(pattern) {
163
+ let body = pattern.startsWith('^') ? pattern.slice(1) : pattern;
164
+ if (body.endsWith('$') && !body.endsWith('\\$'))
165
+ body = body.slice(0, -1);
166
+ return body;
167
+ }
90
168
  function parseDelimited(code, version, scheme) {
91
169
  const d = scheme.delimiter;
92
170
  // version(2 digits) <d> category(1 digit) <d> target(rest, non-empty)
@@ -0,0 +1,4 @@
1
+ /** True when the facet holds the target: equal to it, or a list containing it. */
2
+ export declare function facetHolds(value: unknown, target: string): boolean;
3
+ /** The target a row's facet names: the value, or the first member of a list. */
4
+ export declare function facetTarget(value: unknown): string | null;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ // How a row's facet value matches a scanned target. Pure and isomorphic.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.facetHolds = facetHolds;
5
+ exports.facetTarget = facetTarget;
6
+ /** True when the facet holds the target: equal to it, or a list containing it. */
7
+ function facetHolds(value, target) {
8
+ return Array.isArray(value) ? value.includes(target) : value === target;
9
+ }
10
+ /** The target a row's facet names: the value, or the first member of a list. */
11
+ function facetTarget(value) {
12
+ const first = Array.isArray(value) ? value[0] : value;
13
+ return typeof first === 'string' && first ? first : null;
14
+ }