@hotmeshio/long-tail 0.30.1 → 0.30.3
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.
- package/build/api/escalations/accumulate.d.ts +2 -1
- package/build/api/escalations/accumulate.js +2 -1
- package/build/api/escalations/metadata.d.ts +3 -2
- package/build/api/escalations/metadata.js +4 -3
- package/build/api/escalations/resolve-batch.d.ts +3 -1
- package/build/api/escalations/resolve-batch.js +14 -1
- package/build/api/scan-codes/choice.js +3 -2
- package/build/api/scan-codes/context.d.ts +6 -0
- package/build/api/scan-codes/context.js +10 -1
- package/build/api/scan-codes/locate.js +1 -0
- package/build/api/scan-codes/subject.js +32 -3
- package/build/api/scan-codes/verb-accumulate.js +1 -1
- package/build/api/scan-codes/verb-fill.js +3 -2
- package/build/api/scan-codes/verb-into-subject.js +2 -2
- package/build/api/scan-codes/verbs-subject.js +3 -3
- package/build/api/scan-codes/verbs.js +4 -4
- package/build/lib/db/schemas/043_scan_pattern_and_member_targets.sql +26 -0
- package/build/lib/facet-value.d.ts +3 -0
- package/build/lib/facet-value.js +9 -0
- package/build/routes/scan-codes.js +3 -0
- package/build/sdk/index.d.ts +3 -3
- package/build/services/escalation/batch.d.ts +4 -3
- package/build/services/escalation/batch.js +5 -3
- package/build/services/escalation/claim-asserted.d.ts +2 -1
- package/build/services/escalation/crud.d.ts +3 -2
- package/build/services/orchestrator/condition.d.ts +6 -0
- package/build/services/orchestrator/condition.js +6 -0
- package/build/services/scan-code/read.js +3 -0
- package/build/services/scan-code/sql.d.ts +3 -3
- package/build/services/scan-code/sql.js +19 -8
- package/build/services/scan-code/validate-scheme-pattern.d.ts +16 -0
- package/build/services/scan-code/validate-scheme-pattern.js +75 -0
- package/build/services/scan-code/validate.d.ts +3 -1
- package/build/services/scan-code/validate.js +6 -1
- package/build/services/scan-code/write.d.ts +3 -0
- package/build/services/scan-code/write.js +3 -0
- package/build/shared/scan-code/index.d.ts +2 -1
- package/build/shared/scan-code/index.js +8 -1
- package/build/shared/scan-code/parse.d.ts +22 -1
- package/build/shared/scan-code/parse.js +78 -0
- package/build/shared/scan-code/target.d.ts +4 -0
- package/build/shared/scan-code/target.js +14 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +86 -77
- package/build/system/mcp-servers/admin/schemas.js +4 -1
- package/build/system/seed/tool-manifests-admin.js +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/escalation.d.ts +15 -0
- package/build/types/escalation.js +16 -1
- package/build/types/facets.d.ts +5 -0
- package/build/types/index.d.ts +3 -3
- package/build/types/index.js +5 -1
- package/build/types/scan-code/constants.d.ts +20 -0
- package/build/types/scan-code/constants.js +20 -1
- package/build/types/scan-code/response.d.ts +2 -1
- package/build/types/scan-code/rule.d.ts +11 -1
- package/dashboard/dist/assets/{AdminDashboard-CZIeiLe0.js → AdminDashboard-VQ1fhhJP.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CZIeiLe0.js.map → AdminDashboard-VQ1fhhJP.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-DO3ATfCU.js → AgentConfigPage-BOe_W2Ij.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-DO3ATfCU.js.map → AgentConfigPage-BOe_W2Ij.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-BWAlHQfB.js → AgentDetailPage-5ov5D9V2.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-BWAlHQfB.js.map → AgentDetailPage-5ov5D9V2.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-Cs4IKeec.js → AgentsPage-DDFMKHhI.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-Cs4IKeec.js.map → AgentsPage-DDFMKHhI.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-CiRxaing.js → AvailableEscalationsPage-GFn8Sgg1.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-CiRxaing.js.map → AvailableEscalationsPage-GFn8Sgg1.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DGLkc9PQ.js → BotPicker-Dqpo36dM.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DGLkc9PQ.js.map → BotPicker-Dqpo36dM.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-C4LV8s0y.js → BulkAssignModal-CmLVxkz-.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-C4LV8s0y.js.map → BulkAssignModal-CmLVxkz-.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-BLMMV3-W.js → CapabilitiesPage-Dfkip6_b.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-BLMMV3-W.js.map → CapabilitiesPage-Dfkip6_b.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BAizcNCt.js → CollapsibleSection-CYNYMYSa.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BAizcNCt.js.map → CollapsibleSection-CYNYMYSa.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DlNWHVxi.js → ConfirmDeleteModal-CpJNP-8w.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DlNWHVxi.js.map → ConfirmDeleteModal-CpJNP-8w.js.map} +1 -1
- package/dashboard/dist/assets/{ConnectedAppsPage-D94kx0v3.js → ConnectedAppsPage-DXIp2Dpl.js} +2 -2
- package/dashboard/dist/assets/{ConnectedAppsPage-D94kx0v3.js.map → ConnectedAppsPage-DXIp2Dpl.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-CSdAwgwZ.js → CountdownTimer-CuPY7zkb.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-CSdAwgwZ.js.map → CountdownTimer-CuPY7zkb.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-pOyC1GfC.js → CredentialsPage-CtrnkHcj.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-pOyC1GfC.js.map → CredentialsPage-CtrnkHcj.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-BVlOOcyo.js → CronLabel-DVjTw5Ri.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-BVlOOcyo.js.map → CronLabel-DVjTw5Ri.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-Bnjp3onG.js → ElapsedCell-gY_mGMTF.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-Bnjp3onG.js.map → ElapsedCell-gY_mGMTF.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-D6Z7YXuY.js → EntityTimelinePanel-DJN_ZEQa.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-D6Z7YXuY.js.map → EntityTimelinePanel-DJN_ZEQa.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-D2aa_arC.js → EscalationListSchemaPage-A4KpTdJA.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-D2aa_arC.js.map → EscalationListSchemaPage-A4KpTdJA.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-DuOje0Ke.js → EscalationSchemaPage-nfCn42hT.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-DuOje0Ke.js.map → EscalationSchemaPage-nfCn42hT.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-DFkhU2Z2.js → EscalationTimeline-CLvSr1SD.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-DFkhU2Z2.js.map → EscalationTimeline-CLvSr1SD.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-CgYnMM_O.js → EscalationTitleSelect-CT7mYHkb.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-CgYnMM_O.js.map → EscalationTitleSelect-CT7mYHkb.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BTkFoklS.js → EscalationsOverview-CKaGRh-E.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BTkFoklS.js.map → EscalationsOverview-CKaGRh-E.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-MJmAbu6N.js → EventTable-2ywJsOLy.js} +2 -2
- package/dashboard/dist/assets/{EventTable-MJmAbu6N.js.map → EventTable-2ywJsOLy.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-Blt7qcUc.js → FilterBar-Dy0b7wwf.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-Blt7qcUc.js.map → FilterBar-Dy0b7wwf.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-B4K3mT_c.js → GraphInvokePage-yOVpraAy.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-B4K3mT_c.js.map → GraphInvokePage-yOVpraAy.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-BN5wXq6V.js → HomePage-67xXjKjN.js} +2 -2
- package/dashboard/dist/assets/{HomePage-BN5wXq6V.js.map → HomePage-67xXjKjN.js.map} +1 -1
- package/dashboard/dist/assets/{LinePage-CuHHHwBy.js → LinePage-CMsYtukW.js} +3 -3
- package/dashboard/dist/assets/{LinePage-CuHHHwBy.js.map → LinePage-CMsYtukW.js.map} +1 -1
- package/dashboard/dist/assets/{LinesPage-D9TRHWyt.js → LinesPage-pwL46mOS.js} +3 -3
- package/dashboard/dist/assets/{LinesPage-D9TRHWyt.js.map → LinesPage-pwL46mOS.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-GGj6X36p.js → ListToolbar-CJmvGy2B.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-GGj6X36p.js.map → ListToolbar-CJmvGy2B.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-Do31A1jL.js → McpOverview-DA9LLvNG.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Do31A1jL.js.map → McpOverview-DA9LLvNG.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-D6FSB1bS.js → McpQueryDetailPage-N7qLmfE8.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-D6FSB1bS.js.map → McpQueryDetailPage-N7qLmfE8.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-CyT2d0Y_.js → McpQueryPage-CpsP3w7x.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CyT2d0Y_.js.map → McpQueryPage-CpsP3w7x.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-C3mmTl4Y.js → McpRunDetailPage-qHRQ1pEY.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-C3mmTl4Y.js.map → McpRunDetailPage-qHRQ1pEY.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-CTeFFUE2.js → McpRunsPage-BRDDYpTM.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-CTeFFUE2.js.map → McpRunsPage-BRDDYpTM.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-BUtQP5dm.js → OperationsPage-zUaab-CL.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-BUtQP5dm.js.map → OperationsPage-zUaab-CL.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-BwYOXyUV.js → OperatorDashboard-el5BquXN.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-BwYOXyUV.js.map → OperatorDashboard-el5BquXN.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-CkrKJLNv.js → PersonaDetailPage-B_tb8gfl.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-CkrKJLNv.js.map → PersonaDetailPage-B_tb8gfl.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-BS8aBeOv.js → PersonasPage-BPI7mqM8.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-BS8aBeOv.js.map → PersonasPage-BPI7mqM8.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-PEBk6VVu.js → PortalPage-e_rBb1do.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-PEBk6VVu.js.map → PortalPage-e_rBb1do.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-CJ71bxDs.js → ProcessDetailPage-D35RX1bB.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-CJ71bxDs.js.map → ProcessDetailPage-D35RX1bB.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-ov_HLxz5.js → ProcessesListPage-CT81miI5.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-ov_HLxz5.js.map → ProcessesListPage-CT81miI5.js.map} +1 -1
- package/dashboard/dist/assets/{ResolverForm-BKiUY-lN.js → ResolverForm-BxJkoKAO.js} +2 -2
- package/dashboard/dist/assets/{ResolverForm-BKiUY-lN.js.map → ResolverForm-BxJkoKAO.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-CmfWwjtG.js → RoleDetailPage-DtU7vsJm.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-CmfWwjtG.js.map → RoleDetailPage-DtU7vsJm.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-DvO5DJWY.js → RolesPage-BE7RWt9q.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-DvO5DJWY.js.map → RolesPage-BE7RWt9q.js.map} +1 -1
- package/dashboard/dist/assets/{RosterWidget-Cs6OTbST.js → RosterWidget-BJMx0a8Z.js} +2 -2
- package/dashboard/dist/assets/{RosterWidget-Cs6OTbST.js.map → RosterWidget-BJMx0a8Z.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-VNjUn9Zp.js → RunAsSelector-Co6s9bqA.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-VNjUn9Zp.js.map → RunAsSelector-Co6s9bqA.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-C2TETaj5.js +2 -0
- package/dashboard/dist/assets/ScanCodesPage-C2TETaj5.js.map +1 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js +5 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-C2UgU8l-.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-nWYz-OD3.js.map +1 -0
- package/dashboard/dist/assets/SchemeMatchFields-9H7SmbED.js +4 -0
- package/dashboard/dist/assets/SchemeMatchFields-9H7SmbED.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-CJ3jjlDX.js → StickyPagination-miUdVAKw.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-CJ3jjlDX.js.map → StickyPagination-miUdVAKw.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-yOdyJGHR.js → StreamMessageDetail-D5Rk7pn7.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-yOdyJGHR.js.map → StreamMessageDetail-D5Rk7pn7.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-DeFWNFrL.js → SwimlaneTimeline-B1QY1ZzH.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-DeFWNFrL.js.map → SwimlaneTimeline-B1QY1ZzH.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BPL_Zx-L.js → TaskDetailPage-DKUM37o8.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BPL_Zx-L.js.map → TaskDetailPage-DKUM37o8.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-Bc3S63_O.js → TasksListPage-CUulwvm-.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-Bc3S63_O.js.map → TasksListPage-CUulwvm-.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-DAtnJQwU.js → TimeAgo-CHTelacB.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-DAtnJQwU.js.map → TimeAgo-CHTelacB.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-CG0erHqq.js → TimestampCell-NanLWLKo.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-CG0erHqq.js.map → TimestampCell-NanLWLKo.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-c71yqZv7.js → ToolTestPanel-CF1CHzgz.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-c71yqZv7.js.map → ToolTestPanel-CF1CHzgz.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-BlUP0bb1.js → TopicDetailPage-CGO8XV_a.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-BlUP0bb1.js.map → TopicDetailPage-CGO8XV_a.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-lQ9HNzOq.js → TopicsPage-Bt8gOKYr.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-lQ9HNzOq.js.map → TopicsPage-Bt8gOKYr.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-Vf97ofcW.js → UserName-DKXnK7DD.js} +2 -2
- package/dashboard/dist/assets/{UserName-Vf97ofcW.js.map → UserName-DKXnK7DD.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-B195cnHb.js → WorkflowExecutionPage-Crf7AIFc.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-B195cnHb.js.map → WorkflowExecutionPage-Crf7AIFc.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-gH-PGsKq.js → WorkflowsDashboard--isjt06C.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-gH-PGsKq.js.map → WorkflowsDashboard--isjt06C.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-D_wYDqw3.js → WorkflowsOverview-D7Oqf4-V.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-D_wYDqw3.js.map → WorkflowsOverview-D7Oqf4-V.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-Imob5F8H.js → YamlWorkflowDetailPage-B0wxgrGP.js} +8 -8
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-Imob5F8H.js.map → YamlWorkflowDetailPage-B0wxgrGP.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DVEVSKKJ.js → YamlWorkflowsPage-BVdLnm6K.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DVEVSKKJ.js.map → YamlWorkflowsPage-BVdLnm6K.js.map} +1 -1
- package/dashboard/dist/assets/{agents-B-8z_DV8.js → agents-CHjbjHXA.js} +2 -2
- package/dashboard/dist/assets/{agents-B-8z_DV8.js.map → agents-CHjbjHXA.js.map} +1 -1
- package/dashboard/dist/assets/{bots-Clm-wZeG.js → bots-WrUhEPWs.js} +2 -2
- package/dashboard/dist/assets/{bots-Clm-wZeG.js.map → bots-WrUhEPWs.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-CBwgv5tr.js → capabilities-CunMmkj8.js} +2 -2
- package/dashboard/dist/assets/{capabilities-CBwgv5tr.js.map → capabilities-CunMmkj8.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-B96o1-zT.js → controlplane-D6IZIZoh.js} +2 -2
- package/dashboard/dist/assets/{controlplane-B96o1-zT.js.map → controlplane-D6IZIZoh.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-CFoFILF1.js → escalation-columns-Bvo6JI4Z.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-CFoFILF1.js.map → escalation-columns-Bvo6JI4Z.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-items-BCUiPsfS.js → escalation-items-DFGRwo49.js} +2 -2
- package/dashboard/dist/assets/{escalation-items-BCUiPsfS.js.map → escalation-items-DFGRwo49.js.map} +1 -1
- package/dashboard/dist/assets/{index-XS-6UjQd.js → index-B8qrHwp9.js} +2 -2
- package/dashboard/dist/assets/{index-XS-6UjQd.js.map → index-B8qrHwp9.js.map} +1 -1
- package/dashboard/dist/assets/{index-C1WJs6IZ.js → index-B95LbYhW.js} +2 -2
- package/dashboard/dist/assets/{index-C1WJs6IZ.js.map → index-B95LbYhW.js.map} +1 -1
- package/dashboard/dist/assets/{index-IedmSPp1.js → index-BZFSXEkr.js} +2 -2
- package/dashboard/dist/assets/{index-IedmSPp1.js.map → index-BZFSXEkr.js.map} +1 -1
- package/dashboard/dist/assets/index-BmzscsXK.css +1 -0
- package/dashboard/dist/assets/{index-DvgjLvvn.js → index-Bo8QU31k.js} +2 -2
- package/dashboard/dist/assets/{index-DvgjLvvn.js.map → index-Bo8QU31k.js.map} +1 -1
- package/dashboard/dist/assets/{index-B_z-OFwk.js → index-C7EIu1mG.js} +2 -2
- package/dashboard/dist/assets/{index-B_z-OFwk.js.map → index-C7EIu1mG.js.map} +1 -1
- package/dashboard/dist/assets/{index-Czb9O4Ns.js → index-CpCchhQv.js} +2 -2
- package/dashboard/dist/assets/{index-Czb9O4Ns.js.map → index-CpCchhQv.js.map} +1 -1
- package/dashboard/dist/assets/{index-BXKDpLk5.js → index-DCJ483vt.js} +2 -2
- package/dashboard/dist/assets/{index-BXKDpLk5.js.map → index-DCJ483vt.js.map} +1 -1
- package/dashboard/dist/assets/{index-CnhNCVPc.js → index-DRK7M1_9.js} +2 -2
- package/dashboard/dist/assets/{index-CnhNCVPc.js.map → index-DRK7M1_9.js.map} +1 -1
- package/dashboard/dist/assets/{index-BOuGMe78.js → index-DRw0FXdX.js} +2 -2
- package/dashboard/dist/assets/{index-BOuGMe78.js.map → index-DRw0FXdX.js.map} +1 -1
- package/dashboard/dist/assets/{index-P22vmuEu.js → index-OuKQ_0eB.js} +2 -2
- package/dashboard/dist/assets/{index-P22vmuEu.js.map → index-OuKQ_0eB.js.map} +1 -1
- package/dashboard/dist/assets/index-P-DlgAWj.js +3 -0
- package/dashboard/dist/assets/index-P-DlgAWj.js.map +1 -0
- package/dashboard/dist/assets/{index-MGquOb7J.js → index-boT612Jo.js} +2 -2
- package/dashboard/dist/assets/{index-MGquOb7J.js.map → index-boT612Jo.js.map} +1 -1
- package/dashboard/dist/assets/index-ygxyAKcc.js +67 -0
- package/dashboard/dist/assets/index-ygxyAKcc.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-d92ncKgf.js → knowledge-BubJBTwg.js} +2 -2
- package/dashboard/dist/assets/{knowledge-d92ncKgf.js.map → knowledge-BubJBTwg.js.map} +1 -1
- package/dashboard/dist/assets/{machines-BG9laURp.js → machines-DSm5NFgs.js} +2 -2
- package/dashboard/dist/assets/{machines-BG9laURp.js.map → machines-DSm5NFgs.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CsZdpCEf.js → mcp-D6MckqOV.js} +2 -2
- package/dashboard/dist/assets/{mcp-CsZdpCEf.js.map → mcp-D6MckqOV.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-o2xqrZJv.js → mcp-query-VyCdOag6.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-o2xqrZJv.js.map → mcp-query-VyCdOag6.js.map} +1 -1
- package/dashboard/dist/assets/{personas-EYROtAxm.js → personas-CyJc10xe.js} +2 -2
- package/dashboard/dist/assets/{personas-EYROtAxm.js.map → personas-CyJc10xe.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-C17xZZsa.js → pipelines-B2inDtx3.js} +2 -2
- package/dashboard/dist/assets/{pipelines-C17xZZsa.js.map → pipelines-B2inDtx3.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CUppIhu6.js → tasks-DOP4d3M6.js} +2 -2
- package/dashboard/dist/assets/{tasks-CUppIhu6.js.map → tasks-DOP4d3M6.js.map} +1 -1
- package/dashboard/dist/assets/{topics-B-lCJzVc.js → topics-CNOjSWpX.js} +2 -2
- package/dashboard/dist/assets/{topics-B-lCJzVc.js.map → topics-CNOjSWpX.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-C5mMbYoU.js → useDebouncedValue-CgO0TGMd.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-C5mMbYoU.js.map → useDebouncedValue-CgO0TGMd.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-Bu42ipvu.js → useNamespace-BWHvUKtK.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-Bu42ipvu.js.map → useNamespace-BWHvUKtK.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-C29uM9Qp.js → useYamlActivityEvents-BZQ__ZGD.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-C29uM9Qp.js.map → useYamlActivityEvents-BZQ__ZGD.js.map} +1 -1
- package/dashboard/dist/assets/{validate-Bt5QGwSc.js → validate-CAin6WM_.js} +2 -2
- package/dashboard/dist/assets/{validate-Bt5QGwSc.js.map → validate-CAin6WM_.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DgrmL_Kt.js → yaml-workflows-Dyln3od-.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DgrmL_Kt.js.map → yaml-workflows-Dyln3od-.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/accumulator.md +1 -1
- package/docs/api/http/escalations.md +1 -1
- package/docs/api/sdk/escalations.md +1 -1
- package/docs/dashboard.md +4 -2
- package/docs/hitl/escalation.md +16 -0
- package/docs/scan-codes.md +45 -14
- package/package.json +2 -2
- package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js +0 -2
- package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js.map +0 -1
- package/dashboard/dist/assets/ScanCodesPage-Dbaud0fc.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-Dbaud0fc.js.map +0 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-BfDw_Eke.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-BfDw_Eke.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-DE-zJTiD.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-DE-zJTiD.js.map +0 -1
- package/dashboard/dist/assets/index-CXNh7LuG.js +0 -67
- package/dashboard/dist/assets/index-CXNh7LuG.js.map +0 -1
- package/dashboard/dist/assets/index-C_dp4WgY.css +0 -1
- package/dashboard/dist/assets/index-EZkdUZwM.js +0 -3
- package/dashboard/dist/assets/index-EZkdUZwM.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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
+
}
|