@hotmeshio/long-tail 0.22.0 → 0.22.2
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 +10 -1
- package/build/api/escalations/accumulate.js +121 -34
- package/build/api/escalations/metadata.d.ts +5 -0
- package/build/api/escalations/metadata.js +6 -2
- 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 +18 -11
- 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/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 +147 -0
- package/build/api/scan-codes/verb-fill.d.ts +6 -0
- package/build/api/scan-codes/verb-fill.js +152 -0
- package/build/api/scan-codes/verbs-subject.d.ts +14 -0
- package/build/api/scan-codes/verbs-subject.js +270 -0
- package/build/api/scan-codes/verbs.d.ts +7 -22
- package/build/api/scan-codes/verbs.js +35 -114
- package/build/api/workflows/invocation.d.ts +8 -4
- package/build/api/workflows/invocation.js +26 -9
- package/build/index.d.ts +1 -0
- package/build/index.js +8 -2
- package/build/lib/cli/commands/workflows.js +9 -4
- package/build/lib/db/schemas/037_scan_gtin_and_subject_grants.sql +27 -0
- package/build/routes/escalations/accumulate.js +13 -6
- 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 +3 -0
- package/build/services/escalation/crud.d.ts +2 -2
- package/build/services/escalation/crud.js +4 -2
- package/build/services/escalation/facet-sql.js +8 -0
- package/build/services/escalation/sql.d.ts +4 -2
- package/build/services/escalation/sql.js +10 -2
- package/build/services/export/index.d.ts +8 -3
- package/build/services/export/index.js +15 -21
- 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/pipelines/events.js +2 -1
- package/build/services/pipelines/execution-builder.js +2 -1
- package/build/services/pipelines/queries.js +2 -1
- 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 +7 -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-subject.d.ts +7 -0
- package/build/services/scan-code/validate-subject.js +158 -0
- package/build/services/scan-code/validate.d.ts +7 -0
- package/build/services/scan-code/validate.js +111 -16
- package/build/services/scan-code/write.d.ts +1 -0
- package/build/services/scan-code/write.js +9 -3
- package/build/services/workflow-state.d.ts +21 -0
- package/build/services/workflow-state.js +39 -0
- 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 +5 -0
- package/build/shared/scan-code/gtin.js +25 -0
- package/build/shared/scan-code/index.d.ts +2 -0
- package/build/shared/scan-code/index.js +10 -0
- package/build/shared/scan-code/parse.d.ts +46 -0
- package/build/shared/scan-code/parse.js +133 -0
- package/build/shared/workflow-state.d.ts +17 -0
- package/build/shared/workflow-state.js +29 -0
- package/build/system/mcp-servers/admin/escalations.js +8 -4
- package/build/system/mcp-servers/admin/scan-codes.js +10 -4
- package/build/system/mcp-servers/admin/schemas.d.ts +792 -23
- package/build/system/mcp-servers/admin/schemas.js +61 -4
- package/build/system/mcp-servers/admin/workflows.js +20 -31
- package/build/system/mcp-servers/human-queue-schemas.d.ts +6 -6
- package/build/system/seed/tool-manifests-admin.d.ts +94 -0
- package/build/system/seed/tool-manifests-admin.js +3 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/escalation.d.ts +2 -0
- package/build/types/escalation.js +3 -1
- package/build/types/facets.d.ts +14 -0
- package/build/types/index.d.ts +3 -3
- package/build/types/index.js +8 -1
- package/build/types/scan-code/constants.d.ts +182 -0
- package/build/types/{scan-code.js → scan-code/constants.js} +62 -12
- 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 +140 -0
- package/build/types/scan-code/response.js +2 -0
- package/build/types/scan-code/rule.d.ts +199 -0
- package/build/types/scan-code/rule.js +2 -0
- package/build/types/startup.d.ts +3 -1
- package/dashboard/dist/assets/{AdminDashboard-Covdam48.js → AdminDashboard-DBW12qQt.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Covdam48.js.map → AdminDashboard-DBW12qQt.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-CE1k6J5r.js → AgentConfigPage-CmHv8U9M.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-CE1k6J5r.js.map → AgentConfigPage-CmHv8U9M.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-CWJZIZP1.js → AgentDetailPage-D1scIbz-.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-CWJZIZP1.js.map → AgentDetailPage-D1scIbz-.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage---Dg5ufF.js → AgentsPage-BA_ai9HJ.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage---Dg5ufF.js.map → AgentsPage-BA_ai9HJ.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-C2_5aEFW.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-C2_5aEFW.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-D3drO3-T.js → BotPicker-BZo4Kp4a.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-D3drO3-T.js.map → BotPicker-BZo4Kp4a.js.map} +1 -1
- package/dashboard/dist/assets/{BulkAssignModal-BOAWsViq.js → BulkAssignModal-BFhyxY2T.js} +2 -2
- package/dashboard/dist/assets/{BulkAssignModal-BOAWsViq.js.map → BulkAssignModal-BFhyxY2T.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-CvOX6vAc.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-RGgD3YZO.js.map → CapabilitiesPage-CvOX6vAc.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-DNkZn87n.js → CollapsibleSection-GCJsV9Oq.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-DNkZn87n.js.map → CollapsibleSection-GCJsV9Oq.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-BqzOwhPr.js → ConfirmDeleteModal-CAgYLcef.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-BqzOwhPr.js.map → ConfirmDeleteModal-CAgYLcef.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-Dik2z0M_.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-BaexQMK6.js.map → CountdownTimer-Dik2z0M_.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-D7abp0aS.js → CredentialsPage-twd2xCOW.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-D7abp0aS.js.map → CredentialsPage-twd2xCOW.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-DZiWmTwJ.js → CronLabel-DdnIuudX.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-DZiWmTwJ.js.map → CronLabel-DdnIuudX.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-f1o-GLM8.js → DropZone-B1Tdfddc.js} +2 -2
- package/dashboard/dist/assets/{DropZone-f1o-GLM8.js.map → DropZone-B1Tdfddc.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-BdGO_w4v.js → ElapsedCell-DCctVv5R.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-BdGO_w4v.js.map → ElapsedCell-DCctVv5R.js.map} +1 -1
- package/dashboard/dist/assets/{EntityTimelinePanel-DIDcF5Yu.js → EntityTimelinePanel-CMnskyWv.js} +2 -2
- package/dashboard/dist/assets/{EntityTimelinePanel-DIDcF5Yu.js.map → EntityTimelinePanel-CMnskyWv.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-C28rn9XC.js → EscalationListSchemaPage-VfCn6WDb.js} +3 -3
- package/dashboard/dist/assets/{EscalationListSchemaPage-C28rn9XC.js.map → EscalationListSchemaPage-VfCn6WDb.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListView-CkBnkpDJ.js → EscalationListView-CGQZxcC-.js} +2 -2
- package/dashboard/dist/assets/{EscalationListView-CkBnkpDJ.js.map → EscalationListView-CGQZxcC-.js.map} +1 -1
- package/dashboard/dist/assets/EscalationSchemaPage-BX0tx-PM.js +9 -0
- package/dashboard/dist/assets/EscalationSchemaPage-BX0tx-PM.js.map +1 -0
- package/dashboard/dist/assets/EscalationTimeline-DKoSM56J.js +2 -0
- package/dashboard/dist/assets/EscalationTimeline-DKoSM56J.js.map +1 -0
- package/dashboard/dist/assets/{EscalationTitleSelect-CzKfavri.js → EscalationTitleSelect-DWGLBOmS.js} +2 -2
- package/dashboard/dist/assets/{EscalationTitleSelect-CzKfavri.js.map → EscalationTitleSelect-DWGLBOmS.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-Tdu3Yx2c.js → EscalationsOverview-C2XoguaA.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-Tdu3Yx2c.js.map → EscalationsOverview-C2XoguaA.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DiIxOJwO.js → EventTable-CBUWq7--.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DiIxOJwO.js.map → EventTable-CBUWq7--.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-CvMBCVIo.js → FilterBar-8IdbleZ9.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-CvMBCVIo.js.map → FilterBar-8IdbleZ9.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-DO-yyhi6.js → GraphInvokePage-CUvoPzsW.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-DO-yyhi6.js.map → GraphInvokePage-CUvoPzsW.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-DSS3eHR2.js → HomePage-BP7v9GLJ.js} +2 -2
- package/dashboard/dist/assets/{HomePage-DSS3eHR2.js.map → HomePage-BP7v9GLJ.js.map} +1 -1
- package/dashboard/dist/assets/{ListToolbar-C3-Tqqub.js → ListToolbar-Cnacuwoy.js} +2 -2
- package/dashboard/dist/assets/{ListToolbar-C3-Tqqub.js.map → ListToolbar-Cnacuwoy.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-DEJmsdVi.js → McpOverview-C2JoNoDA.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-DEJmsdVi.js.map → McpOverview-C2JoNoDA.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-C_nih0w-.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-C_nih0w-.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-BBcG_UuU.js → McpQueryPage-U_wNXow2.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-BBcG_UuU.js.map → McpQueryPage-U_wNXow2.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-C6xw0kBg.js → McpRunDetailPage-DtKoJq6J.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-C6xw0kBg.js.map → McpRunDetailPage-DtKoJq6J.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-CRQqrF4Q.js → McpRunsPage-CnYtfGhf.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-CRQqrF4Q.js.map → McpRunsPage-CnYtfGhf.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-DADRJOUl.js → NamespacePill-DwM5pNA4.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-DADRJOUl.js.map → NamespacePill-DwM5pNA4.js.map} +1 -1
- package/dashboard/dist/assets/{OperationsPage-Dlfwzf-0.js → OperationsPage-C7hupIer.js} +2 -2
- package/dashboard/dist/assets/{OperationsPage-Dlfwzf-0.js.map → OperationsPage-C7hupIer.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-DoiDGZ9R.js → OperatorDashboard-fVuLn2D5.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-DoiDGZ9R.js.map → OperatorDashboard-fVuLn2D5.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-Csq434-v.js → PageHeader-CMd3f4bz.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Csq434-v.js.map → PageHeader-CMd3f4bz.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-CSnk1p5A.js → PageHeaderWithStats-DHj8Mqox.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-CSnk1p5A.js.map → PageHeaderWithStats-DHj8Mqox.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-BzbA4Prr.js → PersonaDetailPage-C-4o8lPw.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-BzbA4Prr.js.map → PersonaDetailPage-C-4o8lPw.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-B36yn4hU.js → PersonasPage-BL1FwLmv.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-B36yn4hU.js.map → PersonasPage-BL1FwLmv.js.map} +1 -1
- package/dashboard/dist/assets/{PortalPage-BkD4YfDf.js → PortalPage-tJG5sgb1.js} +2 -2
- package/dashboard/dist/assets/{PortalPage-BkD4YfDf.js.map → PortalPage-tJG5sgb1.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-BT0eiBWY.js → ProcessDetailPage-Dz_jY4Yt.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-BT0eiBWY.js.map → ProcessDetailPage-Dz_jY4Yt.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-BEqeeNae.js → ProcessesListPage-Cbn9cter.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-BEqeeNae.js.map → ProcessesListPage-Cbn9cter.js.map} +1 -1
- package/dashboard/dist/assets/ResolverForm-Bk8iXQ6-.js +8 -0
- package/dashboard/dist/assets/ResolverForm-Bk8iXQ6-.js.map +1 -0
- package/dashboard/dist/assets/RoleDetailPage-owPi6gI9.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-owPi6gI9.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-BafrASDX.js → RolePill-Di2CAHuD.js} +2 -2
- package/dashboard/dist/assets/{RolePill-BafrASDX.js.map → RolePill-Di2CAHuD.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-80quJU5-.js → RolesPage-NwmMvZFa.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-80quJU5-.js.map → RolesPage-NwmMvZFa.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BoePhWVD.js → RunAsSelector-tgEooTyU.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BoePhWVD.js.map → RunAsSelector-tgEooTyU.js.map} +1 -1
- package/dashboard/dist/assets/ScanCodesPage-CUv_8ic6.js +2 -0
- package/dashboard/dist/assets/ScanCodesPage-CUv_8ic6.js.map +1 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-YHqbu7oK.js +2 -0
- package/dashboard/dist/assets/ScanSchemeDetailPage-YHqbu7oK.js.map +1 -0
- package/dashboard/dist/assets/ScanStationPage-B275l6r_.js +2 -0
- package/dashboard/dist/assets/ScanStationPage-B275l6r_.js.map +1 -0
- package/dashboard/dist/assets/{ScopeBadge-b6MIBiYD.js → ScopeBadge-CSItPVOH.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-b6MIBiYD.js.map → ScopeBadge-CSItPVOH.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-9ITrei_d.js → StickyPagination-CsTI_gvJ.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-9ITrei_d.js.map → StickyPagination-CsTI_gvJ.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-BkYvEHFY.js → StreamMessageDetail-auRlvjTh.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-BkYvEHFY.js.map → StreamMessageDetail-auRlvjTh.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-B1rotFix.js → SwimlaneTimeline-BLoVHYAd.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-B1rotFix.js.map → SwimlaneTimeline-BLoVHYAd.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-ZrIIrEUP.js → TagInput-CAgdLN_b.js} +2 -2
- package/dashboard/dist/assets/{TagInput-ZrIIrEUP.js.map → TagInput-CAgdLN_b.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-zhn_U_eC.js → TaskDetailPage-BPsZ1bK_.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-zhn_U_eC.js.map → TaskDetailPage-BPsZ1bK_.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-DkQ1uc6y.js → TaskQueuePill-h0oorVMe.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-DkQ1uc6y.js.map → TaskQueuePill-h0oorVMe.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CNbNeagx.js → TasksListPage-BNGM74yT.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CNbNeagx.js.map → TasksListPage-BNGM74yT.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-0YVMBwls.js → TimeAgo-BnAHXGK7.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-0YVMBwls.js.map → TimeAgo-BnAHXGK7.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-DB7r3np8.js → TimestampCell-J4yae6mc.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-DB7r3np8.js.map → TimestampCell-J4yae6mc.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-Baxm02L6.js → ToolPill-CQCsVdzD.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-Baxm02L6.js.map → ToolPill-CQCsVdzD.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-BLfA02wv.js → ToolTestPanel-BdzzgXDu.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-BLfA02wv.js.map → ToolTestPanel-BdzzgXDu.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-eAqPKShq.js → TopicDetailPage-DJKg8lb7.js} +4 -4
- package/dashboard/dist/assets/{TopicDetailPage-eAqPKShq.js.map → TopicDetailPage-DJKg8lb7.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-BNNWD-zl.js → TopicsPage-DQV0WxG6.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-BNNWD-zl.js.map → TopicsPage-DQV0WxG6.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-Pw46tO_k.js → UserName-Ct09nGh5.js} +2 -2
- package/dashboard/dist/assets/{UserName-Pw46tO_k.js.map → UserName-Ct09nGh5.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DvA51lT3.js → WorkflowExecutionPage-B5WJOsee.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DvA51lT3.js.map → WorkflowExecutionPage-B5WJOsee.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-ZepbO_ny.js → WorkflowPill-Dg7BDTyM.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-ZepbO_ny.js.map → WorkflowPill-Dg7BDTyM.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DFDTwnhn.js → WorkflowsDashboard-Hc87TRgD.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DFDTwnhn.js.map → WorkflowsDashboard-Hc87TRgD.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-5i2Tcy-p.js → WorkflowsOverview-CJQbyOj-.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-5i2Tcy-p.js.map → WorkflowsOverview-CJQbyOj-.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-p4VEYZS0.js → YamlWorkflowDetailPage-BMeED677.js} +8 -8
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-p4VEYZS0.js.map → YamlWorkflowDetailPage-BMeED677.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-Cq-hMVxl.js → YamlWorkflowsPage-BMMg0Id6.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-Cq-hMVxl.js.map → YamlWorkflowsPage-BMMg0Id6.js.map} +1 -1
- package/dashboard/dist/assets/{agents-EyBPJMYa.js → agents-CdFkgFvg.js} +2 -2
- package/dashboard/dist/assets/{agents-EyBPJMYa.js.map → agents-CdFkgFvg.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DX6jjqtF.js → bots-Mj3LHWWg.js} +2 -2
- package/dashboard/dist/assets/{bots-DX6jjqtF.js.map → bots-Mj3LHWWg.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-ZdLv9xBQ.js → capabilities-Dw1ObK2-.js} +2 -2
- package/dashboard/dist/assets/{capabilities-ZdLv9xBQ.js.map → capabilities-Dw1ObK2-.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-CpvZaJuw.js → controlplane-DcNE1APv.js} +2 -2
- package/dashboard/dist/assets/{controlplane-CpvZaJuw.js.map → controlplane-DcNE1APv.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Mvsze5eV.js → escalation-columns-D364Trpy.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Mvsze5eV.js.map → escalation-columns-D364Trpy.js.map} +1 -1
- package/dashboard/dist/assets/{index-Cn8uJsd7.js → index-B3veJ698.js} +2 -2
- package/dashboard/dist/assets/{index-Cn8uJsd7.js.map → index-B3veJ698.js.map} +1 -1
- package/dashboard/dist/assets/index-BQeHJHYN.js +67 -0
- package/dashboard/dist/assets/index-BQeHJHYN.js.map +1 -0
- package/dashboard/dist/assets/{index-D-Xs4rAW.js → index-BRGTmoYY.js} +2 -2
- package/dashboard/dist/assets/{index-D-Xs4rAW.js.map → index-BRGTmoYY.js.map} +1 -1
- package/dashboard/dist/assets/{index-DkrBFFSO.js → index-Bd6-KmBE.js} +3 -3
- package/dashboard/dist/assets/{index-DkrBFFSO.js.map → index-Bd6-KmBE.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bhb89oHH.js → index-BiVce3n0.js} +2 -2
- package/dashboard/dist/assets/{index-Bhb89oHH.js.map → index-BiVce3n0.js.map} +1 -1
- package/dashboard/dist/assets/{index-z5Hpeidu.js → index-BmNAVd4s.js} +2 -2
- package/dashboard/dist/assets/{index-z5Hpeidu.js.map → index-BmNAVd4s.js.map} +1 -1
- package/dashboard/dist/assets/{index-BbCjGO3M.js → index-Bq5XNEzD.js} +2 -2
- package/dashboard/dist/assets/{index-BbCjGO3M.js.map → index-Bq5XNEzD.js.map} +1 -1
- package/dashboard/dist/assets/{index-DGmzBY9D.js → index-DPStdq4T.js} +2 -2
- package/dashboard/dist/assets/{index-DGmzBY9D.js.map → index-DPStdq4T.js.map} +1 -1
- package/dashboard/dist/assets/index-DcppjzP5.css +1 -0
- package/dashboard/dist/assets/{index-PfSRKerc.js → index-DkcI4V_H.js} +2 -2
- package/dashboard/dist/assets/{index-PfSRKerc.js.map → index-DkcI4V_H.js.map} +1 -1
- package/dashboard/dist/assets/{index-oFKUFGQL.js → index-Dyotfa_k.js} +2 -2
- package/dashboard/dist/assets/{index-oFKUFGQL.js.map → index-Dyotfa_k.js.map} +1 -1
- package/dashboard/dist/assets/{index-Eo-l3Lqo.js → index-MDD4JYtu.js} +2 -2
- package/dashboard/dist/assets/{index-Eo-l3Lqo.js.map → index-MDD4JYtu.js.map} +1 -1
- package/dashboard/dist/assets/index-WSm8bgE7.js +3 -0
- package/dashboard/dist/assets/index-WSm8bgE7.js.map +1 -0
- package/dashboard/dist/assets/{index-DZhtP2Ok.js → index-eDm6cz0F.js} +2 -2
- package/dashboard/dist/assets/{index-DZhtP2Ok.js.map → index-eDm6cz0F.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-CgloEkaf.js → knowledge-Bafewjxk.js} +2 -2
- package/dashboard/dist/assets/{knowledge-CgloEkaf.js.map → knowledge-Bafewjxk.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-o-sGX2ST.js → mcp-query-BzTtIG90.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-o-sGX2ST.js.map → mcp-query-BzTtIG90.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-Bix7QYO7.js → mcp-vLIutbnc.js} +2 -2
- package/dashboard/dist/assets/{mcp-Bix7QYO7.js.map → mcp-vLIutbnc.js.map} +1 -1
- package/dashboard/dist/assets/{personas-30azkJ_s.js → personas-WD40EDS_.js} +2 -2
- package/dashboard/dist/assets/{personas-30azkJ_s.js.map → personas-WD40EDS_.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-Bfk2GFK7.js → pipelines-DFwULWs3.js} +2 -2
- package/dashboard/dist/assets/{pipelines-Bfk2GFK7.js.map → pipelines-DFwULWs3.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CpdopewW.js → tasks-La_-WAUn.js} +2 -2
- package/dashboard/dist/assets/{tasks-CpdopewW.js.map → tasks-La_-WAUn.js.map} +1 -1
- package/dashboard/dist/assets/{topics--bvCV9Yp.js → topics-CzYMlvqm.js} +2 -2
- package/dashboard/dist/assets/{topics--bvCV9Yp.js.map → topics-CzYMlvqm.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-Da0lPmj3.js → useDebouncedValue-C0FQyANW.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-Da0lPmj3.js.map → useDebouncedValue-C0FQyANW.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DD_Esl6n.js → useNamespace-WW_XjAb3.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DD_Esl6n.js.map → useNamespace-WW_XjAb3.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-AeAhZJJk.js → useYamlActivityEvents-B3YxPeFt.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-AeAhZJJk.js.map → useYamlActivityEvents-B3YxPeFt.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-B7OcUM6b.js → vendor-icons-CeVtUKyP.js} +2 -2
- package/dashboard/dist/assets/{vendor-icons-B7OcUM6b.js.map → vendor-icons-CeVtUKyP.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-BHAOOGvn.js → yaml-workflows-COHOjdhF.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-BHAOOGvn.js.map → yaml-workflows-COHOjdhF.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/accumulator.md +37 -1
- package/docs/api/mcp/admin.md +3 -2
- package/docs/api/sdk/escalations.md +6 -0
- package/docs/api/sdk/exports.md +1 -1
- package/docs/api/sdk/workflows.md +23 -4
- package/docs/cli.md +1 -1
- package/docs/dashboard.md +2 -2
- package/docs/faceted-routing.md +2 -0
- package/docs/hitl/x-lt-scan.md +51 -0
- package/docs/hitl/x-lt-widget.md +5 -0
- package/docs/hitl-guide.md +2 -0
- package/docs/scan-codes.md +252 -19
- package/package.json +1 -1
- package/build/types/scan-code.d.ts +0 -308
- package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-CpbC8oTN.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-RGgD3YZO.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-BaexQMK6.js +0 -2
- package/dashboard/dist/assets/EscalationSchemaPage-W5r0A1kj.js +0 -9
- package/dashboard/dist/assets/EscalationSchemaPage-W5r0A1kj.js.map +0 -1
- package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js +0 -2
- package/dashboard/dist/assets/EscalationTimeline-DKyTz6sM.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DYJr16l7.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-DYJr16l7.js.map +0 -1
- package/dashboard/dist/assets/ResolverForm-BwgjIX97.js +0 -7
- package/dashboard/dist/assets/ResolverForm-BwgjIX97.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-BFuLNJXa.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-BFuLNJXa.js.map +0 -1
- package/dashboard/dist/assets/ScanCodesPage-Cu1bKEix.js +0 -2
- package/dashboard/dist/assets/ScanCodesPage-Cu1bKEix.js.map +0 -1
- package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js +0 -2
- package/dashboard/dist/assets/ScanSchemeDetailPage-D9AbS6UY.js.map +0 -1
- package/dashboard/dist/assets/ScanStationPage-gcZGefvT.js +0 -2
- package/dashboard/dist/assets/ScanStationPage-gcZGefvT.js.map +0 -1
- package/dashboard/dist/assets/index-B_GT23TE.js +0 -3
- package/dashboard/dist/assets/index-B_GT23TE.js.map +0 -1
- package/dashboard/dist/assets/index-CgUcYveM.js +0 -67
- package/dashboard/dist/assets/index-CgUcYveM.js.map +0 -1
- package/dashboard/dist/assets/index-Dh8MJl3L.css +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
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.matchGuard = matchGuard;
|
|
37
|
+
exports.accumulateFromSubject = accumulateFromSubject;
|
|
38
|
+
exports.accumulateIntoSubject = accumulateIntoSubject;
|
|
39
|
+
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
40
|
+
const escalationService = __importStar(require("../../services/escalation"));
|
|
41
|
+
const accumulate_1 = require("../escalations/accumulate");
|
|
42
|
+
const helpers_1 = require("../escalations/helpers");
|
|
43
|
+
const metadata_1 = require("../escalations/metadata");
|
|
44
|
+
const escalation_1 = require("../../types/escalation");
|
|
45
|
+
const types_1 = require("../../types");
|
|
46
|
+
const context_1 = require("./context");
|
|
47
|
+
const grant_1 = require("./grant");
|
|
48
|
+
const subject_1 = require("./subject");
|
|
49
|
+
// ── Acting on the held subject ──────────────────────────────────────────────
|
|
50
|
+
//
|
|
51
|
+
// The station holds an item; this scan names where it goes. The step checks
|
|
52
|
+
// the pairing first (match), refusing with nothing written when it is wrong,
|
|
53
|
+
// then writes by id in one atomic statement: the subject joins the scanned
|
|
54
|
+
// container with its own row as the reciprocal (from: 'subject'), or the
|
|
55
|
+
// subject's row collects the scanned code (into: 'subject').
|
|
56
|
+
const STOCK_REFUSAL = 'That is not where this one goes.';
|
|
57
|
+
const STOCK_CONFLICT = 'That container just closed. Scan it again, or the next one.';
|
|
58
|
+
const STOCK_PLACED = 'This one is already placed.';
|
|
59
|
+
/** The step's template bags with the subject (and the container, once located). */
|
|
60
|
+
function bags(ctx, container) {
|
|
61
|
+
return { ...(0, context_1.templateContext)(ctx), ...(container ? { container: container.metadata ?? {} } : {}) };
|
|
62
|
+
}
|
|
63
|
+
/** Refuse the act when someone else holds a live claim on the subject. */
|
|
64
|
+
async function claimGuard(step, ctx, subject) {
|
|
65
|
+
if (step.subject?.claimedByOther === 'allow')
|
|
66
|
+
return null;
|
|
67
|
+
const other = await (0, subject_1.claimedByOther)(subject.row, ctx.auth.userId);
|
|
68
|
+
return other ? (0, context_1.refused)(`Claimed by **${other.displayName}**.`) : null;
|
|
69
|
+
}
|
|
70
|
+
/** The container the scan names: a pending accumulator under the actor's read scope. */
|
|
71
|
+
async function locateContainer(step, ctx) {
|
|
72
|
+
const selector = step.params?.accumulate?.container;
|
|
73
|
+
const scope = await (0, helpers_1.getEscalationReadScope)(ctx.auth.userId);
|
|
74
|
+
const roles = (0, metadata_1.restrictScopeRoles)(scope.allRoles, scope.global, selector?.roles ?? step.query?.roles);
|
|
75
|
+
if (roles !== null && roles.length === 0)
|
|
76
|
+
return null;
|
|
77
|
+
const found = await escalationService.searchByFacets({
|
|
78
|
+
roles: roles ?? undefined,
|
|
79
|
+
types: selector?.types,
|
|
80
|
+
subtypes: selector?.subtypes,
|
|
81
|
+
facets: { ...selector?.facets, [ctx.scheme.target_facet]: ctx.parsed.target },
|
|
82
|
+
status: 'pending',
|
|
83
|
+
exists: [escalation_1.ESCALATION_ACCUMULATE_KEYS.COUNT],
|
|
84
|
+
limit: 2,
|
|
85
|
+
});
|
|
86
|
+
return found.escalations.filter((row) => row.id !== ctx.subject?.row.id);
|
|
87
|
+
}
|
|
88
|
+
const WHOLE_BAG_TOKEN = /^\{(subject|container)\.([a-zA-Z0-9_]+)\}$/;
|
|
89
|
+
/**
|
|
90
|
+
* One match.target template as the values it allows. A template that is a
|
|
91
|
+
* single bag token naming a list facet (`{subject.offeredContainers}`) allows every
|
|
92
|
+
* entry; anything else renders to one value. A token with nothing to read
|
|
93
|
+
* allows nothing.
|
|
94
|
+
*/
|
|
95
|
+
function expandTarget(template, tpl) {
|
|
96
|
+
const whole = template.match(WHOLE_BAG_TOKEN);
|
|
97
|
+
if (whole) {
|
|
98
|
+
const value = tpl[whole[1]]?.[whole[2]];
|
|
99
|
+
if (Array.isArray(value))
|
|
100
|
+
return value.filter((v) => v !== null && v !== '').map(String);
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
return [scanCodeService.interpolateScanTemplate(template, tpl)];
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The pre-write guard. Returns the refusal when the pairing is wrong, null
|
|
111
|
+
* when it holds (or the step declares no match).
|
|
112
|
+
*/
|
|
113
|
+
function matchGuard(step, ctx, container) {
|
|
114
|
+
const match = step.match;
|
|
115
|
+
if (!match)
|
|
116
|
+
return null;
|
|
117
|
+
const tpl = bags(ctx, container);
|
|
118
|
+
const expected = (match.target ?? []).flatMap((t) => expandTarget(t, tpl));
|
|
119
|
+
const targetOk = match.target === undefined || expected.includes(ctx.parsed.target);
|
|
120
|
+
const subjectMeta = (ctx.subject?.row.metadata ?? {});
|
|
121
|
+
const containerMeta = (container?.metadata ?? {});
|
|
122
|
+
// With no container located there is nothing to compare; the step falls through.
|
|
123
|
+
const facetsOk = match.facets === undefined || !container || (match.facets.every((f) => subjectMeta[f] !== undefined && subjectMeta[f] !== null && String(subjectMeta[f]) === String(containerMeta[f])));
|
|
124
|
+
if (targetOk && facetsOk)
|
|
125
|
+
return null;
|
|
126
|
+
const markdown = scanCodeService.renderScanCopy(step.refuse?.markdown ?? STOCK_REFUSAL, tpl);
|
|
127
|
+
return (0, context_1.refused)(markdown, { refusal: { markdown, ...(expected.length ? { expected } : {}) } });
|
|
128
|
+
}
|
|
129
|
+
/** Map a failed add onto what the bench says. 404 falls through. */
|
|
130
|
+
function failedAdd(step, ctx, result, container) {
|
|
131
|
+
const outcome = result.data?.outcome;
|
|
132
|
+
if (result.status === 404)
|
|
133
|
+
return null;
|
|
134
|
+
if (result.status === 403)
|
|
135
|
+
return (0, context_1.forbidden)(result.error);
|
|
136
|
+
if (outcome === 'reciprocal-terminal' || outcome === 'reciprocal-full' || outcome === 'reciprocal-duplicate') {
|
|
137
|
+
return (0, context_1.refused)(STOCK_PLACED, { clearSubject: true });
|
|
138
|
+
}
|
|
139
|
+
if (outcome === 'claimed-by-other' || outcome === 'claim-expired')
|
|
140
|
+
return (0, context_1.conflict)(result.error);
|
|
141
|
+
if (result.status === 409) {
|
|
142
|
+
const markdown = scanCodeService.renderScanCopy(step.refuse?.conflict ?? STOCK_CONFLICT, bags(ctx, container));
|
|
143
|
+
// A lost race for a shared container: the subject's offer may have moved, so drop it.
|
|
144
|
+
return (0, context_1.refused)(markdown, { clearSubject: !!step.refuse?.conflict });
|
|
145
|
+
}
|
|
146
|
+
return (0, context_1.refused)(result.error ?? STOCK_REFUSAL);
|
|
147
|
+
}
|
|
148
|
+
function rendered(step, ctx, itemKeyDefault) {
|
|
149
|
+
const tpl = (0, context_1.templateContext)(ctx);
|
|
150
|
+
try {
|
|
151
|
+
return {
|
|
152
|
+
itemKey: scanCodeService.interpolateScanTemplate(step.params?.itemKey ?? itemKeyDefault ?? '', tpl),
|
|
153
|
+
payload: step.params?.resolverPayload
|
|
154
|
+
? scanCodeService.interpolateScanTemplate(step.params.resolverPayload, tpl)
|
|
155
|
+
: undefined,
|
|
156
|
+
metadata: {
|
|
157
|
+
...(step.params?.metadata ? scanCodeService.interpolateScanTemplate(step.params.metadata, tpl) : {}),
|
|
158
|
+
...(0, context_1.provenance)(ctx),
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
if (err instanceof scanCodeService.ScanTemplateError)
|
|
164
|
+
return null;
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** The subject joins the scanned container; the subject's row is the reciprocal. */
|
|
169
|
+
async function accumulateFromSubject(step, ctx) {
|
|
170
|
+
const subject = ctx.subject;
|
|
171
|
+
const claimed = await claimGuard(step, ctx, subject);
|
|
172
|
+
if (claimed)
|
|
173
|
+
return claimed;
|
|
174
|
+
// 1. Locate the container the scan names
|
|
175
|
+
const containers = await locateContainer(step, ctx);
|
|
176
|
+
if (containers && containers.length > 1) {
|
|
177
|
+
return (0, context_1.conflict)(`more than one open container carries ${ctx.scheme.target_facet} = ${ctx.parsed.target}`);
|
|
178
|
+
}
|
|
179
|
+
const container = containers?.[0];
|
|
180
|
+
// 2. Check the pairing before anything is written
|
|
181
|
+
const mismatch = matchGuard(step, ctx, container);
|
|
182
|
+
if (mismatch)
|
|
183
|
+
return mismatch;
|
|
184
|
+
if (!container) {
|
|
185
|
+
if (!step.refuse?.missing)
|
|
186
|
+
return null;
|
|
187
|
+
return (0, context_1.refused)(scanCodeService.renderScanCopy(step.refuse.missing, bags(ctx)));
|
|
188
|
+
}
|
|
189
|
+
// 3. Spend the badge, then write both rows in one statement
|
|
190
|
+
const values = rendered(step, ctx);
|
|
191
|
+
if (!values)
|
|
192
|
+
return null;
|
|
193
|
+
const notPrimed = (await (0, grant_1.identityGate)(step, ctx)) ?? (await (0, grant_1.spendGrant)(ctx));
|
|
194
|
+
if (notPrimed)
|
|
195
|
+
return notPrimed;
|
|
196
|
+
const result = await (0, accumulate_1.accumulateItem)({
|
|
197
|
+
id: container.id,
|
|
198
|
+
itemKey: values.itemKey,
|
|
199
|
+
payload: values.payload,
|
|
200
|
+
metadata: values.metadata,
|
|
201
|
+
reciprocal: { id: subject.row.id },
|
|
202
|
+
}, ctx.auth);
|
|
203
|
+
// 4. Report
|
|
204
|
+
if (result.status !== 200) {
|
|
205
|
+
if (result.data?.outcome === 'duplicate-item') {
|
|
206
|
+
return already(step, container);
|
|
207
|
+
}
|
|
208
|
+
return failedAdd(step, ctx, result, container);
|
|
209
|
+
}
|
|
210
|
+
return (0, context_1.withDone)({
|
|
211
|
+
status: 200,
|
|
212
|
+
data: {
|
|
213
|
+
outcome: types_1.SCAN_OUTCOMES.EXECUTED,
|
|
214
|
+
verb: step.verb,
|
|
215
|
+
escalation: { id: container.id, ...result.data },
|
|
216
|
+
clearSubject: true,
|
|
217
|
+
},
|
|
218
|
+
}, step, bags(ctx, container));
|
|
219
|
+
}
|
|
220
|
+
/** The subject's own row collects the scanned code. */
|
|
221
|
+
async function accumulateIntoSubject(step, ctx) {
|
|
222
|
+
const subject = ctx.subject;
|
|
223
|
+
const claimed = await claimGuard(step, ctx, subject);
|
|
224
|
+
if (claimed)
|
|
225
|
+
return claimed;
|
|
226
|
+
const mismatch = matchGuard(step, ctx);
|
|
227
|
+
if (mismatch)
|
|
228
|
+
return mismatch;
|
|
229
|
+
const values = rendered(step, ctx, '{scan.target}');
|
|
230
|
+
if (!values)
|
|
231
|
+
return null;
|
|
232
|
+
const notPrimed = (await (0, grant_1.identityGate)(step, ctx)) ?? (await (0, grant_1.spendGrant)(ctx));
|
|
233
|
+
if (notPrimed)
|
|
234
|
+
return notPrimed;
|
|
235
|
+
const result = await (0, accumulate_1.accumulateItem)({
|
|
236
|
+
id: subject.row.id,
|
|
237
|
+
itemKey: values.itemKey,
|
|
238
|
+
payload: values.payload,
|
|
239
|
+
metadata: values.metadata,
|
|
240
|
+
}, ctx.auth);
|
|
241
|
+
if (result.status !== 200) {
|
|
242
|
+
if (result.data?.outcome === 'duplicate-item') {
|
|
243
|
+
return already(step, subject.row);
|
|
244
|
+
}
|
|
245
|
+
return failedAdd(step, ctx, result);
|
|
246
|
+
}
|
|
247
|
+
const data = result.data;
|
|
248
|
+
return (0, context_1.withDone)({
|
|
249
|
+
status: 200,
|
|
250
|
+
data: {
|
|
251
|
+
outcome: types_1.SCAN_OUTCOMES.EXECUTED,
|
|
252
|
+
verb: step.verb,
|
|
253
|
+
escalation: { id: subject.row.id, ...result.data },
|
|
254
|
+
clearSubject: data.outcome === 'completed',
|
|
255
|
+
},
|
|
256
|
+
}, step, bags(ctx));
|
|
257
|
+
}
|
|
258
|
+
/** The item is already where the scan says: harmless, nothing written. */
|
|
259
|
+
function already(step, row) {
|
|
260
|
+
return {
|
|
261
|
+
status: 200,
|
|
262
|
+
data: {
|
|
263
|
+
outcome: types_1.SCAN_OUTCOMES.EXECUTED,
|
|
264
|
+
verb: step.verb,
|
|
265
|
+
escalation: { id: row.id },
|
|
266
|
+
already: true,
|
|
267
|
+
clearSubject: true,
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
}
|
|
@@ -2,7 +2,12 @@ import { type ScanExecuteResponse, type ScanStep } from '../../types';
|
|
|
2
2
|
import type { LTApiResult } from '../../types/sdk';
|
|
3
3
|
import { type StepContext } from './context';
|
|
4
4
|
export declare function claimStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the row the step's query names: the scanned target, the extra
|
|
7
|
+
* facets, and the claim state, all inside the atomic statement. A presented
|
|
8
|
+
* choice passes the row it showed, so the resolve lands on that row or misses.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveStep(step: ScanStep, ctx: StepContext, presentedId?: string): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
6
11
|
export declare function escalateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
7
12
|
export declare function releaseStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
8
13
|
/**
|
|
@@ -13,24 +18,4 @@ export declare function releaseStep(step: ScanStep, ctx: StepContext): Promise<L
|
|
|
13
18
|
*/
|
|
14
19
|
export declare function dispatchChoiceVerb(step: ScanStep, ctx: StepContext, row: Record<string, any>): Promise<LTApiResult<ScanExecuteResponse>>;
|
|
15
20
|
export declare function cancelStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
16
|
-
|
|
17
|
-
* Adds the scanned item to an accumulator. Two modes, one atomic write:
|
|
18
|
-
*
|
|
19
|
-
* - Item-locate (`params.accumulate.containerFacet`): the scan locates the
|
|
20
|
-
* item's own pending row through the scheme facet, reads the container
|
|
21
|
-
* facet value it carries, and adds the target to the container that shares
|
|
22
|
-
* it, writing the item row as the reciprocal in the same statement. An
|
|
23
|
-
* item with no row, or no container facet, falls through. An item whose
|
|
24
|
-
* container has closed and whose successor has not parked yet answers
|
|
25
|
-
* `no_open_container` with the item row, so the station can say "scan
|
|
26
|
-
* again" instead of showing the bag with no hint.
|
|
27
|
-
* - Container-locate (no `containerFacet`): the scan locates the container
|
|
28
|
-
* by the scheme facet and adds `params.itemKey` (template).
|
|
29
|
-
*
|
|
30
|
-
* Templates may read `{claim.<facet>}` (the actor's live claim) and, in item
|
|
31
|
-
* mode, `{item.<facet>}` (the located row); an unresolvable token falls
|
|
32
|
-
* through. The write is the SDK's guarded statement; the locate only picks
|
|
33
|
-
* ids. A container already holding the item answers conflict, never a
|
|
34
|
-
* second add.
|
|
35
|
-
*/
|
|
36
|
-
export declare function accumulateStep(step: ScanStep, ctx: StepContext): Promise<LTApiResult<ScanExecuteResponse> | null>;
|
|
21
|
+
export { accumulateStep } from './verb-accumulate';
|
|
@@ -33,46 +33,34 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.accumulateStep = void 0;
|
|
36
37
|
exports.claimStep = claimStep;
|
|
37
38
|
exports.resolveStep = resolveStep;
|
|
38
39
|
exports.escalateStep = escalateStep;
|
|
39
40
|
exports.releaseStep = releaseStep;
|
|
40
41
|
exports.dispatchChoiceVerb = dispatchChoiceVerb;
|
|
41
42
|
exports.cancelStep = cancelStep;
|
|
42
|
-
exports.accumulateStep = accumulateStep;
|
|
43
43
|
const scanCodeService = __importStar(require("../../services/scan-code"));
|
|
44
44
|
const escalationService = __importStar(require("../../services/escalation"));
|
|
45
45
|
const metadata_1 = require("../escalations/metadata");
|
|
46
|
-
const accumulate_1 = require("../escalations/accumulate");
|
|
47
46
|
const create_1 = require("../escalations/create");
|
|
48
47
|
const claim_1 = require("../escalations/claim");
|
|
49
48
|
const helpers_1 = require("../escalations/helpers");
|
|
50
49
|
const types_1 = require("../../types");
|
|
51
50
|
const context_1 = require("./context");
|
|
52
|
-
const
|
|
51
|
+
const grant_1 = require("./grant");
|
|
52
|
+
const hold_1 = require("./hold");
|
|
53
53
|
// ── Mutating verbs — each a single atomic operation under the ACTOR's RBAC ──
|
|
54
54
|
// ctx.auth is the effective actor: the badged person when a grant rode the
|
|
55
55
|
// request, otherwise the authenticated principal. Attribution and write
|
|
56
56
|
// scoping both derive from it, live, inside the escalation APIs.
|
|
57
|
-
/**
|
|
58
|
-
* Interpolates a step's params, or falls through when a `{claim.…}` or
|
|
59
|
-
* `{item.…}` token has nothing to read: a literal token never reaches a row.
|
|
60
|
-
*/
|
|
61
|
-
async function templated(step, ctx, render, item) {
|
|
62
|
-
const tpl = await (0, context_1.stepTemplate)(step, ctx, item);
|
|
63
|
-
try {
|
|
64
|
-
return render(tpl);
|
|
65
|
-
}
|
|
66
|
-
catch (err) {
|
|
67
|
-
if (err instanceof scanCodeService.ScanTemplateError)
|
|
68
|
-
return null;
|
|
69
|
-
throw err;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
57
|
async function claimStep(step, ctx) {
|
|
73
|
-
const metadata = await templated(step, ctx, (tpl) => (0, context_1.interpolatedMetadata)(step, ctx, tpl));
|
|
58
|
+
const metadata = await (0, context_1.templated)(step, ctx, (tpl) => (0, context_1.interpolatedMetadata)(step, ctx, tpl));
|
|
74
59
|
if (metadata === null)
|
|
75
60
|
return null;
|
|
61
|
+
const notPrimed = await (0, grant_1.spendGrant)(ctx);
|
|
62
|
+
if (notPrimed)
|
|
63
|
+
return notPrimed;
|
|
76
64
|
const result = await (0, metadata_1.claimByMetadata)({
|
|
77
65
|
key: ctx.scheme.target_facet,
|
|
78
66
|
value: ctx.parsed.target,
|
|
@@ -88,13 +76,21 @@ async function claimStep(step, ctx) {
|
|
|
88
76
|
return result;
|
|
89
77
|
return (0, context_1.executed)(result.data.escalation, step);
|
|
90
78
|
}
|
|
91
|
-
|
|
92
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Resolves the row the step's query names: the scanned target, the extra
|
|
81
|
+
* facets, and the claim state, all inside the atomic statement. A presented
|
|
82
|
+
* choice passes the row it showed, so the resolve lands on that row or misses.
|
|
83
|
+
*/
|
|
84
|
+
async function resolveStep(step, ctx, presentedId) {
|
|
85
|
+
const rendered = await (0, context_1.templated)(step, ctx, (tpl) => ({
|
|
93
86
|
resolverPayload: scanCodeService.interpolateScanTemplate(step.params?.resolverPayload ?? {}, tpl),
|
|
94
87
|
metadata: (0, context_1.interpolatedMetadata)(step, ctx, tpl),
|
|
95
88
|
}));
|
|
96
89
|
if (rendered === null)
|
|
97
90
|
return null;
|
|
91
|
+
const notPrimed = await (0, grant_1.spendGrant)(ctx);
|
|
92
|
+
if (notPrimed)
|
|
93
|
+
return notPrimed;
|
|
98
94
|
const result = await (0, metadata_1.resolveByMetadata)({
|
|
99
95
|
key: ctx.scheme.target_facet,
|
|
100
96
|
value: ctx.parsed.target,
|
|
@@ -102,6 +98,8 @@ async function resolveStep(step, ctx) {
|
|
|
102
98
|
metadata: { ...rendered.metadata, ...(0, context_1.provenance)(ctx) },
|
|
103
99
|
restrictRoles: step.query?.roles,
|
|
104
100
|
extraFacets: step.query?.facets,
|
|
101
|
+
availability: step.query?.availability,
|
|
102
|
+
assertId: presentedId,
|
|
105
103
|
}, ctx.auth);
|
|
106
104
|
if (result.status === 404)
|
|
107
105
|
return null;
|
|
@@ -109,6 +107,8 @@ async function resolveStep(step, ctx) {
|
|
|
109
107
|
return (0, context_1.forbidden)(result.error);
|
|
110
108
|
if (result.status === 409)
|
|
111
109
|
return (0, context_1.conflict)(result.error);
|
|
110
|
+
if (result.status === 400 || result.status === 422)
|
|
111
|
+
return (0, context_1.refused)(result.error ?? 'the payload was not accepted');
|
|
112
112
|
if (result.status !== 200)
|
|
113
113
|
return result;
|
|
114
114
|
const escalation = result.data.escalation
|
|
@@ -133,6 +133,9 @@ async function escalateStep(step, ctx) {
|
|
|
133
133
|
if (cancelled.data?.outcome !== types_1.SCAN_OUTCOMES.EXECUTED)
|
|
134
134
|
return cancelled;
|
|
135
135
|
}
|
|
136
|
+
const notPrimed = await (0, grant_1.spendGrant)(ctx);
|
|
137
|
+
if (notPrimed)
|
|
138
|
+
return notPrimed;
|
|
136
139
|
const created = await (0, create_1.createEscalation)({
|
|
137
140
|
type: step.params?.escalationType ?? 'scan',
|
|
138
141
|
role: step.params.targetRole,
|
|
@@ -166,6 +169,9 @@ async function releaseStep(step, ctx) {
|
|
|
166
169
|
});
|
|
167
170
|
if (escalations.length === 0)
|
|
168
171
|
return null;
|
|
172
|
+
const notPrimed = await (0, grant_1.spendGrant)(ctx);
|
|
173
|
+
if (notPrimed)
|
|
174
|
+
return notPrimed;
|
|
169
175
|
const result = await (0, claim_1.releaseEscalation)({ id: escalations[0].id }, ctx.auth);
|
|
170
176
|
if (result.status === 403)
|
|
171
177
|
return (0, context_1.forbidden)(result.error);
|
|
@@ -185,11 +191,13 @@ async function dispatchChoiceVerb(step, ctx, row) {
|
|
|
185
191
|
switch (step.verb) {
|
|
186
192
|
case types_1.SCAN_VERBS.SHOW_DETAIL:
|
|
187
193
|
return (0, context_1.executed)(row, step); // already located under the actor's scope
|
|
194
|
+
case types_1.SCAN_VERBS.HOLD:
|
|
195
|
+
return (await (0, hold_1.holdStep)(step, ctx, row));
|
|
188
196
|
case types_1.SCAN_VERBS.CLAIM:
|
|
189
197
|
case types_1.SCAN_VERBS.CLAIM_SHOW_DETAIL:
|
|
190
198
|
return (await claimStep(step, ctx)) ?? (await missReason(step, ctx, 'the item is no longer claimable'));
|
|
191
199
|
case types_1.SCAN_VERBS.RESOLVE:
|
|
192
|
-
return (await resolveStep(step, ctx)) ?? (await missReason(step, ctx, 'the item is no longer resolvable'));
|
|
200
|
+
return (await resolveStep(step, ctx, row.id)) ?? (await missReason(step, ctx, 'the item is no longer resolvable'));
|
|
193
201
|
case types_1.SCAN_VERBS.ESCALATE:
|
|
194
202
|
return (await escalateStep(step, ctx)) ?? (await missReason(step, ctx, 'the item already moved on'));
|
|
195
203
|
case types_1.SCAN_VERBS.RELEASE:
|
|
@@ -213,6 +221,9 @@ async function missReason(step, ctx, raceMessage) {
|
|
|
213
221
|
async function cancelStep(step, ctx) {
|
|
214
222
|
// Claim-as-lock: the atomic claim pins the row to this caller (or extends
|
|
215
223
|
// their claim), serializing concurrent double-scans before the cancel.
|
|
224
|
+
const notPrimed = await (0, grant_1.spendGrant)(ctx);
|
|
225
|
+
if (notPrimed)
|
|
226
|
+
return notPrimed;
|
|
216
227
|
const claimed = await (0, metadata_1.claimByMetadata)({
|
|
217
228
|
key: ctx.scheme.target_facet,
|
|
218
229
|
value: ctx.parsed.target,
|
|
@@ -230,95 +241,5 @@ async function cancelStep(step, ctx) {
|
|
|
230
241
|
return (0, context_1.conflict)('Escalation is not cancellable (already terminal)');
|
|
231
242
|
return (0, context_1.executed)(cancelled, step);
|
|
232
243
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
*
|
|
236
|
-
* - Item-locate (`params.accumulate.containerFacet`): the scan locates the
|
|
237
|
-
* item's own pending row through the scheme facet, reads the container
|
|
238
|
-
* facet value it carries, and adds the target to the container that shares
|
|
239
|
-
* it, writing the item row as the reciprocal in the same statement. An
|
|
240
|
-
* item with no row, or no container facet, falls through. An item whose
|
|
241
|
-
* container has closed and whose successor has not parked yet answers
|
|
242
|
-
* `no_open_container` with the item row, so the station can say "scan
|
|
243
|
-
* again" instead of showing the bag with no hint.
|
|
244
|
-
* - Container-locate (no `containerFacet`): the scan locates the container
|
|
245
|
-
* by the scheme facet and adds `params.itemKey` (template).
|
|
246
|
-
*
|
|
247
|
-
* Templates may read `{claim.<facet>}` (the actor's live claim) and, in item
|
|
248
|
-
* mode, `{item.<facet>}` (the located row); an unresolvable token falls
|
|
249
|
-
* through. The write is the SDK's guarded statement; the locate only picks
|
|
250
|
-
* ids. A container already holding the item answers conflict, never a
|
|
251
|
-
* second add.
|
|
252
|
-
*/
|
|
253
|
-
async function accumulateStep(step, ctx) {
|
|
254
|
-
const options = step.params?.accumulate;
|
|
255
|
-
let item;
|
|
256
|
-
if (options?.containerFacet) {
|
|
257
|
-
const located = await (0, locate_1.locateForStep)(step, ctx, 1);
|
|
258
|
-
item = located?.escalations[0];
|
|
259
|
-
if (!item)
|
|
260
|
-
return null;
|
|
261
|
-
}
|
|
262
|
-
const rendered = await templated(step, ctx, (tpl) => ({
|
|
263
|
-
payload: step.params?.resolverPayload
|
|
264
|
-
? scanCodeService.interpolateScanTemplate(step.params.resolverPayload, tpl)
|
|
265
|
-
: undefined,
|
|
266
|
-
metadata: { ...(0, context_1.interpolatedMetadata)(step, ctx, tpl), ...(0, context_1.provenance)(ctx) },
|
|
267
|
-
itemKey: options?.containerFacet
|
|
268
|
-
? ctx.parsed.target
|
|
269
|
-
: scanCodeService.interpolateScanTemplate(step.params.itemKey, tpl),
|
|
270
|
-
}), item);
|
|
271
|
-
if (rendered === null)
|
|
272
|
-
return null;
|
|
273
|
-
let request;
|
|
274
|
-
let container;
|
|
275
|
-
if (options?.containerFacet && item) {
|
|
276
|
-
const containerValue = item.metadata?.[options.containerFacet];
|
|
277
|
-
if (containerValue === undefined || containerValue === null || containerValue === '')
|
|
278
|
-
return null;
|
|
279
|
-
container = { facet: options.containerFacet, value: String(containerValue) };
|
|
280
|
-
request = {
|
|
281
|
-
key: container.facet,
|
|
282
|
-
value: container.value,
|
|
283
|
-
itemKey: rendered.itemKey,
|
|
284
|
-
payload: rendered.payload,
|
|
285
|
-
metadata: rendered.metadata,
|
|
286
|
-
restrictRoles: options.containerRoles,
|
|
287
|
-
...(options.reciprocal === false ? {} : { reciprocal: { id: item.id } }),
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
request = {
|
|
292
|
-
key: ctx.scheme.target_facet,
|
|
293
|
-
value: ctx.parsed.target,
|
|
294
|
-
itemKey: rendered.itemKey,
|
|
295
|
-
payload: rendered.payload,
|
|
296
|
-
metadata: rendered.metadata,
|
|
297
|
-
restrictRoles: step.query?.roles,
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
const result = await (0, accumulate_1.accumulateItemByMetadata)(request, ctx.auth);
|
|
301
|
-
if (result.status === 404) {
|
|
302
|
-
if (!container || !item)
|
|
303
|
-
return null;
|
|
304
|
-
return {
|
|
305
|
-
status: 200,
|
|
306
|
-
data: {
|
|
307
|
-
outcome: types_1.SCAN_OUTCOMES.NO_OPEN_CONTAINER,
|
|
308
|
-
verb: step.verb,
|
|
309
|
-
escalation: item,
|
|
310
|
-
container,
|
|
311
|
-
fallback: ctx.rule.fallback,
|
|
312
|
-
error: `No open container carries ${container.facet} = ${container.value}`,
|
|
313
|
-
},
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
if (result.status === 403)
|
|
317
|
-
return (0, context_1.forbidden)(result.error);
|
|
318
|
-
if (result.status === 409)
|
|
319
|
-
return (0, context_1.conflict)(result.error);
|
|
320
|
-
if (result.status !== 200)
|
|
321
|
-
return result;
|
|
322
|
-
const escalation = result.data.escalationId ? { id: result.data.escalationId, ...result.data } : undefined;
|
|
323
|
-
return (0, context_1.executed)(escalation, step);
|
|
324
|
-
}
|
|
244
|
+
var verb_accumulate_1 = require("./verb-accumulate");
|
|
245
|
+
Object.defineProperty(exports, "accumulateStep", { enumerable: true, get: function () { return verb_accumulate_1.accumulateStep; } });
|
|
@@ -21,14 +21,16 @@ export declare function invokeWorkflow(input: {
|
|
|
21
21
|
/**
|
|
22
22
|
* Get the execution status of a workflow.
|
|
23
23
|
*
|
|
24
|
-
* Returns the HotMesh status code (0
|
|
24
|
+
* Returns the HotMesh status code (above 0 running, 0 closed, below 0
|
|
25
|
+
* terminated) with the state it implies: `running`, `completed` or `failed`,
|
|
26
|
+
* `terminated` when an interrupt ended it, and `error` for a failed run.
|
|
25
27
|
* Resolves the workflow handle via task record or worker registry.
|
|
26
28
|
* `appId` selects the namespace for the job-entity fallback so a child
|
|
27
29
|
* running in another app resolves instead of 404ing against `durable`.
|
|
28
30
|
*
|
|
29
31
|
* @param input.workflowId — HotMesh workflow ID
|
|
30
32
|
* @param input.appId — HotMesh namespace for resolution (default: durable)
|
|
31
|
-
* @returns `{ status: 200, data: { workflowId, status } }` or 404
|
|
33
|
+
* @returns `{ status: 200, data: { workflowId, status, state, terminated, error? } }` or 404
|
|
32
34
|
*/
|
|
33
35
|
export declare function getWorkflowStatus(input: {
|
|
34
36
|
workflowId: string;
|
|
@@ -38,11 +40,13 @@ export declare function getWorkflowStatus(input: {
|
|
|
38
40
|
* Get the result of a completed workflow.
|
|
39
41
|
*
|
|
40
42
|
* Returns 202 if the workflow is still running, 200 with the result
|
|
41
|
-
* payload when complete
|
|
43
|
+
* payload when complete, and 200 with `state: 'failed'` (plus `terminated`
|
|
44
|
+
* and `error` when known) when it failed or was terminated. Never blocks —
|
|
45
|
+
* always returns immediately.
|
|
42
46
|
*
|
|
43
47
|
* @param input.workflowId — HotMesh workflow ID
|
|
44
48
|
* @param input.appId — HotMesh namespace for resolution (default: durable)
|
|
45
|
-
* @returns `{ status: 200, data: { workflowId, result } }` or 202 if running
|
|
49
|
+
* @returns `{ status: 200, data: { workflowId, state, result } }` or 202 if running
|
|
46
50
|
*/
|
|
47
51
|
export declare function getWorkflowResult(input: {
|
|
48
52
|
workflowId: string;
|
|
@@ -41,6 +41,7 @@ exports.exportWorkflow = exportWorkflow;
|
|
|
41
41
|
const workers_1 = require("../../workers");
|
|
42
42
|
const exportService = __importStar(require("../../services/export"));
|
|
43
43
|
const task_1 = require("../../services/task");
|
|
44
|
+
const workflow_state_1 = require("../../services/workflow-state");
|
|
44
45
|
const workflow_invocation_1 = require("../../services/workflow-invocation");
|
|
45
46
|
const crud_1 = require("../../services/escalation/crud");
|
|
46
47
|
const configService = __importStar(require("../../services/config"));
|
|
@@ -91,24 +92,26 @@ async function invokeWorkflow(input, auth) {
|
|
|
91
92
|
/**
|
|
92
93
|
* Get the execution status of a workflow.
|
|
93
94
|
*
|
|
94
|
-
* Returns the HotMesh status code (0
|
|
95
|
+
* Returns the HotMesh status code (above 0 running, 0 closed, below 0
|
|
96
|
+
* terminated) with the state it implies: `running`, `completed` or `failed`,
|
|
97
|
+
* `terminated` when an interrupt ended it, and `error` for a failed run.
|
|
95
98
|
* Resolves the workflow handle via task record or worker registry.
|
|
96
99
|
* `appId` selects the namespace for the job-entity fallback so a child
|
|
97
100
|
* running in another app resolves instead of 404ing against `durable`.
|
|
98
101
|
*
|
|
99
102
|
* @param input.workflowId — HotMesh workflow ID
|
|
100
103
|
* @param input.appId — HotMesh namespace for resolution (default: durable)
|
|
101
|
-
* @returns `{ status: 200, data: { workflowId, status } }` or 404
|
|
104
|
+
* @returns `{ status: 200, data: { workflowId, status, state, terminated, error? } }` or 404
|
|
102
105
|
*/
|
|
103
106
|
async function getWorkflowStatus(input) {
|
|
104
107
|
try {
|
|
105
108
|
const resolved = await (0, task_1.resolveWorkflowHandle)(input.workflowId, input.appId);
|
|
106
109
|
const client = (0, workers_1.createClient)();
|
|
107
110
|
const handle = await client.workflow.getHandle(resolved.taskQueue, resolved.workflowName, input.workflowId);
|
|
108
|
-
const
|
|
111
|
+
const reading = await (0, workflow_state_1.readWorkflowState)(handle);
|
|
109
112
|
return {
|
|
110
113
|
status: 200,
|
|
111
|
-
data: { workflowId: input.workflowId,
|
|
114
|
+
data: { workflowId: input.workflowId, ...reading },
|
|
112
115
|
};
|
|
113
116
|
}
|
|
114
117
|
catch (err) {
|
|
@@ -121,28 +124,42 @@ async function getWorkflowStatus(input) {
|
|
|
121
124
|
* Get the result of a completed workflow.
|
|
122
125
|
*
|
|
123
126
|
* Returns 202 if the workflow is still running, 200 with the result
|
|
124
|
-
* payload when complete
|
|
127
|
+
* payload when complete, and 200 with `state: 'failed'` (plus `terminated`
|
|
128
|
+
* and `error` when known) when it failed or was terminated. Never blocks —
|
|
129
|
+
* always returns immediately.
|
|
125
130
|
*
|
|
126
131
|
* @param input.workflowId — HotMesh workflow ID
|
|
127
132
|
* @param input.appId — HotMesh namespace for resolution (default: durable)
|
|
128
|
-
* @returns `{ status: 200, data: { workflowId, result } }` or 202 if running
|
|
133
|
+
* @returns `{ status: 200, data: { workflowId, state, result } }` or 202 if running
|
|
129
134
|
*/
|
|
130
135
|
async function getWorkflowResult(input) {
|
|
131
136
|
try {
|
|
132
137
|
const resolved = await (0, task_1.resolveWorkflowHandle)(input.workflowId, input.appId);
|
|
133
138
|
const client = (0, workers_1.createClient)();
|
|
134
139
|
const handle = await client.workflow.getHandle(resolved.taskQueue, resolved.workflowName, input.workflowId);
|
|
135
|
-
const
|
|
136
|
-
if (
|
|
140
|
+
const reading = await (0, workflow_state_1.readWorkflowState)(handle);
|
|
141
|
+
if (reading.state === workflow_state_1.WORKFLOW_STATES.RUNNING) {
|
|
137
142
|
return {
|
|
138
143
|
status: 202,
|
|
139
144
|
data: { workflowId: input.workflowId, status: 'running' },
|
|
140
145
|
};
|
|
141
146
|
}
|
|
147
|
+
if (reading.state === workflow_state_1.WORKFLOW_STATES.FAILED) {
|
|
148
|
+
return {
|
|
149
|
+
status: 200,
|
|
150
|
+
data: {
|
|
151
|
+
workflowId: input.workflowId,
|
|
152
|
+
state: reading.state,
|
|
153
|
+
terminated: reading.terminated,
|
|
154
|
+
...(reading.error ? { error: reading.error } : {}),
|
|
155
|
+
result: null,
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
142
159
|
const result = await handle.result();
|
|
143
160
|
return {
|
|
144
161
|
status: 200,
|
|
145
|
-
data: { workflowId: input.workflowId, result },
|
|
162
|
+
data: { workflowId: input.workflowId, state: reading.state, result },
|
|
146
163
|
};
|
|
147
164
|
}
|
|
148
165
|
catch (err) {
|