@hotmeshio/long-tail 0.22.1 → 0.22.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.js +38 -19
- package/build/api/escalations/lookups.d.ts +9 -2
- package/build/api/escalations/lookups.js +15 -3
- package/build/api/escalations/metadata.d.ts +2 -0
- package/build/api/escalations/metadata.js +9 -0
- package/build/api/escalations/resolve-batch.js +18 -11
- package/build/api/roles.js +4 -0
- package/build/api/scan-codes/badge-policy.d.ts +10 -0
- package/build/api/scan-codes/badge-policy.js +72 -0
- package/build/api/scan-codes/choice.js +16 -10
- package/build/api/scan-codes/context.d.ts +45 -1
- package/build/api/scan-codes/context.js +51 -3
- package/build/api/scan-codes/execute.js +73 -35
- package/build/api/scan-codes/grant.d.ts +27 -0
- package/build/api/scan-codes/grant.js +67 -0
- package/build/api/scan-codes/hold.d.ts +10 -0
- package/build/api/scan-codes/hold.js +98 -0
- package/build/api/scan-codes/identity.d.ts +5 -2
- package/build/api/scan-codes/identity.js +26 -8
- package/build/api/scan-codes/locate.js +4 -0
- package/build/api/scan-codes/present.d.ts +1 -1
- package/build/api/scan-codes/present.js +43 -0
- package/build/api/scan-codes/subject.d.ts +15 -0
- package/build/api/scan-codes/subject.js +68 -0
- package/build/api/scan-codes/verb-accumulate.d.ts +24 -0
- package/build/api/scan-codes/verb-accumulate.js +151 -0
- package/build/api/scan-codes/verb-fill.d.ts +6 -0
- package/build/api/scan-codes/verb-fill.js +155 -0
- package/build/api/scan-codes/verb-into-subject.d.ts +12 -0
- package/build/api/scan-codes/verb-into-subject.js +157 -0
- package/build/api/scan-codes/verbs-subject.d.ts +33 -0
- package/build/api/scan-codes/verbs-subject.js +247 -0
- package/build/api/scan-codes/verbs.d.ts +11 -29
- package/build/api/scan-codes/verbs.js +51 -131
- package/build/index.d.ts +1 -0
- package/build/index.js +9 -2
- package/build/lib/db/schemas/037_scan_gtin_and_subject_grants.sql +27 -0
- package/build/routes/escalations/acting.d.ts +5 -0
- package/build/routes/escalations/acting.js +8 -1
- package/build/routes/scan-codes.js +3 -0
- package/build/sdk/index.d.ts +1 -0
- package/build/services/escalation/claim-asserted.d.ts +10 -0
- package/build/services/escalation/claim-asserted.js +64 -0
- package/build/services/escalation/facets.d.ts +3 -1
- package/build/services/escalation/facets.js +7 -3
- package/build/services/escalation/index.d.ts +1 -0
- package/build/services/escalation/index.js +3 -1
- package/build/services/iam/acting-identity.d.ts +29 -4
- package/build/services/iam/acting-identity.js +60 -17
- package/build/services/iam/ephemeral.d.ts +21 -0
- package/build/services/iam/ephemeral.js +32 -1
- package/build/services/iam/sql.d.ts +10 -0
- package/build/services/iam/sql.js +32 -3
- package/build/services/knowledge/lookup-cache.d.ts +16 -4
- package/build/services/knowledge/lookup-cache.js +53 -20
- package/build/services/knowledge/lookup-refs.d.ts +3 -2
- package/build/services/knowledge/lookup-refs.js +6 -4
- package/build/services/knowledge/sql.d.ts +2 -0
- package/build/services/knowledge/sql.js +9 -1
- package/build/services/mcp/server-tools.js +1 -1
- package/build/services/orchestrator/condition.d.ts +13 -10
- package/build/services/orchestrator/condition.js +8 -6
- package/build/services/role/badge-grant.d.ts +5 -0
- package/build/services/role/badge-grant.js +36 -0
- package/build/services/role/seed.js +5 -0
- package/build/services/role/types.d.ts +14 -0
- package/build/services/role/types.js +5 -0
- package/build/services/scan-code/index.d.ts +3 -2
- package/build/services/scan-code/index.js +8 -1
- package/build/services/scan-code/parse.d.ts +23 -20
- package/build/services/scan-code/parse.js +45 -90
- package/build/services/scan-code/read.js +1 -0
- package/build/services/scan-code/sql.d.ts +3 -3
- package/build/services/scan-code/sql.js +11 -8
- package/build/services/scan-code/validate-facts.d.ts +5 -0
- package/build/services/scan-code/validate-facts.js +24 -0
- package/build/services/scan-code/validate-query.d.ts +8 -0
- package/build/services/scan-code/validate-query.js +36 -0
- package/build/services/scan-code/validate-subject.d.ts +7 -0
- package/build/services/scan-code/validate-subject.js +185 -0
- package/build/services/scan-code/validate.d.ts +7 -0
- package/build/services/scan-code/validate.js +103 -18
- package/build/services/scan-code/write.d.ts +1 -0
- package/build/services/scan-code/write.js +9 -3
- package/build/shared/form-validation/field-validator.js +4 -0
- package/build/shared/form-validation/index.d.ts +1 -0
- package/build/shared/form-validation/index.js +1 -0
- package/build/shared/form-validation/x-lt-scan.d.ts +52 -0
- package/build/shared/form-validation/x-lt-scan.js +166 -0
- package/build/shared/scan-code/gtin.d.ts +11 -0
- package/build/shared/scan-code/gtin.js +38 -0
- package/build/shared/scan-code/index.d.ts +2 -0
- package/build/shared/scan-code/index.js +11 -0
- package/build/shared/scan-code/parse.d.ts +46 -0
- package/build/shared/scan-code/parse.js +133 -0
- package/build/system/mcp-servers/admin/scan-codes.js +10 -4
- package/build/system/mcp-servers/admin/schemas.d.ts +939 -28
- package/build/system/mcp-servers/admin/schemas.js +72 -6
- package/build/system/mcp-servers/human-queue-schemas.d.ts +6 -6
- package/build/system/seed/tool-manifests-admin.d.ts +202 -1
- package/build/system/seed/tool-manifests-admin.js +2 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/escalation.d.ts +16 -8
- package/build/types/escalation.js +18 -7
- package/build/types/index.d.ts +4 -4
- package/build/types/index.js +10 -1
- package/build/types/scan-code/constants.d.ts +182 -0
- package/build/types/{scan-code.js → scan-code/constants.js} +72 -11
- package/build/types/scan-code/index.d.ts +3 -0
- package/build/types/scan-code/index.js +17 -0
- package/build/types/scan-code/response.d.ts +145 -0
- package/build/types/scan-code/response.js +2 -0
- package/build/types/scan-code/rule.d.ts +229 -0
- package/build/types/scan-code/rule.js +2 -0
- package/build/types/startup.d.ts +3 -1
- package/dashboard/dist/assets/{AdminDashboard-BbWve-Ax.js → AdminDashboard-hI5-kKpL.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-BbWve-Ax.js.map → AdminDashboard-hI5-kKpL.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-M-9eTKhP.js → AgentConfigPage-DetU4HZe.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-M-9eTKhP.js.map → AgentConfigPage-DetU4HZe.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CsakSlx5.js → AgentDetailPage-DrGXo8KQ.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CsakSlx5.js.map → AgentDetailPage-DrGXo8KQ.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-Cj_cRTT1.js → AgentsPage-D4md5BzM.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-Cj_cRTT1.js.map → AgentsPage-D4md5BzM.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-BXJmMBM1.js → AvailableEscalationsPage-B2bS2ZJy.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-BXJmMBM1.js.map → AvailableEscalationsPage-B2bS2ZJy.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-CGB16rYU.js → BotPicker-BXtey255.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-CGB16rYU.js.map → BotPicker-BXtey255.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-MjxcU7N1.js → BulkAssignModal-CSL_PeZv.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-MjxcU7N1.js.map → BulkAssignModal-CSL_PeZv.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-5scufTHW.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-BxadotXn.js.map → CapabilitiesPage-5scufTHW.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BBNpP-6h.js → CollapsibleSection-DjjDGxP_.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BBNpP-6h.js.map → CollapsibleSection-DjjDGxP_.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-D_kAbT_D.js → ConfirmDeleteModal-DJSmsHQM.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-D_kAbT_D.js.map → ConfirmDeleteModal-DJSmsHQM.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-C5ZRYPfF.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-CI_JOAvk.js.map → CountdownTimer-C5ZRYPfF.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-C9OA1Q2J.js → CredentialsPage-CV6e60yC.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-C9OA1Q2J.js.map → CredentialsPage-CV6e60yC.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-sxLLBf2I.js → CronLabel-CnqhqW0B.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-sxLLBf2I.js.map → CronLabel-CnqhqW0B.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-jH9m8Dgl.js → ElapsedCell-C1IOn-tj.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-jH9m8Dgl.js.map → ElapsedCell-C1IOn-tj.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-Dl3Nr2kk.js → EntityTimelinePanel-Dz6Liig4.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-Dl3Nr2kk.js.map → EntityTimelinePanel-Dz6Liig4.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-DAK6It5J.js → EscalationListSchemaPage-bgdmLmrh.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-DAK6It5J.js.map → EscalationListSchemaPage-bgdmLmrh.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListView-CAHbdxKR.js → EscalationListView-CrlD3ZGt.js} +2 -2
- package/dashboard/dist/assets/{EscalationListView-CAHbdxKR.js.map → EscalationListView-CrlD3ZGt.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-DotfAMCL.js → EscalationSchemaPage-dxXO_T3t.js} +3 -3
- package/dashboard/dist/assets/{EscalationSchemaPage-DotfAMCL.js.map → EscalationSchemaPage-dxXO_T3t.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTimeline-DqmFydnU.js → EscalationTimeline-C3WQZQuM.js} +2 -2
- package/dashboard/dist/assets/{EscalationTimeline-DqmFydnU.js.map → EscalationTimeline-C3WQZQuM.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationTitleSelect-BpRquguO.js → EscalationTitleSelect-CTtcETUO.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-BpRquguO.js.map → EscalationTitleSelect-CTtcETUO.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-DtGOqnP4.js → EscalationsOverview-DAjZ7JY2.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-DtGOqnP4.js.map → EscalationsOverview-DAjZ7JY2.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DSHqKyX2.js → EventTable-B72DQP_v.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DSHqKyX2.js.map → EventTable-B72DQP_v.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-Dxd0wNSW.js → FilterBar-CCTaA_LH.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-Dxd0wNSW.js.map → FilterBar-CCTaA_LH.js.map} +1 -1
- package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js +2 -0
- package/dashboard/dist/assets/GrantScopeField-BzWGzBfA.js.map +1 -0
- package/dashboard/dist/assets/{GraphInvokePage-ChqqGkro.js → GraphInvokePage-CAsCgFo3.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-ChqqGkro.js.map → GraphInvokePage-CAsCgFo3.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-ByKesG8w.js → HomePage-DseE_iSr.js} +2 -2
- package/dashboard/dist/assets/{HomePage-ByKesG8w.js.map → HomePage-DseE_iSr.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-Ddz_S2av.js → ListToolbar-1zdqnjW6.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-Ddz_S2av.js.map → ListToolbar-1zdqnjW6.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CVe13tEv.js → McpOverview-DS_JXDW5.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CVe13tEv.js.map → McpOverview-DS_JXDW5.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-BQYF2Mjq.js → McpQueryDetailPage-BeMUGcv3.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-BQYF2Mjq.js.map → McpQueryDetailPage-BeMUGcv3.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-DZi5lm7s.js → McpQueryPage-CeiLO_LR.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-DZi5lm7s.js.map → McpQueryPage-CeiLO_LR.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-DreARTE1.js → McpRunDetailPage-DYp1uZK2.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-DreARTE1.js.map → McpRunDetailPage-DYp1uZK2.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-DmO0YVhT.js → McpRunsPage-VeaDzcL4.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-DmO0YVhT.js.map → McpRunsPage-VeaDzcL4.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-DpjCO85T.js → OperationsPage-DK2mgaXf.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-DpjCO85T.js.map → OperationsPage-DK2mgaXf.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-Vv_MEBkv.js → OperatorDashboard-BNjLF0f7.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-Vv_MEBkv.js.map → OperatorDashboard-BNjLF0f7.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-CW-2uBHY.js → PersonaDetailPage-IQ2fZLa6.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-CW-2uBHY.js.map → PersonaDetailPage-IQ2fZLa6.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-CO6yYQdm.js → PersonasPage-DpGFEcU-.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-CO6yYQdm.js.map → PersonasPage-DpGFEcU-.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-DcNqhBlg.js → PortalPage-D07xyvG_.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-DcNqhBlg.js.map → PortalPage-D07xyvG_.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-BuipGZcC.js → ProcessDetailPage-t8EEYSMk.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BuipGZcC.js.map → ProcessDetailPage-t8EEYSMk.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-D9DYntvl.js → ProcessesListPage-BDUXLFdb.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-D9DYntvl.js.map → ProcessesListPage-BDUXLFdb.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-BwWOYv_Z.js +8 -0
- package/dashboard/dist/assets/ResolverForm-BwWOYv_Z.js.map +1 -0
- package/dashboard/dist/assets/RoleDetailPage-zMF3x2xi.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-zMF3x2xi.js.map +1 -0
- package/dashboard/dist/assets/{RolesPage-0QJOBSzF.js → RolesPage-CEBp_PpL.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-0QJOBSzF.js.map → RolesPage-CEBp_PpL.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-Dh4lyyRo.js → RunAsSelector-CC_EHN3z.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-Dh4lyyRo.js.map → RunAsSelector-CC_EHN3z.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-DD4uU-jY.js +2 -0
- package/dashboard/dist/assets/ScanCodesPage-DD4uU-jY.js.map +1 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-CUW8gYFh.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-CUW8gYFh.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-DpO_ESuf.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-DpO_ESuf.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-BSUyf5ja.js → StickyPagination-cNqSDm5f.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BSUyf5ja.js.map → StickyPagination-cNqSDm5f.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail--tp7l2Sd.js → StreamMessageDetail-C4oZqQdB.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail--tp7l2Sd.js.map → StreamMessageDetail-C4oZqQdB.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CxBZ2THh.js → SwimlaneTimeline-BjBiV7GT.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CxBZ2THh.js.map → SwimlaneTimeline-BjBiV7GT.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BJ1QrmPH.js → TaskDetailPage-pO_AnVS1.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BJ1QrmPH.js.map → TaskDetailPage-pO_AnVS1.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-5BydGWmt.js → TasksListPage-DKDHlWP7.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-5BydGWmt.js.map → TasksListPage-DKDHlWP7.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CCnz84Y4.js → TimeAgo-D2qchUuJ.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CCnz84Y4.js.map → TimeAgo-D2qchUuJ.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-D0ru7Lya.js → TimestampCell-DeswZGGo.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-D0ru7Lya.js.map → TimestampCell-DeswZGGo.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-3Kpofmen.js → ToolTestPanel-DJh7PIUa.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-3Kpofmen.js.map → ToolTestPanel-DJh7PIUa.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-BaBXD_AK.js → TopicDetailPage-CsgDJ4Z4.js} +2 -2
- package/dashboard/dist/assets/{TopicDetailPage-BaBXD_AK.js.map → TopicDetailPage-CsgDJ4Z4.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-Cnm1AAjh.js → TopicsPage-tBRZDVDN.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-Cnm1AAjh.js.map → TopicsPage-tBRZDVDN.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-CXsdPiMZ.js → UserName-B-5JcDck.js} +2 -2
- package/dashboard/dist/assets/{UserName-CXsdPiMZ.js.map → UserName-B-5JcDck.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-zx3AUJFd.js → WorkflowExecutionPage-BPHVnhp6.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-zx3AUJFd.js.map → WorkflowExecutionPage-BPHVnhp6.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DfAGK1l7.js → WorkflowsDashboard-CxLlfZmY.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DfAGK1l7.js.map → WorkflowsDashboard-CxLlfZmY.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-QIYvoa13.js → WorkflowsOverview-C4az5rwp.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-QIYvoa13.js.map → WorkflowsOverview-C4az5rwp.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGgO3hyB.js → YamlWorkflowDetailPage-BmhlAUFQ.js} +8 -8
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGgO3hyB.js.map → YamlWorkflowDetailPage-BmhlAUFQ.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CEsHm0B9.js → YamlWorkflowsPage-CSbG5o2V.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CEsHm0B9.js.map → YamlWorkflowsPage-CSbG5o2V.js.map} +1 -1
- package/dashboard/dist/assets/{agents-v_HH3Rji.js → agents-BohEn7vw.js} +2 -2
- package/dashboard/dist/assets/{agents-v_HH3Rji.js.map → agents-BohEn7vw.js.map} +1 -1
- package/dashboard/dist/assets/{bots-bwvWYrXz.js → bots-BG2EO-Wi.js} +2 -2
- package/dashboard/dist/assets/{bots-bwvWYrXz.js.map → bots-BG2EO-Wi.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-D4vaw_nQ.js → capabilities-CeFrBmYX.js} +2 -2
- package/dashboard/dist/assets/{capabilities-D4vaw_nQ.js.map → capabilities-CeFrBmYX.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-CiiZ6LJF.js → controlplane-Dhvt8l8F.js} +2 -2
- package/dashboard/dist/assets/{controlplane-CiiZ6LJF.js.map → controlplane-Dhvt8l8F.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Dv-MB3eC.js → escalation-columns-BWMNxImp.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Dv-MB3eC.js.map → escalation-columns-BWMNxImp.js.map} +1 -1
- package/dashboard/dist/assets/{index-CzjUgFt_.js → index-Bd_dgyfJ.js} +2 -2
- package/dashboard/dist/assets/{index-CzjUgFt_.js.map → index-Bd_dgyfJ.js.map} +1 -1
- package/dashboard/dist/assets/{index-IJmtbuLh.js → index-C8VlM2Oe.js} +2 -2
- package/dashboard/dist/assets/{index-IJmtbuLh.js.map → index-C8VlM2Oe.js.map} +1 -1
- package/dashboard/dist/assets/{index-CcuvGdvf.js → index-CiqSVDga.js} +2 -2
- package/dashboard/dist/assets/{index-CcuvGdvf.js.map → index-CiqSVDga.js.map} +1 -1
- package/dashboard/dist/assets/{index-C3WutFpT.js → index-Cl_YXEdp.js} +2 -2
- package/dashboard/dist/assets/{index-C3WutFpT.js.map → index-Cl_YXEdp.js.map} +1 -1
- package/dashboard/dist/assets/index-CtZWpy22.js +2 -0
- package/dashboard/dist/assets/index-CtZWpy22.js.map +1 -0
- package/dashboard/dist/assets/{index-CjenRVX_.js → index-D90D9y0J.js} +2 -2
- package/dashboard/dist/assets/{index-CjenRVX_.js.map → index-D90D9y0J.js.map} +1 -1
- package/dashboard/dist/assets/{index-BLB77tc8.js → index-DABkM7s-.js} +2 -2
- package/dashboard/dist/assets/{index-BLB77tc8.js.map → index-DABkM7s-.js.map} +1 -1
- package/dashboard/dist/assets/index-Dbwu51xm.js +3 -0
- package/dashboard/dist/assets/index-Dbwu51xm.js.map +1 -0
- package/dashboard/dist/assets/{index-2tzsxFat.js → index-Dc3Om6G3.js} +2 -2
- package/dashboard/dist/assets/{index-2tzsxFat.js.map → index-Dc3Om6G3.js.map} +1 -1
- package/dashboard/dist/assets/{index-D2VKBMng.js → index-Dc_zWK23.js} +2 -2
- package/dashboard/dist/assets/{index-D2VKBMng.js.map → index-Dc_zWK23.js.map} +1 -1
- package/dashboard/dist/assets/index-DcppjzP5.css +1 -0
- package/dashboard/dist/assets/{index-C_ISDOWJ.js → index-Y-bdW8vo.js} +2 -2
- package/dashboard/dist/assets/{index-C_ISDOWJ.js.map → index-Y-bdW8vo.js.map} +1 -1
- package/dashboard/dist/assets/{index-C4Lce2ET.js → index-dYKgd06u.js} +3 -3
- package/dashboard/dist/assets/{index-C4Lce2ET.js.map → index-dYKgd06u.js.map} +1 -1
- package/dashboard/dist/assets/index-fUsx_gYx.js +67 -0
- package/dashboard/dist/assets/index-fUsx_gYx.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-D1YP2NzS.js → knowledge-CCcTidNV.js} +2 -2
- package/dashboard/dist/assets/{knowledge-D1YP2NzS.js.map → knowledge-CCcTidNV.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-Bb5psC61.js → mcp-CLA1z7Pg.js} +2 -2
- package/dashboard/dist/assets/{mcp-Bb5psC61.js.map → mcp-CLA1z7Pg.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-D5jUdZwN.js → mcp-query-CWG0WMAs.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-D5jUdZwN.js.map → mcp-query-CWG0WMAs.js.map} +1 -1
- package/dashboard/dist/assets/metadata-display-B7X5hGxG.js +2 -0
- package/dashboard/dist/assets/metadata-display-B7X5hGxG.js.map +1 -0
- package/dashboard/dist/assets/{personas-CDndbkp4.js → personas-8jURIzx6.js} +2 -2
- package/dashboard/dist/assets/{personas-CDndbkp4.js.map → personas-8jURIzx6.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-Dq3kNhKu.js → pipelines-hVVRAXqG.js} +2 -2
- package/dashboard/dist/assets/{pipelines-Dq3kNhKu.js.map → pipelines-hVVRAXqG.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-BlpDsWCy.js → tasks-BE1O57Bf.js} +2 -2
- package/dashboard/dist/assets/{tasks-BlpDsWCy.js.map → tasks-BE1O57Bf.js.map} +1 -1
- package/dashboard/dist/assets/{topics-C0YaR9fu.js → topics-Bg96Wp1r.js} +2 -2
- package/dashboard/dist/assets/{topics-C0YaR9fu.js.map → topics-Bg96Wp1r.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-B-KC5ba3.js → useDebouncedValue-DmEveyEy.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-B-KC5ba3.js.map → useDebouncedValue-DmEveyEy.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-Dkr5g2Ac.js → useNamespace-DHgkzIuL.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-Dkr5g2Ac.js.map → useNamespace-DHgkzIuL.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BANBOshA.js → useYamlActivityEvents-RU0PvU8S.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BANBOshA.js.map → useYamlActivityEvents-RU0PvU8S.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BLYoJfmB.js → yaml-workflows-DQWE9ijc.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BLYoJfmB.js.map → yaml-workflows-DQWE9ijc.js.map} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/docs/dashboard.md +1 -1
- package/docs/hitl/lookups.md +27 -18
- package/docs/hitl/x-lt-scan.md +51 -0
- package/docs/hitl/x-lt-validation.md +1 -1
- package/docs/hitl/x-lt-widget.md +1 -1
- package/docs/hitl-guide.md +3 -1
- package/docs/scan-codes.md +303 -33
- package/package.json +1 -1
- package/build/types/scan-code.d.ts +0 -317
- package/dashboard/dist/assets/CapabilitiesPage-BxadotXn.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-CI_JOAvk.js +0 -2
- package/dashboard/dist/assets/ResolverForm-BVG8X0sS.js +0 -8
- package/dashboard/dist/assets/ResolverForm-BVG8X0sS.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-KCXDqoJz.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-KCXDqoJz.js.map +0 -1
- package/dashboard/dist/assets/ScanCodesPage-CUhCz-Yr.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-CUhCz-Yr.js.map +0 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-qzXKNqJK.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-qzXKNqJK.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-D8e8cG3t.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-D8e8cG3t.js.map +0 -1
- package/dashboard/dist/assets/index-CT-FN6CW.js +0 -3
- package/dashboard/dist/assets/index-CT-FN6CW.js.map +0 -1
- package/dashboard/dist/assets/index-D6pBLZFu.js +0 -2
- package/dashboard/dist/assets/index-D6pBLZFu.js.map +0 -1
- package/dashboard/dist/assets/index-Dh8MJl3L.css +0 -1
- package/dashboard/dist/assets/index-N71QQ3J5.js +0 -67
- package/dashboard/dist/assets/index-N71QQ3J5.js.map +0 -1
- package/dashboard/dist/assets/metadata-display-COo3mMCr.js +0 -2
- package/dashboard/dist/assets/metadata-display-COo3mMCr.js.map +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ScanExecuteResponse, type ScanStep } from '../../types';
|
|
2
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
3
|
+
import { type StepContext } from './context';
|
|
4
|
+
/**
|
|
5
|
+
* Adds the scanned item to an accumulator. Two modes, one atomic write:
|
|
6
|
+
*
|
|
7
|
+
* - Item-locate (`params.accumulate.containerFacet`): the scan locates the
|
|
8
|
+
* item's own pending row through the scheme facet, reads the container
|
|
9
|
+
* facet value it carries, and adds the target to the container that shares
|
|
10
|
+
* it, writing the item row as the reciprocal in the same statement. An
|
|
11
|
+
* item with no row, or no container facet, falls through. An item whose
|
|
12
|
+
* container has closed and whose successor has not parked yet answers
|
|
13
|
+
* `no_open_container` with the item row, so the station can say "scan
|
|
14
|
+
* again" instead of showing the item with no hint.
|
|
15
|
+
* - Container-locate (no `containerFacet`): the scan locates the container
|
|
16
|
+
* by the scheme facet and adds `params.itemKey` (template).
|
|
17
|
+
*
|
|
18
|
+
* Templates may read `{claim.<facet>}` (the actor's live claim) and, in item
|
|
19
|
+
* mode, `{item.<facet>}` (the located row); an unresolvable token falls
|
|
20
|
+
* through. The write is the SDK's guarded statement; the locate only picks
|
|
21
|
+
* ids. A container already holding the item answers conflict, never a
|
|
22
|
+
* second add.
|
|
23
|
+
*/
|
|
24
|
+
export declare function accumulateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.accumulateStep = accumulateStep;
|
|
37
|
+
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
38
|
+
const accumulate_1 = require("../escalations/accumulate");
|
|
39
|
+
const types_1 = require("../../types");
|
|
40
|
+
const context_1 = require("./context");
|
|
41
|
+
const grant_1 = require("./grant");
|
|
42
|
+
const locate_1 = require("./locate");
|
|
43
|
+
const verbs_subject_1 = require("./verbs-subject");
|
|
44
|
+
const verb_into_subject_1 = require("./verb-into-subject");
|
|
45
|
+
/**
|
|
46
|
+
* Adds the scanned item to an accumulator. Two modes, one atomic write:
|
|
47
|
+
*
|
|
48
|
+
* - Item-locate (`params.accumulate.containerFacet`): the scan locates the
|
|
49
|
+
* item's own pending row through the scheme facet, reads the container
|
|
50
|
+
* facet value it carries, and adds the target to the container that shares
|
|
51
|
+
* it, writing the item row as the reciprocal in the same statement. An
|
|
52
|
+
* item with no row, or no container facet, falls through. An item whose
|
|
53
|
+
* container has closed and whose successor has not parked yet answers
|
|
54
|
+
* `no_open_container` with the item row, so the station can say "scan
|
|
55
|
+
* again" instead of showing the item with no hint.
|
|
56
|
+
* - Container-locate (no `containerFacet`): the scan locates the container
|
|
57
|
+
* by the scheme facet and adds `params.itemKey` (template).
|
|
58
|
+
*
|
|
59
|
+
* Templates may read `{claim.<facet>}` (the actor's live claim) and, in item
|
|
60
|
+
* mode, `{item.<facet>}` (the located row); an unresolvable token falls
|
|
61
|
+
* through. The write is the SDK's guarded statement; the locate only picks
|
|
62
|
+
* ids. A container already holding the item answers conflict, never a
|
|
63
|
+
* second add.
|
|
64
|
+
*/
|
|
65
|
+
async function accumulateStep(step, ctx) {
|
|
66
|
+
const options = step.params?.accumulate;
|
|
67
|
+
if (options?.from === 'subject')
|
|
68
|
+
return (0, verbs_subject_1.accumulateFromSubject)(step, ctx);
|
|
69
|
+
if (options?.into === 'subject')
|
|
70
|
+
return (0, verb_into_subject_1.accumulateIntoSubject)(step, ctx);
|
|
71
|
+
let item;
|
|
72
|
+
if (options?.containerFacet) {
|
|
73
|
+
const located = await (0, locate_1.locateForStep)(step, ctx, 1);
|
|
74
|
+
item = located?.escalations[0];
|
|
75
|
+
if (!item)
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const rendered = await (0, context_1.templated)(step, ctx, (tpl) => ({
|
|
79
|
+
payload: step.params?.resolverPayload
|
|
80
|
+
? scanCodeService.interpolateScanTemplate(step.params.resolverPayload, tpl)
|
|
81
|
+
: undefined,
|
|
82
|
+
metadata: { ...(0, context_1.interpolatedMetadata)(step, ctx, tpl), ...(0, context_1.provenance)(ctx) },
|
|
83
|
+
itemKey: options?.containerFacet
|
|
84
|
+
? ctx.parsed.target
|
|
85
|
+
: scanCodeService.interpolateScanTemplate(step.params.itemKey, tpl),
|
|
86
|
+
}), item);
|
|
87
|
+
if (rendered === null)
|
|
88
|
+
return null;
|
|
89
|
+
let request;
|
|
90
|
+
let container;
|
|
91
|
+
if (options?.containerFacet && item) {
|
|
92
|
+
const containerValue = item.metadata?.[options.containerFacet];
|
|
93
|
+
if (containerValue === undefined || containerValue === null || containerValue === '')
|
|
94
|
+
return null;
|
|
95
|
+
container = { facet: options.containerFacet, value: String(containerValue) };
|
|
96
|
+
request = {
|
|
97
|
+
key: container.facet,
|
|
98
|
+
value: container.value,
|
|
99
|
+
itemKey: rendered.itemKey,
|
|
100
|
+
payload: rendered.payload,
|
|
101
|
+
metadata: rendered.metadata,
|
|
102
|
+
restrictRoles: options.container?.roles ?? options.containerRoles,
|
|
103
|
+
container: options.container
|
|
104
|
+
? { types: options.container.types, subtypes: options.container.subtypes, facets: options.container.facets }
|
|
105
|
+
: undefined,
|
|
106
|
+
...(options.reciprocal === false ? {} : { reciprocal: { id: item.id } }),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
request = {
|
|
111
|
+
key: ctx.scheme.target_facet,
|
|
112
|
+
value: ctx.parsed.target,
|
|
113
|
+
itemKey: rendered.itemKey,
|
|
114
|
+
payload: rendered.payload,
|
|
115
|
+
metadata: rendered.metadata,
|
|
116
|
+
restrictRoles: step.query?.roles,
|
|
117
|
+
...(step.query?.types || step.query?.subtypes
|
|
118
|
+
? { container: { types: step.query.types, subtypes: step.query.subtypes } }
|
|
119
|
+
: {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const notPrimed = await (0, grant_1.spendGrant)(ctx);
|
|
123
|
+
if (notPrimed)
|
|
124
|
+
return notPrimed;
|
|
125
|
+
const result = await (0, accumulate_1.accumulateItemByMetadata)(request, ctx.auth);
|
|
126
|
+
if (result.status === 404) {
|
|
127
|
+
if (!container || !item)
|
|
128
|
+
return null;
|
|
129
|
+
return {
|
|
130
|
+
status: 200,
|
|
131
|
+
data: {
|
|
132
|
+
outcome: types_1.SCAN_OUTCOMES.NO_OPEN_CONTAINER,
|
|
133
|
+
verb: step.verb,
|
|
134
|
+
escalation: item,
|
|
135
|
+
container,
|
|
136
|
+
fallback: ctx.rule.fallback,
|
|
137
|
+
error: `No open container carries ${container.facet} = ${container.value}`,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (result.status === 403)
|
|
142
|
+
return (0, context_1.forbidden)(result.error);
|
|
143
|
+
if (result.status === 409)
|
|
144
|
+
return (0, context_1.conflict)(result.error);
|
|
145
|
+
if (result.status === 400 || result.status === 422)
|
|
146
|
+
return (0, context_1.refused)(result.error ?? 'the item was not accepted');
|
|
147
|
+
if (result.status !== 200)
|
|
148
|
+
return result;
|
|
149
|
+
const escalation = result.data.escalationId ? { id: result.data.escalationId, ...result.data } : undefined;
|
|
150
|
+
return (0, context_1.executed)(escalation, step);
|
|
151
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ScanExecuteResponse, type ScanStep } from '../../types';
|
|
2
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
3
|
+
import { type StepContext } from './context';
|
|
4
|
+
type ScanResult = LTApiResult<ScanExecuteResponse>;
|
|
5
|
+
export declare function fillStep(step: ScanStep, ctx: StepContext): Promise<ScanResult | null>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.fillStep = fillStep;
|
|
37
|
+
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
38
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
39
|
+
const resolve_batch_1 = require("../escalations/resolve-batch");
|
|
40
|
+
const escalation_1 = require("../../types/escalation");
|
|
41
|
+
const types_1 = require("../../types");
|
|
42
|
+
const context_1 = require("./context");
|
|
43
|
+
const grant_1 = require("./grant");
|
|
44
|
+
const locate_1 = require("./locate");
|
|
45
|
+
const subject_1 = require("./subject");
|
|
46
|
+
const STOCK_UNEXPECTED = 'Not one of the items expected here.';
|
|
47
|
+
function readBatch(row) {
|
|
48
|
+
const meta = (row.metadata ?? {});
|
|
49
|
+
const pending = meta[escalation_1.ESCALATION_BATCH_KEYS.PENDING];
|
|
50
|
+
const keys = meta[escalation_1.ESCALATION_BATCH_KEYS.KEYS];
|
|
51
|
+
if (!Array.isArray(pending))
|
|
52
|
+
return null;
|
|
53
|
+
return { pending: pending.map(String), keys: Array.isArray(keys) ? keys.map(String) : pending.map(String) };
|
|
54
|
+
}
|
|
55
|
+
/** The code a batch key names, without its ordinal suffix. */
|
|
56
|
+
function codeOf(key, separator) {
|
|
57
|
+
const at = key.lastIndexOf(separator);
|
|
58
|
+
return at > 0 && /^[0-9]+$/.test(key.slice(at + 1)) ? key.slice(0, at) : key;
|
|
59
|
+
}
|
|
60
|
+
function keysFor(keys, target, separator) {
|
|
61
|
+
return keys.filter((k) => codeOf(k, separator) === target);
|
|
62
|
+
}
|
|
63
|
+
function progress(batch, filledNow) {
|
|
64
|
+
const remaining = Math.max(0, batch.pending.length - filledNow);
|
|
65
|
+
return { filled: batch.keys.length - remaining, total: batch.keys.length, remaining };
|
|
66
|
+
}
|
|
67
|
+
async function fillStep(step, ctx) {
|
|
68
|
+
const options = step.params.fill;
|
|
69
|
+
const separator = options.separator ?? types_1.SCAN_FILL_SEPARATOR_DEFAULT;
|
|
70
|
+
// 1. The batch row: the held subject, or the row the scan names
|
|
71
|
+
const row = options.into === 'subject'
|
|
72
|
+
? ctx.subject.row
|
|
73
|
+
: (await (0, locate_1.locateForStep)(step, ctx, 1))?.escalations[0];
|
|
74
|
+
if (!row)
|
|
75
|
+
return null;
|
|
76
|
+
if (options.into === 'subject' && step.subject?.claimedByOther !== 'allow') {
|
|
77
|
+
const other = await (0, subject_1.claimedByOther)(row, ctx.auth.userId);
|
|
78
|
+
if (other)
|
|
79
|
+
return (0, context_1.refused)(`Claimed by **${other.displayName}**.`);
|
|
80
|
+
}
|
|
81
|
+
const batch = readBatch(row);
|
|
82
|
+
if (!batch)
|
|
83
|
+
return (0, context_1.conflict)('the held row is not a batch');
|
|
84
|
+
// 2. Which open slot this scan fills, or why none
|
|
85
|
+
const tpl = {
|
|
86
|
+
...(0, context_1.templateContext)(ctx),
|
|
87
|
+
fill: {
|
|
88
|
+
pending: [...new Set(batch.pending.map((k) => codeOf(k, separator)))],
|
|
89
|
+
total: batch.keys.length,
|
|
90
|
+
filled: batch.keys.length - batch.pending.length,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
const candidates = keysFor(batch.pending, ctx.parsed.target, separator);
|
|
94
|
+
if (candidates.length === 0) {
|
|
95
|
+
const declared = keysFor(batch.keys, ctx.parsed.target, separator);
|
|
96
|
+
const markdown = declared.length
|
|
97
|
+
? `All ${declared.length} of these are already checked off.`
|
|
98
|
+
: scanCodeService.renderScanCopy(step.refuse?.markdown ?? STOCK_UNEXPECTED, tpl);
|
|
99
|
+
const expected = ctx.scheme.encoding === types_1.SCAN_ENCODINGS.GTIN
|
|
100
|
+
? tpl.fill.pending.map((code) => scanCodeService.displayGtin(code))
|
|
101
|
+
: tpl.fill.pending;
|
|
102
|
+
return (0, context_1.refused)(markdown, {
|
|
103
|
+
refusal: { markdown, expected },
|
|
104
|
+
progress: progress(batch, 0),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// 3. Spend the badge, then fill; a slot taken since the read moves to the next
|
|
108
|
+
let payload;
|
|
109
|
+
try {
|
|
110
|
+
payload = scanCodeService.interpolateScanTemplate(options.payload ?? { scannedCode: '{scan.code}' }, tpl);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (err instanceof scanCodeService.ScanTemplateError)
|
|
114
|
+
return null;
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
117
|
+
const notPrimed = (await (0, grant_1.identityGate)(step, ctx)) ?? (await (0, grant_1.spendGrant)(ctx));
|
|
118
|
+
if (notPrimed)
|
|
119
|
+
return notPrimed;
|
|
120
|
+
for (const itemKey of candidates) {
|
|
121
|
+
const result = await (0, resolve_batch_1.resolveBatchItem)({
|
|
122
|
+
id: row.id, itemKey, resolverPayload: payload, metadata: (0, context_1.provenance)(ctx),
|
|
123
|
+
}, ctx.auth);
|
|
124
|
+
if (result.status === 200) {
|
|
125
|
+
const data = result.data;
|
|
126
|
+
const done = data.outcome === 'completed';
|
|
127
|
+
const filled = progress(batch, batch.pending.length - (done ? 0 : (data.remaining ?? 0)));
|
|
128
|
+
return (0, context_1.withDone)({
|
|
129
|
+
status: 200,
|
|
130
|
+
data: {
|
|
131
|
+
outcome: types_1.SCAN_OUTCOMES.EXECUTED,
|
|
132
|
+
verb: step.verb,
|
|
133
|
+
escalation: { id: row.id, ...data },
|
|
134
|
+
progress: filled,
|
|
135
|
+
...(done ? { clearSubject: true } : {}),
|
|
136
|
+
},
|
|
137
|
+
}, step, { ...tpl, fill: { ...tpl.fill, ...filled } });
|
|
138
|
+
}
|
|
139
|
+
const outcome = result.data?.outcome;
|
|
140
|
+
if (outcome === 'duplicate-item')
|
|
141
|
+
continue;
|
|
142
|
+
if (result.status === 403)
|
|
143
|
+
return (0, context_1.forbidden)(result.error);
|
|
144
|
+
if (result.status === 404)
|
|
145
|
+
return null;
|
|
146
|
+
if (outcome?.startsWith('already-'))
|
|
147
|
+
return (0, context_1.refused)('This one is already complete.', { clearSubject: true });
|
|
148
|
+
return (0, context_1.refused)(result.error ?? STOCK_UNEXPECTED);
|
|
149
|
+
}
|
|
150
|
+
const fresh = await escalationService.getEscalation(row.id);
|
|
151
|
+
const after = fresh ? readBatch(fresh) : null;
|
|
152
|
+
return (0, context_1.refused)(`All ${keysFor(batch.keys, ctx.parsed.target, separator).length} of these are already checked off.`, {
|
|
153
|
+
...(after ? { progress: progress(after, 0) } : {}),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ScanExecuteResponse, type ScanStep } from '../../types';
|
|
2
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
3
|
+
import { type StepContext } from './context';
|
|
4
|
+
type ScanResult = LTApiResult<ScanExecuteResponse>;
|
|
5
|
+
/**
|
|
6
|
+
* The held subject's row collects the scanned code. With `accumulate.item`,
|
|
7
|
+
* the code's own pending row is located and written as the reciprocal in the
|
|
8
|
+
* same statement, so the item's record and the subject's entry land together
|
|
9
|
+
* or not at all.
|
|
10
|
+
*/
|
|
11
|
+
export declare function accumulateIntoSubject(step: ScanStep, ctx: StepContext): Promise<ScanResult | null>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.accumulateIntoSubject = accumulateIntoSubject;
|
|
37
|
+
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
38
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
39
|
+
const accumulate_1 = require("../escalations/accumulate");
|
|
40
|
+
const helpers_1 = require("../escalations/helpers");
|
|
41
|
+
const metadata_1 = require("../escalations/metadata");
|
|
42
|
+
const escalation_1 = require("../../types/escalation");
|
|
43
|
+
const types_1 = require("../../types");
|
|
44
|
+
const context_1 = require("./context");
|
|
45
|
+
const grant_1 = require("./grant");
|
|
46
|
+
const subject_1 = require("./subject");
|
|
47
|
+
const verbs_subject_1 = require("./verbs-subject");
|
|
48
|
+
const STOCK_MISSING = 'That one is not waiting here.';
|
|
49
|
+
const ITEM_GONE = ['reciprocal-not-found', 'reciprocal-not-accumulator'];
|
|
50
|
+
/**
|
|
51
|
+
* The scanned code's own pending row: an accumulator carrying the scheme's
|
|
52
|
+
* target facet = the scanned target, within the selector and the actor's
|
|
53
|
+
* read scope. The held subject's row is never a candidate.
|
|
54
|
+
*/
|
|
55
|
+
async function locateItem(step, ctx) {
|
|
56
|
+
const selector = step.params.accumulate.item;
|
|
57
|
+
const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
|
|
58
|
+
const roles = (0, metadata_1.restrictScopeRoles)(scope.allRoles, scope.global, selector.roles);
|
|
59
|
+
if (roles !== null && roles.length === 0)
|
|
60
|
+
return {};
|
|
61
|
+
const found = await escalationService.searchByFacets({
|
|
62
|
+
roles: roles ?? undefined,
|
|
63
|
+
types: selector.types,
|
|
64
|
+
subtypes: selector.subtypes,
|
|
65
|
+
facets: { ...selector.facets, [ctx.scheme.target_facet]: ctx.parsed.target },
|
|
66
|
+
status: 'pending',
|
|
67
|
+
exists: [escalation_1.ESCALATION_ACCUMULATE_KEYS.COUNT],
|
|
68
|
+
limit: 3,
|
|
69
|
+
}, { total: false });
|
|
70
|
+
const rows = found.escalations.filter((row) => row.id !== ctx.subject?.row.id);
|
|
71
|
+
return rows.length > 1 ? { ambiguous: true } : { row: rows[0] };
|
|
72
|
+
}
|
|
73
|
+
/** The missing-item answer: the rule's copy when declared, else fall through. */
|
|
74
|
+
function missing(step, ctx) {
|
|
75
|
+
if (!step.refuse?.missing)
|
|
76
|
+
return null;
|
|
77
|
+
const copy = scanCodeService.renderScanCopy(step.refuse.missing, (0, verbs_subject_1.bags)(ctx, ctx.subject?.row));
|
|
78
|
+
return (0, context_1.refused)(copy, { clearSubject: false });
|
|
79
|
+
}
|
|
80
|
+
/** Progress of a bounded accumulator after an add; unbounded rows report none. */
|
|
81
|
+
function progressOf(data) {
|
|
82
|
+
if (data.remaining === null || data.remaining === undefined)
|
|
83
|
+
return undefined;
|
|
84
|
+
return { filled: data.count, total: data.count + data.remaining, remaining: data.remaining };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The held subject's row collects the scanned code. With `accumulate.item`,
|
|
88
|
+
* the code's own pending row is located and written as the reciprocal in the
|
|
89
|
+
* same statement, so the item's record and the subject's entry land together
|
|
90
|
+
* or not at all.
|
|
91
|
+
*/
|
|
92
|
+
async function accumulateIntoSubject(step, ctx) {
|
|
93
|
+
const subject = ctx.subject;
|
|
94
|
+
const claimed = await (0, verbs_subject_1.claimGuard)(step, ctx, subject);
|
|
95
|
+
if (claimed)
|
|
96
|
+
return claimed;
|
|
97
|
+
// 1. Locate the scanned item's own row when the step names one
|
|
98
|
+
let item;
|
|
99
|
+
const wantsItem = !!step.params?.accumulate?.item;
|
|
100
|
+
if (wantsItem) {
|
|
101
|
+
const located = await locateItem(step, ctx);
|
|
102
|
+
if ('ambiguous' in located) {
|
|
103
|
+
return (0, context_1.conflict)(`more than one pending row carries ${ctx.scheme.target_facet} = ${ctx.parsed.target}`);
|
|
104
|
+
}
|
|
105
|
+
item = located.row;
|
|
106
|
+
}
|
|
107
|
+
// 2. Check the pairing before anything is written
|
|
108
|
+
if (wantsItem && !item)
|
|
109
|
+
return missing(step, ctx);
|
|
110
|
+
const mismatch = (0, verbs_subject_1.matchGuard)(step, ctx, subject.row, item);
|
|
111
|
+
if (mismatch)
|
|
112
|
+
return mismatch;
|
|
113
|
+
if (item && step.subject?.claimedByOther !== 'allow') {
|
|
114
|
+
const other = await (0, subject_1.claimedByOther)(item, ctx.auth.userId);
|
|
115
|
+
if (other)
|
|
116
|
+
return (0, context_1.refused)(`Claimed by **${other.displayName}**.`, { clearSubject: false });
|
|
117
|
+
}
|
|
118
|
+
// 3. Spend the badge, then write both rows in one statement
|
|
119
|
+
const values = (0, verbs_subject_1.rendered)(step, ctx, '{scan.target}', item);
|
|
120
|
+
if (!values)
|
|
121
|
+
return null;
|
|
122
|
+
const notPrimed = (await (0, grant_1.identityGate)(step, ctx)) ?? (await (0, grant_1.spendGrant)(ctx));
|
|
123
|
+
if (notPrimed)
|
|
124
|
+
return notPrimed;
|
|
125
|
+
const result = await (0, accumulate_1.accumulateItem)({
|
|
126
|
+
id: subject.row.id,
|
|
127
|
+
itemKey: values.itemKey,
|
|
128
|
+
payload: values.payload,
|
|
129
|
+
metadata: values.metadata,
|
|
130
|
+
...(item ? { reciprocal: { id: item.id } } : {}),
|
|
131
|
+
}, ctx.auth);
|
|
132
|
+
// 4. Report
|
|
133
|
+
if (result.status !== 200) {
|
|
134
|
+
const outcome = result.data?.outcome;
|
|
135
|
+
if (outcome === 'duplicate-item')
|
|
136
|
+
return (0, verbs_subject_1.already)(step, subject.row, true);
|
|
137
|
+
if (item && outcome && ITEM_GONE.includes(outcome))
|
|
138
|
+
return missing(step, ctx) ?? (0, context_1.refused)(STOCK_MISSING, { clearSubject: false });
|
|
139
|
+
return (0, verbs_subject_1.failedAdd)(step, ctx, result, subject.row, !!item);
|
|
140
|
+
}
|
|
141
|
+
const data = result.data;
|
|
142
|
+
const progress = progressOf(data);
|
|
143
|
+
return (0, context_1.withDone)({
|
|
144
|
+
status: 200,
|
|
145
|
+
data: {
|
|
146
|
+
outcome: types_1.SCAN_OUTCOMES.EXECUTED,
|
|
147
|
+
verb: step.verb,
|
|
148
|
+
escalation: { id: subject.row.id, ...result.data },
|
|
149
|
+
clearSubject: data.outcome === 'completed',
|
|
150
|
+
...(progress ? { progress } : {}),
|
|
151
|
+
},
|
|
152
|
+
}, step, (0, verbs_subject_1.bags)(ctx, afterAdd(subject.row, values.metadata, data.count), item));
|
|
153
|
+
}
|
|
154
|
+
/** The subject's row as the add left it, for `{container.…}` copy, without a re-read. */
|
|
155
|
+
function afterAdd(row, patch, count) {
|
|
156
|
+
return { ...row, metadata: { ...(row.metadata ?? {}), ...patch, [escalation_1.ESCALATION_ACCUMULATE_KEYS.COUNT]: count } };
|
|
157
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as scanCodeService from '../../services/scan-code';
|
|
2
|
+
import { type LTEscalationRecord, type ScanExecuteResponse, type ScanStep } from '../../types';
|
|
3
|
+
import type { LTApiResult } from '../../types/sdk';
|
|
4
|
+
import { type HeldSubject, type StepContext } from './context';
|
|
5
|
+
type ScanResult = LTApiResult<ScanExecuteResponse>;
|
|
6
|
+
/** The step's template bags with the subject, the container, and the scanned item's row once located. */
|
|
7
|
+
export declare function bags(ctx: StepContext, container?: LTEscalationRecord, item?: LTEscalationRecord): scanCodeService.ScanTemplateContext;
|
|
8
|
+
/** Refuse the act when someone else holds a live claim on the subject. */
|
|
9
|
+
export declare function claimGuard(step: ScanStep, ctx: StepContext, subject: HeldSubject): Promise<ScanResult | null>;
|
|
10
|
+
/**
|
|
11
|
+
* The pre-write guard. Returns the refusal when the pairing is wrong, null
|
|
12
|
+
* when it holds (or the step declares no match).
|
|
13
|
+
*/
|
|
14
|
+
export declare function matchGuard(step: ScanStep, ctx: StepContext, container?: LTEscalationRecord, item?: LTEscalationRecord): ScanResult | null;
|
|
15
|
+
/**
|
|
16
|
+
* Map a failed add onto what the bench says. 404 falls through. `keepSubject`
|
|
17
|
+
* leaves the hold in place when the reciprocal was already placed (the
|
|
18
|
+
* subject is the container the actor is still filling).
|
|
19
|
+
*/
|
|
20
|
+
export declare function failedAdd(step: ScanStep, ctx: StepContext, result: LTApiResult, container?: LTEscalationRecord, keepSubject?: boolean): ScanResult | null;
|
|
21
|
+
/** The step's itemKey, payload and metadata, or null when a template token has nothing to read. */
|
|
22
|
+
export declare function rendered(step: ScanStep, ctx: StepContext, itemKeyDefault?: string, item?: LTEscalationRecord): {
|
|
23
|
+
itemKey: string;
|
|
24
|
+
payload: Record<string, any> | undefined;
|
|
25
|
+
metadata: {
|
|
26
|
+
[x: string]: any;
|
|
27
|
+
};
|
|
28
|
+
} | null;
|
|
29
|
+
/** The subject joins the scanned container; the subject's row is the reciprocal. */
|
|
30
|
+
export declare function accumulateFromSubject(step: ScanStep, ctx: StepContext): Promise<ScanResult | null>;
|
|
31
|
+
/** The item is already where the scan says: harmless, nothing written. */
|
|
32
|
+
export declare function already(step: ScanStep, row: LTEscalationRecord, keepSubject?: boolean): ScanResult;
|
|
33
|
+
export {};
|