@hotmeshio/long-tail 0.30.2 → 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 +2 -1
- package/build/api/scan-codes/verb-into-subject.js +1 -1
- package/build/api/scan-codes/verbs-subject.js +1 -1
- 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-NVtdLI4I.js → AdminDashboard-VQ1fhhJP.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-NVtdLI4I.js.map → AdminDashboard-VQ1fhhJP.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-Db1Oi72V.js → AgentConfigPage-BOe_W2Ij.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-Db1Oi72V.js.map → AgentConfigPage-BOe_W2Ij.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-BF4mw1bD.js → AgentDetailPage-5ov5D9V2.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-BF4mw1bD.js.map → AgentDetailPage-5ov5D9V2.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-DmF0m3Ro.js → AgentsPage-DDFMKHhI.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-DmF0m3Ro.js.map → AgentsPage-DDFMKHhI.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-jy2WKDjr.js → AvailableEscalationsPage-GFn8Sgg1.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-jy2WKDjr.js.map → AvailableEscalationsPage-GFn8Sgg1.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-HJtVHdNe.js → BotPicker-Dqpo36dM.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-HJtVHdNe.js.map → BotPicker-Dqpo36dM.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-DsJJZ9X4.js → BulkAssignModal-CmLVxkz-.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-DsJJZ9X4.js.map → BulkAssignModal-CmLVxkz-.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-iCn7PxDP.js → CapabilitiesPage-Dfkip6_b.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-iCn7PxDP.js.map → CapabilitiesPage-Dfkip6_b.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-DFfVr_Ut.js → CollapsibleSection-CYNYMYSa.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-DFfVr_Ut.js.map → CollapsibleSection-CYNYMYSa.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-D6TwO-yT.js → ConfirmDeleteModal-CpJNP-8w.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-D6TwO-yT.js.map → ConfirmDeleteModal-CpJNP-8w.js.map} +1 -1
- package/dashboard/dist/assets/{ConnectedAppsPage-BOD-tgY0.js → ConnectedAppsPage-DXIp2Dpl.js} +2 -2
- package/dashboard/dist/assets/{ConnectedAppsPage-BOD-tgY0.js.map → ConnectedAppsPage-DXIp2Dpl.js.map} +1 -1
- package/dashboard/dist/assets/{CountdownTimer-u_o3OygV.js → CountdownTimer-CuPY7zkb.js} +2 -2
- package/dashboard/dist/assets/{CountdownTimer-u_o3OygV.js.map → CountdownTimer-CuPY7zkb.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-C3dnRsMh.js → CredentialsPage-CtrnkHcj.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-C3dnRsMh.js.map → CredentialsPage-CtrnkHcj.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-BFh5TCsB.js → CronLabel-DVjTw5Ri.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-BFh5TCsB.js.map → CronLabel-DVjTw5Ri.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-D0jYuFKh.js → ElapsedCell-gY_mGMTF.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-D0jYuFKh.js.map → ElapsedCell-gY_mGMTF.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-Ch-BsRu8.js → EntityTimelinePanel-DJN_ZEQa.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-Ch-BsRu8.js.map → EntityTimelinePanel-DJN_ZEQa.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-DuSLiInU.js → EscalationListSchemaPage-A4KpTdJA.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-DuSLiInU.js.map → EscalationListSchemaPage-A4KpTdJA.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-D_mYri6e.js → EscalationSchemaPage-nfCn42hT.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-D_mYri6e.js.map → EscalationSchemaPage-nfCn42hT.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-DiN8ImWF.js → EscalationTimeline-CLvSr1SD.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-DiN8ImWF.js.map → EscalationTimeline-CLvSr1SD.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-36tkc2TE.js → EscalationTitleSelect-CT7mYHkb.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-36tkc2TE.js.map → EscalationTitleSelect-CT7mYHkb.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-yHY6JKiV.js → EscalationsOverview-CKaGRh-E.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-yHY6JKiV.js.map → EscalationsOverview-CKaGRh-E.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DTtu2iM_.js → EventTable-2ywJsOLy.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DTtu2iM_.js.map → EventTable-2ywJsOLy.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-ByZiD0ty.js → FilterBar-Dy0b7wwf.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-ByZiD0ty.js.map → FilterBar-Dy0b7wwf.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-Cbn6igr_.js → GraphInvokePage-yOVpraAy.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-Cbn6igr_.js.map → GraphInvokePage-yOVpraAy.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-CtLKm_S4.js → HomePage-67xXjKjN.js} +2 -2
- package/dashboard/dist/assets/{HomePage-CtLKm_S4.js.map → HomePage-67xXjKjN.js.map} +1 -1
- package/dashboard/dist/assets/{LinePage-Q5Cgjd3N.js → LinePage-CMsYtukW.js} +3 -3
- package/dashboard/dist/assets/{LinePage-Q5Cgjd3N.js.map → LinePage-CMsYtukW.js.map} +1 -1
- package/dashboard/dist/assets/{LinesPage-BX3d-rj0.js → LinesPage-pwL46mOS.js} +3 -3
- package/dashboard/dist/assets/{LinesPage-BX3d-rj0.js.map → LinesPage-pwL46mOS.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-bj2sgAK4.js → ListToolbar-CJmvGy2B.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-bj2sgAK4.js.map → ListToolbar-CJmvGy2B.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-BD3UWbcC.js → McpOverview-DA9LLvNG.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-BD3UWbcC.js.map → McpOverview-DA9LLvNG.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-ISzY-BfT.js → McpQueryDetailPage-N7qLmfE8.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-ISzY-BfT.js.map → McpQueryDetailPage-N7qLmfE8.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-t555QJ3m.js → McpQueryPage-CpsP3w7x.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-t555QJ3m.js.map → McpQueryPage-CpsP3w7x.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-C4jozQFh.js → McpRunDetailPage-qHRQ1pEY.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-C4jozQFh.js.map → McpRunDetailPage-qHRQ1pEY.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-Z-mtyRBp.js → McpRunsPage-BRDDYpTM.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-Z-mtyRBp.js.map → McpRunsPage-BRDDYpTM.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-ClYilVyZ.js → OperationsPage-zUaab-CL.js} +3 -3
- package/dashboard/dist/assets/{OperationsPage-ClYilVyZ.js.map → OperationsPage-zUaab-CL.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-3Hi2IiHi.js → OperatorDashboard-el5BquXN.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-3Hi2IiHi.js.map → OperatorDashboard-el5BquXN.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-xb7O3tn9.js → PersonaDetailPage-B_tb8gfl.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-xb7O3tn9.js.map → PersonaDetailPage-B_tb8gfl.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-uCYVhRBB.js → PersonasPage-BPI7mqM8.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-uCYVhRBB.js.map → PersonasPage-BPI7mqM8.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-D1MOMJ9Q.js → PortalPage-e_rBb1do.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-D1MOMJ9Q.js.map → PortalPage-e_rBb1do.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-Tf8FQCUm.js → ProcessDetailPage-D35RX1bB.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-Tf8FQCUm.js.map → ProcessDetailPage-D35RX1bB.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-DPLRgznC.js → ProcessesListPage-CT81miI5.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-DPLRgznC.js.map → ProcessesListPage-CT81miI5.js.map} +1 -1
- package/dashboard/dist/assets/{ResolverForm-BXqJEPte.js → ResolverForm-BxJkoKAO.js} +2 -2
- package/dashboard/dist/assets/{ResolverForm-BXqJEPte.js.map → ResolverForm-BxJkoKAO.js.map} +1 -1
- package/dashboard/dist/assets/{RoleDetailPage-KJnZGPPY.js → RoleDetailPage-DtU7vsJm.js} +2 -2
- package/dashboard/dist/assets/{RoleDetailPage-KJnZGPPY.js.map → RoleDetailPage-DtU7vsJm.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-C5f-3zcs.js → RolesPage-BE7RWt9q.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-C5f-3zcs.js.map → RolesPage-BE7RWt9q.js.map} +1 -1
- package/dashboard/dist/assets/{RosterWidget-WCtpUEzc.js → RosterWidget-BJMx0a8Z.js} +2 -2
- package/dashboard/dist/assets/{RosterWidget-WCtpUEzc.js.map → RosterWidget-BJMx0a8Z.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-CzabsFYU.js → RunAsSelector-Co6s9bqA.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CzabsFYU.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-C2fzclxr.js → StickyPagination-miUdVAKw.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-C2fzclxr.js.map → StickyPagination-miUdVAKw.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-wF4NM8gi.js → StreamMessageDetail-D5Rk7pn7.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-wF4NM8gi.js.map → StreamMessageDetail-D5Rk7pn7.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-B4Hg97qO.js → SwimlaneTimeline-B1QY1ZzH.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-B4Hg97qO.js.map → SwimlaneTimeline-B1QY1ZzH.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-DAxxcFDD.js → TaskDetailPage-DKUM37o8.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DAxxcFDD.js.map → TaskDetailPage-DKUM37o8.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-BmghuHbc.js → TasksListPage-CUulwvm-.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-BmghuHbc.js.map → TasksListPage-CUulwvm-.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CFeB6U2O.js → TimeAgo-CHTelacB.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CFeB6U2O.js.map → TimeAgo-CHTelacB.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-M_FD9JEc.js → TimestampCell-NanLWLKo.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-M_FD9JEc.js.map → TimestampCell-NanLWLKo.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-D7PihZG9.js → ToolTestPanel-CF1CHzgz.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-D7PihZG9.js.map → ToolTestPanel-CF1CHzgz.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-T0dLt7Ao.js → TopicDetailPage-CGO8XV_a.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-T0dLt7Ao.js.map → TopicDetailPage-CGO8XV_a.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-DP5ox5oX.js → TopicsPage-Bt8gOKYr.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-DP5ox5oX.js.map → TopicsPage-Bt8gOKYr.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-ET3r3u-A.js → UserName-DKXnK7DD.js} +2 -2
- package/dashboard/dist/assets/{UserName-ET3r3u-A.js.map → UserName-DKXnK7DD.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DBq2lZ_C.js → WorkflowExecutionPage-Crf7AIFc.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DBq2lZ_C.js.map → WorkflowExecutionPage-Crf7AIFc.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-WO4cH8sU.js → WorkflowsDashboard--isjt06C.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-WO4cH8sU.js.map → WorkflowsDashboard--isjt06C.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CJfg0rQH.js → WorkflowsOverview-D7Oqf4-V.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CJfg0rQH.js.map → WorkflowsOverview-D7Oqf4-V.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C8rkvYCp.js → YamlWorkflowDetailPage-B0wxgrGP.js} +8 -8
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C8rkvYCp.js.map → YamlWorkflowDetailPage-B0wxgrGP.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DHQ4ZVzM.js → YamlWorkflowsPage-BVdLnm6K.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DHQ4ZVzM.js.map → YamlWorkflowsPage-BVdLnm6K.js.map} +1 -1
- package/dashboard/dist/assets/{agents-zulmHig2.js → agents-CHjbjHXA.js} +2 -2
- package/dashboard/dist/assets/{agents-zulmHig2.js.map → agents-CHjbjHXA.js.map} +1 -1
- package/dashboard/dist/assets/{bots-D4mtcPHB.js → bots-WrUhEPWs.js} +2 -2
- package/dashboard/dist/assets/{bots-D4mtcPHB.js.map → bots-WrUhEPWs.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-rFZDH0zF.js → capabilities-CunMmkj8.js} +2 -2
- package/dashboard/dist/assets/{capabilities-rFZDH0zF.js.map → capabilities-CunMmkj8.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-INfcW_9F.js → controlplane-D6IZIZoh.js} +2 -2
- package/dashboard/dist/assets/{controlplane-INfcW_9F.js.map → controlplane-D6IZIZoh.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-8ker-czW.js → escalation-columns-Bvo6JI4Z.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-8ker-czW.js.map → escalation-columns-Bvo6JI4Z.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-items-B6eDMoTN.js → escalation-items-DFGRwo49.js} +2 -2
- package/dashboard/dist/assets/{escalation-items-B6eDMoTN.js.map → escalation-items-DFGRwo49.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cfg4TFDb.js → index-B8qrHwp9.js} +2 -2
- package/dashboard/dist/assets/{index-Cfg4TFDb.js.map → index-B8qrHwp9.js.map} +1 -1
- package/dashboard/dist/assets/{index-D-Fd0gQ_.js → index-B95LbYhW.js} +2 -2
- package/dashboard/dist/assets/{index-D-Fd0gQ_.js.map → index-B95LbYhW.js.map} +1 -1
- package/dashboard/dist/assets/{index-BpillEP7.js → index-BZFSXEkr.js} +2 -2
- package/dashboard/dist/assets/{index-BpillEP7.js.map → index-BZFSXEkr.js.map} +1 -1
- package/dashboard/dist/assets/index-BmzscsXK.css +1 -0
- package/dashboard/dist/assets/{index-ChF-l2z9.js → index-Bo8QU31k.js} +2 -2
- package/dashboard/dist/assets/{index-ChF-l2z9.js.map → index-Bo8QU31k.js.map} +1 -1
- package/dashboard/dist/assets/{index-0LXkjZjt.js → index-C7EIu1mG.js} +2 -2
- package/dashboard/dist/assets/{index-0LXkjZjt.js.map → index-C7EIu1mG.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cm6_Peh7.js → index-CpCchhQv.js} +2 -2
- package/dashboard/dist/assets/{index-Cm6_Peh7.js.map → index-CpCchhQv.js.map} +1 -1
- package/dashboard/dist/assets/{index-5XUBZtlv.js → index-DCJ483vt.js} +2 -2
- package/dashboard/dist/assets/{index-5XUBZtlv.js.map → index-DCJ483vt.js.map} +1 -1
- package/dashboard/dist/assets/{index-BcVkiaCv.js → index-DRK7M1_9.js} +2 -2
- package/dashboard/dist/assets/{index-BcVkiaCv.js.map → index-DRK7M1_9.js.map} +1 -1
- package/dashboard/dist/assets/{index-D-EVgGsm.js → index-DRw0FXdX.js} +2 -2
- package/dashboard/dist/assets/{index-D-EVgGsm.js.map → index-DRw0FXdX.js.map} +1 -1
- package/dashboard/dist/assets/{index-CV7KmPdF.js → index-OuKQ_0eB.js} +2 -2
- package/dashboard/dist/assets/{index-CV7KmPdF.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-Cg9W61lM.js → index-boT612Jo.js} +2 -2
- package/dashboard/dist/assets/{index-Cg9W61lM.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-_WaBsrbC.js → knowledge-BubJBTwg.js} +2 -2
- package/dashboard/dist/assets/{knowledge-_WaBsrbC.js.map → knowledge-BubJBTwg.js.map} +1 -1
- package/dashboard/dist/assets/{machines-D6ig2Q8z.js → machines-DSm5NFgs.js} +2 -2
- package/dashboard/dist/assets/{machines-D6ig2Q8z.js.map → machines-DSm5NFgs.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-DtWRQM1G.js → mcp-D6MckqOV.js} +2 -2
- package/dashboard/dist/assets/{mcp-DtWRQM1G.js.map → mcp-D6MckqOV.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-vQm92kTd.js → mcp-query-VyCdOag6.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-vQm92kTd.js.map → mcp-query-VyCdOag6.js.map} +1 -1
- package/dashboard/dist/assets/{personas-BLxQpGNz.js → personas-CyJc10xe.js} +2 -2
- package/dashboard/dist/assets/{personas-BLxQpGNz.js.map → personas-CyJc10xe.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-ClmRtlkR.js → pipelines-B2inDtx3.js} +2 -2
- package/dashboard/dist/assets/{pipelines-ClmRtlkR.js.map → pipelines-B2inDtx3.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CVZT1pf0.js → tasks-DOP4d3M6.js} +2 -2
- package/dashboard/dist/assets/{tasks-CVZT1pf0.js.map → tasks-DOP4d3M6.js.map} +1 -1
- package/dashboard/dist/assets/{topics-rkG9-6El.js → topics-CNOjSWpX.js} +2 -2
- package/dashboard/dist/assets/{topics-rkG9-6El.js.map → topics-CNOjSWpX.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-D2aCC74y.js → useDebouncedValue-CgO0TGMd.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-D2aCC74y.js.map → useDebouncedValue-CgO0TGMd.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-BGfkF4ej.js → useNamespace-BWHvUKtK.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-BGfkF4ej.js.map → useNamespace-BWHvUKtK.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-DOU0_nfZ.js → useYamlActivityEvents-BZQ__ZGD.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-DOU0_nfZ.js.map → useYamlActivityEvents-BZQ__ZGD.js.map} +1 -1
- package/dashboard/dist/assets/{validate-bHZ917pZ.js → validate-CAin6WM_.js} +2 -2
- package/dashboard/dist/assets/{validate-bHZ917pZ.js.map → validate-CAin6WM_.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-S7qlgdg6.js → yaml-workflows-Dyln3od-.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-S7qlgdg6.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 +3 -1
- package/docs/hitl/escalation.md +16 -0
- package/docs/scan-codes.md +28 -9
- 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-D51d17HH.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-D51d17HH.js.map +0 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-CUK6Skxj.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-CUK6Skxj.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-7vK0ddiV.js.map +0 -1
- package/dashboard/dist/assets/index-BpJ77OST.js +0 -3
- package/dashboard/dist/assets/index-BpJ77OST.js.map +0 -1
- package/dashboard/dist/assets/index-C_dp4WgY.css +0 -1
- package/dashboard/dist/assets/index-xycFf66M.js +0 -67
- package/dashboard/dist/assets/index-xycFf66M.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AccumulatedItem, ContainerSelector, LTEscalationRecord } from '../../types';
|
|
2
2
|
import type { LTApiAuth, LTApiResult } from '../../types/sdk';
|
|
3
|
+
import type { FacetValue } from '../../types/facets';
|
|
3
4
|
/** Names the second row of a reciprocal add or removal. Exactly one selector. */
|
|
4
5
|
export interface ReciprocalInput {
|
|
5
6
|
id?: string;
|
|
@@ -62,7 +63,7 @@ export declare function accumulateItemBySignalKey(input: {
|
|
|
62
63
|
*/
|
|
63
64
|
export declare function accumulateItemByMetadata(input: {
|
|
64
65
|
key: string;
|
|
65
|
-
value:
|
|
66
|
+
value: FacetValue;
|
|
66
67
|
restrictRoles?: string[];
|
|
67
68
|
/** Narrows the container beyond the facet: type, subtype, extra facet guards. */
|
|
68
69
|
container?: ContainerSelector;
|
|
@@ -51,6 +51,7 @@ const escalation_1 = require("../../types/escalation");
|
|
|
51
51
|
const helpers_1 = require("./helpers");
|
|
52
52
|
const resolve_1 = require("./resolve");
|
|
53
53
|
const metadata_1 = require("./metadata");
|
|
54
|
+
const facet_value_1 = require("../../lib/facet-value");
|
|
54
55
|
function parseEnvelope(escalation) {
|
|
55
56
|
try {
|
|
56
57
|
const parsed = JSON.parse(escalation.envelope || '{}');
|
|
@@ -317,7 +318,7 @@ async function accumulateItemBySignalKey(input, auth) {
|
|
|
317
318
|
async function accumulateItemByMetadata(input, auth) {
|
|
318
319
|
try {
|
|
319
320
|
const { key, value, itemKey, metadata } = input;
|
|
320
|
-
if (!key || !value)
|
|
321
|
+
if (!key || !(0, facet_value_1.hasFacetValue)(value))
|
|
321
322
|
return { status: 400, error: 'key and value are required' };
|
|
322
323
|
const keyError = itemKeyError(itemKey);
|
|
323
324
|
if (keyError)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ProvisionIfAbsent } from './helpers';
|
|
2
2
|
import type { LTApiAuth, LTApiResult } from '../../types/sdk';
|
|
3
3
|
import type { ScanAvailability } from '../../types';
|
|
4
|
+
import type { FacetValue } from '../../types/facets';
|
|
4
5
|
/**
|
|
5
6
|
* Intersect the caller's scope roles with an optional caller-supplied
|
|
6
7
|
* restriction (e.g. a scan step's expected queues). Global scope with no
|
|
@@ -31,7 +32,7 @@ export declare function findByMetadata(input: {
|
|
|
31
32
|
*/
|
|
32
33
|
export declare function claimByMetadata(input: {
|
|
33
34
|
key: string;
|
|
34
|
-
value:
|
|
35
|
+
value: FacetValue;
|
|
35
36
|
durationMinutes?: number;
|
|
36
37
|
assignee?: string;
|
|
37
38
|
metadata?: Record<string, any>;
|
|
@@ -54,7 +55,7 @@ export declare function claimByMetadata(input: {
|
|
|
54
55
|
*/
|
|
55
56
|
export declare function resolveByMetadata(input: {
|
|
56
57
|
key: string;
|
|
57
|
-
value:
|
|
58
|
+
value: FacetValue;
|
|
58
59
|
resolverPayload: Record<string, any>;
|
|
59
60
|
assignee?: string;
|
|
60
61
|
metadata?: Record<string, any>;
|
|
@@ -43,6 +43,7 @@ const resolver_validation_1 = require("../../services/escalation/resolver-valida
|
|
|
43
43
|
const enforcement_cache_1 = require("../../services/role/enforcement-cache");
|
|
44
44
|
const resolve_1 = require("./resolve");
|
|
45
45
|
const uuid_1 = require("../../lib/uuid");
|
|
46
|
+
const facet_value_1 = require("../../lib/facet-value");
|
|
46
47
|
/**
|
|
47
48
|
* Intersect the caller's scope roles with an optional caller-supplied
|
|
48
49
|
* restriction (e.g. a scan step's expected queues). Global scope with no
|
|
@@ -65,7 +66,7 @@ function restrictScopeRoles(scopeRoles, global, restrictRoles) {
|
|
|
65
66
|
*/
|
|
66
67
|
async function findByMetadata(input, auth) {
|
|
67
68
|
try {
|
|
68
|
-
if (!input.key || !input.value) {
|
|
69
|
+
if (!input.key || !(0, facet_value_1.hasFacetValue)(input.value)) {
|
|
69
70
|
return { status: 400, error: 'key and value are required' };
|
|
70
71
|
}
|
|
71
72
|
// RBAC scoped IN SQL: the caller's read scope (read_all roles see every match;
|
|
@@ -94,7 +95,7 @@ async function findByMetadata(input, auth) {
|
|
|
94
95
|
*/
|
|
95
96
|
async function claimByMetadata(input, auth) {
|
|
96
97
|
try {
|
|
97
|
-
if (!input.key || !input.value) {
|
|
98
|
+
if (!input.key || !(0, facet_value_1.hasFacetValue)(input.value)) {
|
|
98
99
|
return { status: 400, error: 'key and value are required' };
|
|
99
100
|
}
|
|
100
101
|
if (input.assertId !== undefined && !(0, uuid_1.isUuid)(input.assertId)) {
|
|
@@ -145,7 +146,7 @@ async function claimByMetadata(input, auth) {
|
|
|
145
146
|
*/
|
|
146
147
|
async function resolveByMetadata(input, auth) {
|
|
147
148
|
try {
|
|
148
|
-
if (!input.key || !input.value) {
|
|
149
|
+
if (!input.key || !(0, facet_value_1.hasFacetValue)(input.value)) {
|
|
149
150
|
return { status: 400, error: 'key and value are required' };
|
|
150
151
|
}
|
|
151
152
|
if (!input.resolverPayload) {
|
|
@@ -4,7 +4,9 @@ import type { LTApiAuth, LTApiResult } from '../../types/sdk';
|
|
|
4
4
|
* with `batch: [...]`). Interim submissions are cheap atomic fills — the row
|
|
5
5
|
* stays pending and `remaining` reports progress. The LAST item completes the
|
|
6
6
|
* escalation: the row resolves and the waiting workflow wakes with the full
|
|
7
|
-
* collection, in the same statement.
|
|
7
|
+
* collection, in the same statement. On a wait that declared `wakeOnFill` for
|
|
8
|
+
* this key, the fill resolves the row early and the workflow wakes with the
|
|
9
|
+
* items so far (`outcome: 'woke'`, `remaining` > 0).
|
|
8
10
|
*
|
|
9
11
|
* Each item validates against the SAME versioned form schema a single-item
|
|
10
12
|
* resolver gets (metadata.form_schema → pinned lt_role_schemas → live role
|
|
@@ -48,7 +48,9 @@ const metadata_1 = require("./metadata");
|
|
|
48
48
|
* with `batch: [...]`). Interim submissions are cheap atomic fills — the row
|
|
49
49
|
* stays pending and `remaining` reports progress. The LAST item completes the
|
|
50
50
|
* escalation: the row resolves and the waiting workflow wakes with the full
|
|
51
|
-
* collection, in the same statement.
|
|
51
|
+
* collection, in the same statement. On a wait that declared `wakeOnFill` for
|
|
52
|
+
* this key, the fill resolves the row early and the workflow wakes with the
|
|
53
|
+
* items so far (`outcome: 'woke'`, `remaining` > 0).
|
|
52
54
|
*
|
|
53
55
|
* Each item validates against the SAME versioned form schema a single-item
|
|
54
56
|
* resolver gets (metadata.form_schema → pinned lt_role_schemas → live role
|
|
@@ -228,6 +230,17 @@ function batchOutcomeResult(result, itemKey, workflowId) {
|
|
|
228
230
|
escalationId: result.escalation?.id,
|
|
229
231
|
},
|
|
230
232
|
};
|
|
233
|
+
case escalation_1.BATCH_ITEM_OUTCOMES.WOKE:
|
|
234
|
+
return {
|
|
235
|
+
status: 200,
|
|
236
|
+
data: {
|
|
237
|
+
outcome: escalation_1.BATCH_ITEM_OUTCOMES.WOKE,
|
|
238
|
+
remaining: result.remaining,
|
|
239
|
+
signaled: !!result.escalation?.signal_key,
|
|
240
|
+
escalationId: result.escalation?.id,
|
|
241
|
+
workflowId,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
231
244
|
case 'duplicate-item':
|
|
232
245
|
return {
|
|
233
246
|
status: 409,
|
|
@@ -41,6 +41,7 @@ const identity_1 = require("./identity");
|
|
|
41
41
|
const grant_1 = require("./grant");
|
|
42
42
|
const helpers_1 = require("../escalations/helpers");
|
|
43
43
|
const context_1 = require("./context");
|
|
44
|
+
const scan_code_1 = require("../../shared/scan-code");
|
|
44
45
|
const present_1 = require("./present");
|
|
45
46
|
const choice_roles_1 = require("./choice-roles");
|
|
46
47
|
const x_lt_actions_1 = require("../../shared/form-validation/x-lt-actions");
|
|
@@ -109,8 +110,8 @@ async function executeScanChoice(input, auth) {
|
|
|
109
110
|
return stampPointer((0, context_1.conflict)('the item is no longer in the presented state'), rule, input);
|
|
110
111
|
}
|
|
111
112
|
const row = loaded;
|
|
112
|
-
const target = row?.metadata?.[scheme.target_facet];
|
|
113
|
-
if (!row ||
|
|
113
|
+
const target = (0, scan_code_1.facetTarget)(row?.metadata?.[scheme.target_facet]);
|
|
114
|
+
if (!row || !target) {
|
|
114
115
|
return {
|
|
115
116
|
status: 200,
|
|
116
117
|
data: { outcome: types_1.SCAN_OUTCOMES.UNCONFIGURED, error: `escalation does not carry the scheme facet "${scheme.target_facet}"` },
|
|
@@ -44,6 +44,12 @@ export interface StepContext {
|
|
|
44
44
|
subjectStale?: boolean;
|
|
45
45
|
}
|
|
46
46
|
export declare function targetFilter(step: ScanStep, ctx: StepContext): Record<string, any>;
|
|
47
|
+
/**
|
|
48
|
+
* The value the target facet contains on a matching row: the target, or a
|
|
49
|
+
* one-item list when the scheme's facet holds a list (`metadata @>` then
|
|
50
|
+
* matches membership).
|
|
51
|
+
*/
|
|
52
|
+
export declare function targetValue(ctx: Pick<StepContext, 'scheme' | 'parsed'>): string | string[];
|
|
47
53
|
export declare function templateContext(ctx: StepContext): scanCodeService.ScanTemplateContext;
|
|
48
54
|
/** The `{subject.x}` bag: the held row's metadata plus its id. */
|
|
49
55
|
export declare function subjectBag(row: LTEscalationRecord): Record<string, unknown>;
|
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.targetFilter = targetFilter;
|
|
37
|
+
exports.targetValue = targetValue;
|
|
37
38
|
exports.templateContext = templateContext;
|
|
38
39
|
exports.subjectBag = subjectBag;
|
|
39
40
|
exports.liveClaimMetadata = liveClaimMetadata;
|
|
@@ -52,7 +53,15 @@ const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
|
52
53
|
const escalationService = __importStar(require("../../services/escalation"));
|
|
53
54
|
const types_1 = require("../../types");
|
|
54
55
|
function targetFilter(step, ctx) {
|
|
55
|
-
return { [ctx.scheme.target_facet]: ctx
|
|
56
|
+
return { [ctx.scheme.target_facet]: targetValue(ctx), ...(step.query?.facets ?? {}) };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The value the target facet contains on a matching row: the target, or a
|
|
60
|
+
* one-item list when the scheme's facet holds a list (`metadata @>` then
|
|
61
|
+
* matches membership).
|
|
62
|
+
*/
|
|
63
|
+
function targetValue(ctx) {
|
|
64
|
+
return ctx.scheme.target_match === types_1.SCAN_TARGET_MATCH.MEMBER ? [ctx.parsed.target] : ctx.parsed.target;
|
|
56
65
|
}
|
|
57
66
|
function templateContext(ctx) {
|
|
58
67
|
return {
|
|
@@ -41,6 +41,8 @@ const userService = __importStar(require("../../services/user"));
|
|
|
41
41
|
const uuid_1 = require("../../lib/uuid");
|
|
42
42
|
const helpers_1 = require("../escalations/helpers");
|
|
43
43
|
const types_1 = require("../../types");
|
|
44
|
+
const scan_code_1 = require("../../shared/scan-code");
|
|
45
|
+
const escalation_1 = require("../../types/escalation");
|
|
44
46
|
async function resolveSubject(ref, schemes, stationAuth) {
|
|
45
47
|
if (!ref)
|
|
46
48
|
return null;
|
|
@@ -49,16 +51,43 @@ async function resolveSubject(ref, schemes, stationAuth) {
|
|
|
49
51
|
const parsed = scanCodeService.parseScanCode(ref.code, schemes);
|
|
50
52
|
if (!parsed.ok || parsed.scheme.kind !== types_1.SCAN_SCHEME_KINDS.ACTION)
|
|
51
53
|
return { ok: false };
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
+
const held = await escalationService.getEscalation(ref.escalationId);
|
|
55
|
+
const row = held?.status === 'pending' ? held : await nextRound(held, parsed.scheme, parsed.parsed.target);
|
|
56
|
+
if (!row)
|
|
54
57
|
return { ok: false };
|
|
55
58
|
if (await (0, helpers_1.assertReadAccess)(stationAuth.userId, row))
|
|
56
59
|
return { ok: false };
|
|
57
|
-
if (row.metadata?.[parsed.scheme.target_facet]
|
|
60
|
+
if (!(0, scan_code_1.facetHolds)(row.metadata?.[parsed.scheme.target_facet], parsed.parsed.target)) {
|
|
58
61
|
return { ok: false };
|
|
59
62
|
}
|
|
60
63
|
return { ok: true, subject: { row, parsed: parsed.parsed, scheme: parsed.scheme, code: ref.code } };
|
|
61
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* The pending round that follows a row a fill resolved to wake its wait
|
|
67
|
+
* (`$trigger: 'fill'`): the one pending row in the same role, of the same
|
|
68
|
+
* workflow, carrying the same target. Null when there is none yet.
|
|
69
|
+
*/
|
|
70
|
+
async function nextRound(held, scheme, target) {
|
|
71
|
+
if (!held || held.status !== 'resolved' || !held.workflow_id)
|
|
72
|
+
return null;
|
|
73
|
+
if (resolverTrigger(held) !== escalation_1.ESCALATION_TRIGGER_FILL)
|
|
74
|
+
return null;
|
|
75
|
+
const value = scheme.target_match === types_1.SCAN_TARGET_MATCH.MEMBER ? [target] : target;
|
|
76
|
+
const { escalations } = await escalationService.searchByFacets({
|
|
77
|
+
roles: [held.role], facets: { [scheme.target_facet]: value }, status: 'pending', limit: 2,
|
|
78
|
+
});
|
|
79
|
+
const rounds = escalations.filter((e) => e.workflow_id === held.workflow_id);
|
|
80
|
+
return rounds.length === 1 ? rounds[0] : null;
|
|
81
|
+
}
|
|
82
|
+
function resolverTrigger(row) {
|
|
83
|
+
try {
|
|
84
|
+
const payload = typeof row.resolver_payload === 'string' ? JSON.parse(row.resolver_payload) : row.resolver_payload;
|
|
85
|
+
return payload?.[escalation_1.ESCALATION_TRIGGER_KEY];
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
62
91
|
/** Who holds a live claim on the row, when that is someone other than `actorId`. */
|
|
63
92
|
async function claimedByOther(row, actorId) {
|
|
64
93
|
if (!row.assigned_to || !(0, types_1.isEffectivelyClaimed)(row) || row.assigned_to === actorId)
|
|
@@ -109,7 +109,7 @@ async function accumulateStep(step, ctx) {
|
|
|
109
109
|
else {
|
|
110
110
|
request = {
|
|
111
111
|
key: ctx.scheme.target_facet,
|
|
112
|
-
value: ctx
|
|
112
|
+
value: (0, context_1.targetValue)(ctx),
|
|
113
113
|
itemKey: rendered.itemKey,
|
|
114
114
|
payload: rendered.payload,
|
|
115
115
|
metadata: rendered.metadata,
|
|
@@ -139,7 +139,8 @@ async function fillStep(step, ctx) {
|
|
|
139
139
|
}, ctx.auth);
|
|
140
140
|
if (result.status === 200) {
|
|
141
141
|
const data = result.data;
|
|
142
|
-
|
|
142
|
+
// A fill that woke the wait (`woke`) is interim here: the next round carries the rest.
|
|
143
|
+
const done = data.outcome === escalation_1.BATCH_ITEM_OUTCOMES.COMPLETED;
|
|
143
144
|
const filled = progress(batch, batch.pending.length - (done ? 0 : (data.remaining ?? 0)));
|
|
144
145
|
const next = pendingCopy(batch.pending.filter((k) => k !== itemKey), separator, labeler).next;
|
|
145
146
|
return (0, context_1.withDone)({
|
|
@@ -62,7 +62,7 @@ async function locateItem(step, ctx) {
|
|
|
62
62
|
roles: roles ?? undefined,
|
|
63
63
|
types: selector.types,
|
|
64
64
|
subtypes: selector.subtypes,
|
|
65
|
-
facets: { ...selector.facets, [ctx.scheme.target_facet]: ctx
|
|
65
|
+
facets: { ...selector.facets, [ctx.scheme.target_facet]: (0, context_1.targetValue)(ctx) },
|
|
66
66
|
status: 'pending',
|
|
67
67
|
exists: [escalation_1.ESCALATION_ACCUMULATE_KEYS.COUNT],
|
|
68
68
|
limit: 3,
|
|
@@ -87,7 +87,7 @@ async function locateContainer(step, ctx) {
|
|
|
87
87
|
roles: roles ?? undefined,
|
|
88
88
|
types: selector?.types,
|
|
89
89
|
subtypes: selector?.subtypes,
|
|
90
|
-
facets: { ...selector?.facets, [ctx.scheme.target_facet]: ctx
|
|
90
|
+
facets: { ...selector?.facets, [ctx.scheme.target_facet]: (0, context_1.targetValue)(ctx) },
|
|
91
91
|
status: 'pending',
|
|
92
92
|
exists: [escalation_1.ESCALATION_ACCUMULATE_KEYS.COUNT],
|
|
93
93
|
limit: 2,
|
|
@@ -64,7 +64,7 @@ async function claimStep(step, ctx, presentedId) {
|
|
|
64
64
|
return notPrimed;
|
|
65
65
|
const result = await (0, metadata_1.claimByMetadata)({
|
|
66
66
|
key: ctx.scheme.target_facet,
|
|
67
|
-
value: ctx
|
|
67
|
+
value: (0, context_1.targetValue)(ctx),
|
|
68
68
|
durationMinutes: step.params?.durationMinutes,
|
|
69
69
|
metadata: { ...metadata, ...(0, context_1.provenance)(ctx) },
|
|
70
70
|
restrictRoles: step.query?.roles,
|
|
@@ -95,7 +95,7 @@ async function resolveStep(step, ctx, presentedId) {
|
|
|
95
95
|
return notPrimed;
|
|
96
96
|
const result = await (0, metadata_1.resolveByMetadata)({
|
|
97
97
|
key: ctx.scheme.target_facet,
|
|
98
|
-
value: ctx
|
|
98
|
+
value: (0, context_1.targetValue)(ctx),
|
|
99
99
|
resolverPayload: rendered.resolverPayload,
|
|
100
100
|
metadata: { ...rendered.metadata, ...(0, context_1.provenance)(ctx) },
|
|
101
101
|
restrictRoles: step.query?.roles,
|
|
@@ -143,7 +143,7 @@ async function escalateStep(step, ctx, presentedId) {
|
|
|
143
143
|
role: step.params.targetRole,
|
|
144
144
|
description: step.params?.description ?? ctx.rule.name,
|
|
145
145
|
metadata: {
|
|
146
|
-
[ctx.scheme.target_facet]: ctx
|
|
146
|
+
[ctx.scheme.target_facet]: (0, context_1.targetValue)(ctx),
|
|
147
147
|
...(0, context_1.interpolatedMetadata)(step, ctx),
|
|
148
148
|
...(0, context_1.provenance)(ctx),
|
|
149
149
|
},
|
|
@@ -234,7 +234,7 @@ async function cancelStep(step, ctx, presentedId) {
|
|
|
234
234
|
return notPrimed;
|
|
235
235
|
const claimed = await (0, metadata_1.claimByMetadata)({
|
|
236
236
|
key: ctx.scheme.target_facet,
|
|
237
|
-
value: ctx
|
|
237
|
+
value: (0, context_1.targetValue)(ctx),
|
|
238
238
|
metadata: (0, context_1.provenance)(ctx),
|
|
239
239
|
restrictRoles: step.query?.roles,
|
|
240
240
|
assertId: presentedId,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
-- Migration 043: pattern scan schemes and list-valued target facets
|
|
2
|
+
--
|
|
3
|
+
-- encoding 'pattern': a scheme whose codes carry no scheme or category, such
|
|
4
|
+
-- as a carrier tracking number. A code matching one of `patterns` (regular
|
|
5
|
+
-- expressions over the whole code) parses with the code as the target, and
|
|
6
|
+
-- the scheme's single rule is category '0'. `precedes_gtin` declares which
|
|
7
|
+
-- reads a digits-only code first while an enabled gtin scheme exists: true,
|
|
8
|
+
-- the patterns; false, the gtin scheme. Beside an enabled gtin scheme the
|
|
9
|
+
-- declaration is required.
|
|
10
|
+
--
|
|
11
|
+
-- target_match:
|
|
12
|
+
-- 'value' the target facet holds one value equal to the target.
|
|
13
|
+
-- 'member' the target facet holds a list; a row matches when the list
|
|
14
|
+
-- contains the target (metadata @> {facet: [target]}).
|
|
15
|
+
|
|
16
|
+
ALTER TABLE lt_config_scan_schemes
|
|
17
|
+
DROP CONSTRAINT IF EXISTS lt_config_scan_schemes_encoding_check;
|
|
18
|
+
ALTER TABLE lt_config_scan_schemes
|
|
19
|
+
ADD CONSTRAINT lt_config_scan_schemes_encoding_check
|
|
20
|
+
CHECK (encoding IN ('fixed', 'delimited', 'gtin', 'pattern'));
|
|
21
|
+
|
|
22
|
+
ALTER TABLE lt_config_scan_schemes
|
|
23
|
+
ADD COLUMN IF NOT EXISTS patterns JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
24
|
+
ADD COLUMN IF NOT EXISTS precedes_gtin BOOLEAN,
|
|
25
|
+
ADD COLUMN IF NOT EXISTS target_match TEXT NOT NULL DEFAULT 'value'
|
|
26
|
+
CHECK (target_match IN ('value', 'member'));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasFacetValue = hasFacetValue;
|
|
4
|
+
/** True when a facet value names something to match: a non-empty string or a non-empty list of them. */
|
|
5
|
+
function hasFacetValue(value) {
|
|
6
|
+
if (typeof value === 'string')
|
|
7
|
+
return value.length > 0;
|
|
8
|
+
return Array.isArray(value) && value.length > 0 && value.every((v) => typeof v === 'string' && v.length > 0);
|
|
9
|
+
}
|
|
@@ -105,6 +105,9 @@ router.put('/schemes/:version', auth_1.requireRoleManager, async (req, res) => {
|
|
|
105
105
|
grant_ttl_seconds: req.body.grant_ttl_seconds,
|
|
106
106
|
grant_max_uses: req.body.grant_max_uses,
|
|
107
107
|
grant_scope: req.body.grant_scope,
|
|
108
|
+
patterns: req.body.patterns,
|
|
109
|
+
precedes_gtin: req.body.precedes_gtin,
|
|
110
|
+
target_match: req.body.target_match,
|
|
108
111
|
enabled: req.body.enabled,
|
|
109
112
|
});
|
|
110
113
|
res.status(result.status).json(result.data ?? { error: result.error });
|
package/build/sdk/index.d.ts
CHANGED
|
@@ -207,7 +207,7 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
207
207
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
208
208
|
claimByMetadata: (input: {
|
|
209
209
|
key: string;
|
|
210
|
-
value:
|
|
210
|
+
value: import("..").FacetValue;
|
|
211
211
|
durationMinutes?: number;
|
|
212
212
|
assignee?: string;
|
|
213
213
|
metadata?: Record<string, any>;
|
|
@@ -217,7 +217,7 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
217
217
|
}, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
218
218
|
resolveByMetadata: (input: {
|
|
219
219
|
key: string;
|
|
220
|
-
value:
|
|
220
|
+
value: import("..").FacetValue;
|
|
221
221
|
resolverPayload: Record<string, any>;
|
|
222
222
|
assignee?: string;
|
|
223
223
|
metadata?: Record<string, any>;
|
|
@@ -266,7 +266,7 @@ export declare function createClient(options?: LTClientOptions): {
|
|
|
266
266
|
} & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
267
267
|
accumulateByMetadata: (input: {
|
|
268
268
|
key: string;
|
|
269
|
-
value:
|
|
269
|
+
value: import("..").FacetValue;
|
|
270
270
|
restrictRoles?: string[];
|
|
271
271
|
container?: import("..").ContainerSelector;
|
|
272
272
|
} & Omit<import("../api/escalations/accumulate").AccumulateItemInput, "assertClaim">, auth?: LTApiAuth) => Promise<LTApiResult<any>>;
|
|
@@ -3,15 +3,16 @@ export interface ResolveBatchItemOutcome {
|
|
|
3
3
|
outcome: BatchItemOutcome;
|
|
4
4
|
/** Items still awaiting submission after this call (0 exactly when completed). */
|
|
5
5
|
remaining: number;
|
|
6
|
-
/** The post-fill row on `completed`/`accepted`; null on every failure outcome. */
|
|
6
|
+
/** The post-fill row on `completed`/`accepted`/`woke`; null on every failure outcome. */
|
|
7
7
|
escalation: LTEscalationRecord | null;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* Fills one declared item of a batch escalation in a single atomic SDK
|
|
11
11
|
* statement (guarded fill + facet recompute + resolve-and-wake on the last
|
|
12
12
|
* item). `actor` is recorded under `envelope.batch_filled_by[itemKey]`. Interim fills publish `escalation.updated` with progress; the
|
|
13
|
-
* completing fill
|
|
14
|
-
* outcomes publish nothing — the
|
|
13
|
+
* completing fill, and a fill that woke a `wakeOnFill` wait (`woke`), publish
|
|
14
|
+
* the standard `escalation.resolved`. Failure outcomes publish nothing — the
|
|
15
|
+
* row was untouched.
|
|
15
16
|
*/
|
|
16
17
|
export declare function resolveBatchItem(id: string, itemKey: string, payload: Record<string, any>, metadata?: Record<string, any>, assertClaim?: string, resolvedBy?: {
|
|
17
18
|
id: string;
|
|
@@ -4,6 +4,7 @@ exports.resolveBatchItem = resolveBatchItem;
|
|
|
4
4
|
exports.resolveBatchItemBySignalKey = resolveBatchItemBySignalKey;
|
|
5
5
|
exports.resolveBatchItemByMetadata = resolveBatchItemByMetadata;
|
|
6
6
|
const escalation_wire_1 = require("../../lib/events/escalation-wire");
|
|
7
|
+
const escalation_1 = require("../../types/escalation");
|
|
7
8
|
const uuid_1 = require("../../lib/uuid");
|
|
8
9
|
const client_1 = require("./client");
|
|
9
10
|
const crud_1 = require("./crud");
|
|
@@ -12,8 +13,9 @@ const map_1 = require("./map");
|
|
|
12
13
|
* Fills one declared item of a batch escalation in a single atomic SDK
|
|
13
14
|
* statement (guarded fill + facet recompute + resolve-and-wake on the last
|
|
14
15
|
* item). `actor` is recorded under `envelope.batch_filled_by[itemKey]`. Interim fills publish `escalation.updated` with progress; the
|
|
15
|
-
* completing fill
|
|
16
|
-
* outcomes publish nothing — the
|
|
16
|
+
* completing fill, and a fill that woke a `wakeOnFill` wait (`woke`), publish
|
|
17
|
+
* the standard `escalation.resolved`. Failure outcomes publish nothing — the
|
|
18
|
+
* row was untouched.
|
|
17
19
|
*/
|
|
18
20
|
async function resolveBatchItem(id, itemKey, payload, metadata, assertClaim, resolvedBy, actor) {
|
|
19
21
|
if (!(0, uuid_1.isUuid)(id))
|
|
@@ -72,7 +74,7 @@ function settleBatchOutcome(result, itemKey) {
|
|
|
72
74
|
return { outcome: result.outcome, remaining: -1, escalation: null };
|
|
73
75
|
}
|
|
74
76
|
const escalation = (0, map_1.toEscalationRecord)(result.entry);
|
|
75
|
-
const completed = result.outcome ===
|
|
77
|
+
const completed = result.outcome === escalation_1.BATCH_ITEM_OUTCOMES.COMPLETED || result.outcome === escalation_1.BATCH_ITEM_OUTCOMES.WOKE;
|
|
76
78
|
(0, crud_1.publishEscalationChange)({
|
|
77
79
|
type: completed ? 'escalation.resolved' : 'escalation.updated',
|
|
78
80
|
source: 'service',
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ClaimResult } from './types';
|
|
2
|
+
import type { FacetValue } from '../../types/facets';
|
|
2
3
|
/**
|
|
3
4
|
* Claims one named row, the same claim `claimByMetadata` makes on the row it
|
|
4
5
|
* picks: pending, the facet still matches, the role is allowed, and no live
|
|
@@ -7,4 +8,4 @@ import type { ClaimResult } from './types';
|
|
|
7
8
|
*/
|
|
8
9
|
export declare const CLAIM_ASSERTED = "WITH target AS MATERIALIZED (\n SELECT id, assigned_to AS prior_assigned_to FROM public.hmsh_escalations\n WHERE id = $6\n AND metadata @> $1::jsonb\n AND ($4::text[] IS NULL OR role = ANY($4::text[]))\n AND status = 'pending'\n AND (assigned_to IS NULL OR assigned_until IS NULL OR assigned_until <= NOW() OR assigned_to = $2)\n FOR UPDATE SKIP LOCKED\n)\nUPDATE public.hmsh_escalations e\nSET assigned_to = $2,\n claimed_at = NOW(),\n claim_expires_at = NOW() + ($3 * INTERVAL '1 minute'),\n assigned_until = NOW() + ($3 * INTERVAL '1 minute'),\n metadata = CASE WHEN $5::jsonb IS NOT NULL\n THEN COALESCE(e.metadata, '{}'::jsonb) || $5::jsonb\n ELSE e.metadata END,\n updated_at = NOW()\nFROM target WHERE e.id = target.id\nRETURNING e.*, target.prior_assigned_to\n";
|
|
9
10
|
/** Claim the row `id` when it still carries `key = value`; null when it does not. */
|
|
10
|
-
export declare function claimAssertedByMetadata(id: string, key: string, value:
|
|
11
|
+
export declare function claimAssertedByMetadata(id: string, key: string, value: FacetValue, userId: string, durationMinutes?: number, metadata?: Record<string, any>, allowedRoles?: string[] | null): Promise<ClaimResult | null>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { publishEscalationEvent } from '../../lib/events/publish';
|
|
2
2
|
import type { LTEscalationRecord, ScanAvailability } from '../../types';
|
|
3
3
|
import type { CreateEscalationInput, ClaimResult } from './types';
|
|
4
|
+
import type { FacetValue } from '../../types/facets';
|
|
4
5
|
/**
|
|
5
6
|
* Every escalation write publishes an event AND drops this container's cached
|
|
6
7
|
* aggregates — the event triggers a dashboard refetch, which must observe the
|
|
@@ -212,7 +213,7 @@ export declare function findByMetadata(key: string, value: string, status?: stri
|
|
|
212
213
|
* excluded from claim-by-metadata (their items are pre-claimed and resolved
|
|
213
214
|
* by id). Self-scope claim-by-metadata would require a HotMesh SDK predicate.
|
|
214
215
|
*/
|
|
215
|
-
export declare function claimByMetadata(key: string, value:
|
|
216
|
+
export declare function claimByMetadata(key: string, value: FacetValue, userId: string, durationMinutes?: number, metadata?: Record<string, any>, allowedRoles?: string[] | null): Promise<(ClaimResult & {
|
|
216
217
|
candidatesExist: number;
|
|
217
218
|
}) | null>;
|
|
218
219
|
export interface ResolveByMetadataResult {
|
|
@@ -256,4 +257,4 @@ export interface ResolveByMetadataResult {
|
|
|
256
257
|
* business logic over the shared table, so it runs as one atomic statement on
|
|
257
258
|
* `hmsh_escalations` rather than through the generic SDK resolve.
|
|
258
259
|
*/
|
|
259
|
-
export declare function resolveByMetadataAtomic(key: string, value:
|
|
260
|
+
export declare function resolveByMetadataAtomic(key: string, value: FacetValue, userId: string, resolverPayload: Record<string, any>, metadata?: Record<string, any>, writeAllRoles?: string[] | null, writeSelfRoles?: string[] | null, enforcingRoles?: string[] | null, assertId?: string | null, extraFacets?: Record<string, any> | null, availability?: ScanAvailability | null): Promise<ResolveByMetadataResult>;
|
|
@@ -126,6 +126,12 @@ export type ConditionEscalationConfig = Types.ConditionQueueConfig & {
|
|
|
126
126
|
* already satisfied go in `filled` (hotmesh 0.31.0+), keyed by item key
|
|
127
127
|
* with `payload`, `at` from the source of record, and an optional `actor`;
|
|
128
128
|
* the row starts with that progress and delivers them with the collection.
|
|
129
|
+
* Add `wakeOnFill: true` (or a list of keys, hotmesh 0.32.0+) and a fill
|
|
130
|
+
* resumes the wait with the items so far, `$filled: [itemKey]`, `$filledAt`,
|
|
131
|
+
* `$filledBy` and `$trigger: 'fill'`, so the workflow acts on each item as it
|
|
132
|
+
* lands; park the next round with every fill carried forward in `filled`,
|
|
133
|
+
* built from `$filledAt` and `$filledBy`. The last key completes as on any
|
|
134
|
+
* batch.
|
|
129
135
|
*
|
|
130
136
|
* **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
|
|
131
137
|
* `accumulate` and the escalation holds items added via `accumulateItem`
|
|
@@ -172,6 +172,12 @@ function toEngineConfig(escalation) {
|
|
|
172
172
|
* already satisfied go in `filled` (hotmesh 0.31.0+), keyed by item key
|
|
173
173
|
* with `payload`, `at` from the source of record, and an optional `actor`;
|
|
174
174
|
* the row starts with that progress and delivers them with the collection.
|
|
175
|
+
* Add `wakeOnFill: true` (or a list of keys, hotmesh 0.32.0+) and a fill
|
|
176
|
+
* resumes the wait with the items so far, `$filled: [itemKey]`, `$filledAt`,
|
|
177
|
+
* `$filledBy` and `$trigger: 'fill'`, so the workflow acts on each item as it
|
|
178
|
+
* lands; park the next round with every fill carried forward in `filled`,
|
|
179
|
+
* built from `$filledAt` and `$filledBy`. The last key completes as on any
|
|
180
|
+
* batch.
|
|
175
181
|
*
|
|
176
182
|
* **Open accumulation — items arrive over time (hotmesh 0.29.0+).** Declare
|
|
177
183
|
* `accumulate` and the escalation holds items added via `accumulateItem`
|
|
@@ -15,6 +15,9 @@ function mapScheme(row) {
|
|
|
15
15
|
encoding: row.encoding,
|
|
16
16
|
delimiter: row.delimiter,
|
|
17
17
|
target_length: row.target_length ?? null,
|
|
18
|
+
patterns: Array.isArray(row.patterns) ? row.patterns : [],
|
|
19
|
+
precedes_gtin: row.precedes_gtin ?? null,
|
|
20
|
+
target_match: row.target_match ?? 'value',
|
|
18
21
|
kind: row.kind ?? 'action',
|
|
19
22
|
grant_ttl_seconds: row.grant_ttl_seconds ?? null,
|
|
20
23
|
grant_max_uses: row.grant_max_uses ?? 0,
|
|
@@ -2,16 +2,16 @@ export declare const LIST_SCHEMES = "SELECT * FROM lt_config_scan_schemes ORDER
|
|
|
2
2
|
export declare const GET_SCHEME = "SELECT * FROM lt_config_scan_schemes WHERE version = $1";
|
|
3
3
|
export declare const LIST_ACTIONS = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 ORDER BY category";
|
|
4
4
|
export declare const GET_ACTION = "SELECT * FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
|
|
5
|
-
export declare const UPSERT_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n enabled = EXCLUDED.enabled\nRETURNING *";
|
|
5
|
+
export declare const UPSERT_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,\n patterns, precedes_gtin, target_match)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n patterns = EXCLUDED.patterns,\n precedes_gtin = EXCLUDED.precedes_gtin,\n target_match = EXCLUDED.target_match,\n enabled = EXCLUDED.enabled\nRETURNING *";
|
|
6
6
|
export declare const DELETE_SCHEME = "DELETE FROM lt_config_scan_schemes WHERE version = $1";
|
|
7
7
|
export declare const UPSERT_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO UPDATE SET\n name = EXCLUDED.name,\n steps = EXCLUDED.steps,\n fallback = EXCLUDED.fallback,\n not_primed = EXCLUDED.not_primed,\n enabled = EXCLUDED.enabled\nRETURNING *";
|
|
8
8
|
export declare const DELETE_ACTION = "DELETE FROM lt_config_scan_actions WHERE scheme_version = $1 AND category = $2";
|
|
9
|
-
export declare const SEED_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (version) DO NOTHING";
|
|
9
|
+
export declare const SEED_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,\n patterns, precedes_gtin, target_match)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (version) DO NOTHING";
|
|
10
10
|
export declare const SEED_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO NOTHING";
|
|
11
11
|
/**
|
|
12
12
|
* Apply — same column set as the upsert, guarded by IS DISTINCT FROM so an
|
|
13
13
|
* unchanged declaration is a zero-row no-op. `(xmax = 0)` distinguishes
|
|
14
14
|
* insert from update. jsonb columns compare content-wise in SQL.
|
|
15
15
|
*/
|
|
16
|
-
export declare const APPLY_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,\n lt_config_scan_schemes.target_facet, lt_config_scan_schemes.encoding,\n lt_config_scan_schemes.delimiter, lt_config_scan_schemes.target_length,\n lt_config_scan_schemes.kind, lt_config_scan_schemes.grant_ttl_seconds,\n lt_config_scan_schemes.grant_max_uses, lt_config_scan_schemes.enabled,\n lt_config_scan_schemes.grant_scope)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.description, EXCLUDED.target_facet,\n EXCLUDED.encoding, EXCLUDED.delimiter, EXCLUDED.target_length,\n EXCLUDED.kind, EXCLUDED.grant_ttl_seconds, EXCLUDED.grant_max_uses,\n EXCLUDED.enabled, EXCLUDED.grant_scope)\nRETURNING (xmax = 0) AS inserted";
|
|
16
|
+
export declare const APPLY_SCHEME = "INSERT INTO lt_config_scan_schemes\n (version, name, description, target_facet, encoding, delimiter, target_length,\n kind, grant_ttl_seconds, grant_max_uses, enabled, grant_scope,\n patterns, precedes_gtin, target_match)\nVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)\nON CONFLICT (version) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n target_facet = EXCLUDED.target_facet,\n encoding = EXCLUDED.encoding,\n delimiter = EXCLUDED.delimiter,\n target_length = EXCLUDED.target_length,\n kind = EXCLUDED.kind,\n grant_ttl_seconds = EXCLUDED.grant_ttl_seconds,\n grant_max_uses = EXCLUDED.grant_max_uses,\n grant_scope = EXCLUDED.grant_scope,\n patterns = EXCLUDED.patterns,\n precedes_gtin = EXCLUDED.precedes_gtin,\n target_match = EXCLUDED.target_match,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_schemes.name, lt_config_scan_schemes.description,\n lt_config_scan_schemes.target_facet, lt_config_scan_schemes.encoding,\n lt_config_scan_schemes.delimiter, lt_config_scan_schemes.target_length,\n lt_config_scan_schemes.kind, lt_config_scan_schemes.grant_ttl_seconds,\n lt_config_scan_schemes.grant_max_uses, lt_config_scan_schemes.enabled,\n lt_config_scan_schemes.grant_scope, lt_config_scan_schemes.patterns,\n lt_config_scan_schemes.precedes_gtin, lt_config_scan_schemes.target_match)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.description, EXCLUDED.target_facet,\n EXCLUDED.encoding, EXCLUDED.delimiter, EXCLUDED.target_length,\n EXCLUDED.kind, EXCLUDED.grant_ttl_seconds, EXCLUDED.grant_max_uses,\n EXCLUDED.enabled, EXCLUDED.grant_scope, EXCLUDED.patterns,\n EXCLUDED.precedes_gtin, EXCLUDED.target_match)\nRETURNING (xmax = 0) AS inserted";
|
|
17
17
|
export declare const APPLY_ACTION = "INSERT INTO lt_config_scan_actions\n (scheme_version, category, name, steps, fallback, not_primed, enabled)\nVALUES ($1, $2, $3, $4, $5, $6, $7)\nON CONFLICT (scheme_version, category) DO UPDATE SET\n name = EXCLUDED.name,\n steps = EXCLUDED.steps,\n fallback = EXCLUDED.fallback,\n not_primed = EXCLUDED.not_primed,\n enabled = EXCLUDED.enabled,\n updated_at = NOW()\nWHERE (lt_config_scan_actions.name, lt_config_scan_actions.steps,\n lt_config_scan_actions.fallback, lt_config_scan_actions.not_primed,\n lt_config_scan_actions.enabled)\n IS DISTINCT FROM\n (EXCLUDED.name, EXCLUDED.steps, EXCLUDED.fallback,\n EXCLUDED.not_primed, EXCLUDED.enabled)\nRETURNING (xmax = 0) AS inserted";
|