@open-mercato/core 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7194.1.ab4fc81f82
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/.turbo/turbo-build.log +2 -2
- package/AGENTS.md +4 -3
- package/agentic/standalone-guide.md +1 -1
- package/build.mjs +16 -0
- package/dist/generated/entities/action_log/index.js +2 -0
- package/dist/generated/entities/action_log/index.js.map +2 -2
- package/dist/generated/entities/user/index.js +2 -0
- package/dist/generated/entities/user/index.js.map +2 -2
- package/dist/generated/entities/user_task/index.js +14 -0
- package/dist/generated/entities/user_task/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition/index.js +6 -0
- package/dist/generated/entities/workflow_definition/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition_draft/index.js +25 -0
- package/dist/generated/entities/workflow_definition_draft/index.js.map +7 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js +23 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js.map +7 -0
- package/dist/generated/entities/workflow_instance/index.js +4 -0
- package/dist/generated/entities/workflow_instance/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +4 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +39 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/workflowsFixtures.js +477 -2
- package/dist/helpers/integration/workflowsFixtures.js.map +2 -2
- package/dist/helpers/integration/workflowsUi.js +148 -0
- package/dist/helpers/integration/workflowsUi.js.map +7 -0
- package/dist/modules/attachments/lib/createFromBuffer.js +79 -0
- package/dist/modules/attachments/lib/createFromBuffer.js.map +7 -0
- package/dist/modules/audit_logs/data/entities.js +5 -0
- package/dist/modules/audit_logs/data/entities.js.map +2 -2
- package/dist/modules/audit_logs/data/validators.js +1 -0
- package/dist/modules/audit_logs/data/validators.js.map +2 -2
- package/dist/modules/audit_logs/lib/projections.js +2 -1
- package/dist/modules/audit_logs/lib/projections.js.map +2 -2
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js +15 -0
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js.map +7 -0
- package/dist/modules/audit_logs/services/actionLogService.js +3 -0
- package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
- package/dist/modules/auth/data/entities.js +6 -0
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/lib/executionPrincipal.js +140 -0
- package/dist/modules/auth/lib/executionPrincipal.js.map +7 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js +13 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js.map +7 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js +154 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js.map +7 -0
- package/dist/modules/business_rules/data/validators.js +6 -0
- package/dist/modules/business_rules/data/validators.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-engine.js +5 -3
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +5 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/workflows.js +19 -0
- package/dist/modules/catalog/workflows.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/cli.js +80 -0
- package/dist/modules/customer_accounts/cli.js.map +7 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js +59 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js.map +7 -0
- package/dist/modules/customer_accounts/setup.js +4 -2
- package/dist/modules/customer_accounts/setup.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +4 -0
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js +1 -1
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +2 -0
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/events.js +13 -2
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/link-workflow-task-handler.js +64 -0
- package/dist/modules/customers/lib/link-workflow-task-handler.js.map +7 -0
- package/dist/modules/customers/lib/todoCompatibility.js +1 -1
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/customers/lib/workflowTaskLink.js +9 -0
- package/dist/modules/customers/lib/workflowTaskLink.js.map +7 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js +12 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js.map +7 -0
- package/dist/modules/customers/workflows.js +29 -0
- package/dist/modules/customers/workflows.js.map +7 -0
- package/dist/modules/entities/api/records.js +13 -33
- package/dist/modules/entities/api/records.js.map +3 -3
- package/dist/modules/entities/lib/entityClassification.js +60 -0
- package/dist/modules/entities/lib/entityClassification.js.map +7 -0
- package/dist/modules/sales/commands/documents.js +31 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/events.js +12 -1
- package/dist/modules/sales/events.js.map +2 -2
- package/dist/modules/sales/workflows.js +12 -1
- package/dist/modules/sales/workflows.js.map +2 -2
- package/dist/modules/seeds/cli.js +199 -0
- package/dist/modules/seeds/cli.js.map +7 -0
- package/dist/modules/seeds/examples/sample-seed.json +26 -0
- package/dist/modules/seeds/index.js +12 -0
- package/dist/modules/seeds/index.js.map +7 -0
- package/dist/modules/workflows/acl.js +96 -0
- package/dist/modules/workflows/acl.js.map +2 -2
- package/dist/modules/workflows/ai-agents.js +50 -0
- package/dist/modules/workflows/ai-agents.js.map +7 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js +582 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js.map +7 -0
- package/dist/modules/workflows/ai-tools/types.js +43 -0
- package/dist/modules/workflows/ai-tools/types.js.map +7 -0
- package/dist/modules/workflows/ai-tools.js +10 -0
- package/dist/modules/workflows/ai-tools.js.map +7 -0
- package/dist/modules/workflows/api/command-settings/route.js +137 -0
- package/dist/modules/workflows/api/command-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/commands/route.js +72 -0
- package/dist/modules/workflows/api/commands/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js +76 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js +134 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js +5 -1
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js +286 -0
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js +207 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +5 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js +93 -9
- package/dist/modules/workflows/api/definitions/[id]/route.js.map +3 -3
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js +210 -0
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/generate/route.js +233 -0
- package/dist/modules/workflows/api/definitions/generate/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/route.js +61 -113
- package/dist/modules/workflows/api/definitions/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/serialize.js +9 -0
- package/dist/modules/workflows/api/definitions/serialize.js.map +2 -2
- package/dist/modules/workflows/api/endpoints/route.js +69 -0
- package/dist/modules/workflows/api/endpoints/route.js.map +7 -0
- package/dist/modules/workflows/api/functions/route.js +73 -0
- package/dist/modules/workflows/api/functions/route.js.map +7 -0
- package/dist/modules/workflows/api/grantable-features/route.js +75 -0
- package/dist/modules/workflows/api/grantable-features/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js +180 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js +184 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/retry/route.js +12 -2
- package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js +148 -0
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js +123 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js +172 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js +117 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js +165 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/route.js +94 -3
- package/dist/modules/workflows/api/instances/route.js.map +2 -2
- package/dist/modules/workflows/api/metrics/definitions/route.js +188 -0
- package/dist/modules/workflows/api/metrics/definitions/route.js.map +7 -0
- package/dist/modules/workflows/api/openapi.js +415 -4
- package/dist/modules/workflows/api/openapi.js.map +2 -2
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js +132 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js +97 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/route.js +126 -0
- package/dist/modules/workflows/api/portal/tasks/route.js.map +7 -0
- package/dist/modules/workflows/api/rule-usage/route.js +80 -0
- package/dist/modules/workflows/api/rule-usage/route.js.map +7 -0
- package/dist/modules/workflows/api/task-settings/route.js +107 -0
- package/dist/modules/workflows/api/task-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js +27 -16
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js +40 -16
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js +150 -0
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/route.js +39 -6
- package/dist/modules/workflows/api/tasks/[id]/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js +100 -0
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/route.js +37 -6
- package/dist/modules/workflows/api/tasks/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/serialize.js +83 -0
- package/dist/modules/workflows/api/tasks/serialize.js.map +7 -0
- package/dist/modules/workflows/api/templates/route.js +69 -0
- package/dist/modules/workflows/api/templates/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js +129 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/route.js +119 -0
- package/dist/modules/workflows/api/work-inbox/route.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.js +10 -0
- package/dist/modules/workflows/backend/config/workflows/page.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js +35 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/[id]/page.js +6 -271
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/definitions/create/page.js +7 -56
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +131 -51
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2606 -677
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +3 -3
- package/dist/modules/workflows/backend/instances/[id]/page.js +532 -421
- package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/instances/failure-queue/page.js +211 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.js.map +7 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js +20 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/instances/page.js +159 -22
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/tasks/[id]/page.js +553 -392
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/page.js +8 -250
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.meta.js +1 -0
- package/dist/modules/workflows/backend/tasks/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/work-inbox/page.js +399 -0
- package/dist/modules/workflows/backend/work-inbox/page.js.map +7 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js +19 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js.map +7 -0
- package/dist/modules/workflows/cli.js +1 -1
- package/dist/modules/workflows/cli.js.map +2 -2
- package/dist/modules/workflows/commands/tasks.js +81 -0
- package/dist/modules/workflows/commands/tasks.js.map +7 -0
- package/dist/modules/workflows/components/ActivitiesEditor.js +281 -287
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
- package/dist/modules/workflows/components/ActivityEditDialog.js +220 -0
- package/dist/modules/workflows/components/ActivityEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/AgentSelector.js +115 -0
- package/dist/modules/workflows/components/AgentSelector.js.map +7 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js +110 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js +71 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRulesSelector.js +151 -93
- package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
- package/dist/modules/workflows/components/ConfigJsonTextarea.js +85 -0
- package/dist/modules/workflows/components/ConfigJsonTextarea.js.map +7 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js +150 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js +102 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js +377 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js +132 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +307 -216
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialog.js +11 -18
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +112 -72
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/InputDataPanel.js +128 -0
- package/dist/modules/workflows/components/InputDataPanel.js.map +7 -0
- package/dist/modules/workflows/components/InspectorPanel.js +161 -0
- package/dist/modules/workflows/components/InspectorPanel.js.map +7 -0
- package/dist/modules/workflows/components/NodeEditDialog.js +363 -41
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +714 -159
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TemplateGalleryDialog.js +148 -0
- package/dist/modules/workflows/components/TemplateGalleryDialog.js.map +7 -0
- package/dist/modules/workflows/components/TransitionsEditor.js +80 -74
- package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TriggersDialog.js +53 -0
- package/dist/modules/workflows/components/TriggersDialog.js.map +7 -0
- package/dist/modules/workflows/components/TriggersEditor.js +331 -0
- package/dist/modules/workflows/components/TriggersEditor.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js +278 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js +173 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js +62 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js +70 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js +36 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowGraph.js +4 -2
- package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +324 -86
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +3 -3
- package/dist/modules/workflows/components/WorkflowIconPicker.js +109 -0
- package/dist/modules/workflows/components/WorkflowIconPicker.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowLegend.js +45 -29
- package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowNodeCard.js +221 -22
- package/dist/modules/workflows/components/WorkflowNodeCard.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowRouteChips.js +111 -0
- package/dist/modules/workflows/components/WorkflowRouteChips.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowSelector.js +108 -88
- package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js +61 -11
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js +15 -5
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +88 -21
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js +615 -0
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js +191 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js +488 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js +61 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js.map +7 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js +227 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +37 -4
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/CommandPicker.js +111 -0
- package/dist/modules/workflows/components/fields/CommandPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js +235 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FunctionPicker.js +55 -0
- package/dist/modules/workflows/components/fields/FunctionPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js +38 -15
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js +206 -0
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js +53 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js.map +7 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js +130 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js +104 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js.map +7 -0
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +2 -2
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js +210 -0
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js +126 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js +218 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js +114 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js +64 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js.map +7 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js +121 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js.map +7 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js +35 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js.map +7 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js +16 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js.map +7 -0
- package/dist/modules/workflows/components/formConfig.js +39 -10
- package/dist/modules/workflows/components/formConfig.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileMetadataSheet.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +29 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +64 -65
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +2 -2
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js +64 -0
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/AutomatedNode.js +24 -16
- package/dist/modules/workflows/components/nodes/AutomatedNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/EndNode.js +13 -12
- package/dist/modules/workflows/components/nodes/EndNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js +29 -0
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js.map +7 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js +51 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js +122 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js +100 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js.map +7 -0
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StartNode.js +66 -15
- package/dist/modules/workflows/components/nodes/StartNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js +54 -0
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js +107 -41
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/SwitchNode.js +51 -0
- package/dist/modules/workflows/components/nodes/SwitchNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js +65 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js +111 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/UserTaskNode.js +43 -17
- package/dist/modules/workflows/components/nodes/UserTaskNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js +53 -0
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/index.js +14 -0
- package/dist/modules/workflows/components/nodes/index.js.map +2 -2
- package/dist/modules/workflows/components/portal/PortalTaskForm.js +196 -0
- package/dist/modules/workflows/components/portal/PortalTaskForm.js.map +7 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js +22 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js.map +7 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js +106 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js.map +7 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js +30 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunGantt.js +130 -0
- package/dist/modules/workflows/components/run/RunGantt.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js +82 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js +116 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js.map +7 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js +52 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js.map +7 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js +28 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js.map +7 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js +89 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js +41 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js +57 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js.map +7 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js +156 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js +72 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js +156 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js +46 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js +53 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js +261 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js +27 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-schemas.js +191 -0
- package/dist/modules/workflows/data/activity-config-schemas.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-warnings.js +42 -0
- package/dist/modules/workflows/data/activity-config-warnings.js.map +7 -0
- package/dist/modules/workflows/data/branching-route-warnings.js +65 -0
- package/dist/modules/workflows/data/branching-route-warnings.js.map +7 -0
- package/dist/modules/workflows/data/entities.js +144 -4
- package/dist/modules/workflows/data/entities.js.map +2 -2
- package/dist/modules/workflows/data/metrics-validators.js +35 -0
- package/dist/modules/workflows/data/metrics-validators.js.map +7 -0
- package/dist/modules/workflows/data/task-primitives.js +14 -0
- package/dist/modules/workflows/data/task-primitives.js.map +7 -0
- package/dist/modules/workflows/data/validators.js +504 -61
- package/dist/modules/workflows/data/validators.js.map +3 -3
- package/dist/modules/workflows/di.js +16 -1
- package/dist/modules/workflows/di.js.map +2 -2
- package/dist/modules/workflows/events.js +66 -8
- package/dist/modules/workflows/events.js.map +2 -2
- package/dist/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/dist/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/dist/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/dist/modules/workflows/examples/templates/order-approval.json +230 -0
- package/dist/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/dist/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/dist/modules/workflows/extension-points.js +1 -1
- package/dist/modules/workflows/extension-points.js.map +2 -2
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js +144 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js +12 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js +114 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js +18 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js.map +7 -0
- package/dist/modules/workflows/lib/activity-executor.js +505 -137
- package/dist/modules/workflows/lib/activity-executor.js.map +3 -3
- package/dist/modules/workflows/lib/activity-queue-types.js +3 -1
- package/dist/modules/workflows/lib/activity-queue-types.js.map +2 -2
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js +2 -0
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js.map +7 -0
- package/dist/modules/workflows/lib/activity-registry.js +27 -0
- package/dist/modules/workflows/lib/activity-registry.js.map +7 -0
- package/dist/modules/workflows/lib/activity-types.js +291 -0
- package/dist/modules/workflows/lib/activity-types.js.map +7 -0
- package/dist/modules/workflows/lib/activity-worker-handler.js +456 -32
- package/dist/modules/workflows/lib/activity-worker-handler.js.map +3 -3
- package/dist/modules/workflows/lib/advanced-config.js +31 -0
- package/dist/modules/workflows/lib/advanced-config.js.map +7 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js +198 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js.map +7 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js +82 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js.map +7 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js +54 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js +61 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review.js +66 -0
- package/dist/modules/workflows/lib/agent-review.js.map +7 -0
- package/dist/modules/workflows/lib/ai-authoring.js +155 -0
- package/dist/modules/workflows/lib/ai-authoring.js.map +7 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js +43 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js.map +7 -0
- package/dist/modules/workflows/lib/annotation-events.js +10 -0
- package/dist/modules/workflows/lib/annotation-events.js.map +7 -0
- package/dist/modules/workflows/lib/branching-routes.js +182 -0
- package/dist/modules/workflows/lib/branching-routes.js.map +7 -0
- package/dist/modules/workflows/lib/breach-routing.js +50 -0
- package/dist/modules/workflows/lib/breach-routing.js.map +7 -0
- package/dist/modules/workflows/lib/bulk-replay.js +101 -0
- package/dist/modules/workflows/lib/bulk-replay.js.map +7 -0
- package/dist/modules/workflows/lib/business-rule-usage.js +91 -0
- package/dist/modules/workflows/lib/business-rule-usage.js.map +7 -0
- package/dist/modules/workflows/lib/caller-graph.js +53 -0
- package/dist/modules/workflows/lib/caller-graph.js.map +7 -0
- package/dist/modules/workflows/lib/code-view-apply.js +86 -0
- package/dist/modules/workflows/lib/code-view-apply.js.map +7 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js +164 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js.map +7 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js +72 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js.map +7 -0
- package/dist/modules/workflows/lib/component-guard.js +7 -0
- package/dist/modules/workflows/lib/component-guard.js.map +7 -0
- package/dist/modules/workflows/lib/condition-handler.js +443 -0
- package/dist/modules/workflows/lib/condition-handler.js.map +7 -0
- package/dist/modules/workflows/lib/context-ledger.js +448 -0
- package/dist/modules/workflows/lib/context-ledger.js.map +7 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js +8 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js.map +7 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js +63 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/definition-context-schema.js +56 -0
- package/dist/modules/workflows/lib/definition-context-schema.js.map +7 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js +123 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js.map +7 -0
- package/dist/modules/workflows/lib/definition-error-body.js +33 -0
- package/dist/modules/workflows/lib/definition-error-body.js.map +7 -0
- package/dist/modules/workflows/lib/definition-evaluation.js +79 -0
- package/dist/modules/workflows/lib/definition-evaluation.js.map +7 -0
- package/dist/modules/workflows/lib/definition-grant.js +90 -0
- package/dist/modules/workflows/lib/definition-grant.js.map +7 -0
- package/dist/modules/workflows/lib/definition-json-locations.js +139 -0
- package/dist/modules/workflows/lib/definition-json-locations.js.map +7 -0
- package/dist/modules/workflows/lib/definition-payload.js +31 -0
- package/dist/modules/workflows/lib/definition-payload.js.map +7 -0
- package/dist/modules/workflows/lib/draft-restore.js +49 -0
- package/dist/modules/workflows/lib/draft-restore.js.map +7 -0
- package/dist/modules/workflows/lib/dry-run.js +106 -0
- package/dist/modules/workflows/lib/dry-run.js.map +7 -0
- package/dist/modules/workflows/lib/duration.js +66 -17
- package/dist/modules/workflows/lib/duration.js.map +2 -2
- package/dist/modules/workflows/lib/edge-reattachment.js +79 -0
- package/dist/modules/workflows/lib/edge-reattachment.js.map +7 -0
- package/dist/modules/workflows/lib/edgeFormTransforms.js +7 -11
- package/dist/modules/workflows/lib/edgeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/editor-annotations.js +195 -0
- package/dist/modules/workflows/lib/editor-annotations.js.map +7 -0
- package/dist/modules/workflows/lib/editor-commands.js +103 -0
- package/dist/modules/workflows/lib/editor-commands.js.map +7 -0
- package/dist/modules/workflows/lib/editor-history.js +51 -0
- package/dist/modules/workflows/lib/editor-history.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js +181 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-path.js +90 -0
- package/dist/modules/workflows/lib/endpoint-path.js.map +7 -0
- package/dist/modules/workflows/lib/engine-version.js +42 -0
- package/dist/modules/workflows/lib/engine-version.js.map +7 -0
- package/dist/modules/workflows/lib/error-handler.js +132 -0
- package/dist/modules/workflows/lib/error-handler.js.map +7 -0
- package/dist/modules/workflows/lib/error-routing.js +104 -0
- package/dist/modules/workflows/lib/error-routing.js.map +7 -0
- package/dist/modules/workflows/lib/event-logger.js +23 -0
- package/dist/modules/workflows/lib/event-logger.js.map +2 -2
- package/dist/modules/workflows/lib/expression-refs.js +168 -0
- package/dist/modules/workflows/lib/expression-refs.js.map +7 -0
- package/dist/modules/workflows/lib/failure-grouping.js +62 -0
- package/dist/modules/workflows/lib/failure-grouping.js.map +7 -0
- package/dist/modules/workflows/lib/find-definition.js +1 -0
- package/dist/modules/workflows/lib/find-definition.js.map +2 -2
- package/dist/modules/workflows/lib/flow-logic-warnings.js +338 -0
- package/dist/modules/workflows/lib/flow-logic-warnings.js.map +7 -0
- package/dist/modules/workflows/lib/graph-utils.js +328 -77
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/dist/modules/workflows/lib/icon-search.js +32 -0
- package/dist/modules/workflows/lib/icon-search.js.map +7 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js +26 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js.map +7 -0
- package/dist/modules/workflows/lib/instance-date-filter.js +28 -0
- package/dist/modules/workflows/lib/instance-date-filter.js.map +7 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js +271 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-drag.js +28 -0
- package/dist/modules/workflows/lib/ledger-drag.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js +66 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js +82 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js +110 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js +26 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js +160 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js.map +7 -0
- package/dist/modules/workflows/lib/node-config-summary.js +128 -0
- package/dist/modules/workflows/lib/node-config-summary.js.map +7 -0
- package/dist/modules/workflows/lib/node-geometry.js +53 -0
- package/dist/modules/workflows/lib/node-geometry.js.map +7 -0
- package/dist/modules/workflows/lib/node-nudge.js +44 -0
- package/dist/modules/workflows/lib/node-nudge.js.map +7 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js +88 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js.map +7 -0
- package/dist/modules/workflows/lib/node-placement.js +55 -0
- package/dist/modules/workflows/lib/node-placement.js.map +7 -0
- package/dist/modules/workflows/lib/node-type-icons.js +54 -13
- package/dist/modules/workflows/lib/node-type-icons.js.map +2 -2
- package/dist/modules/workflows/lib/nodeFormTransforms.js +329 -19
- package/dist/modules/workflows/lib/nodeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/outcome-routing.js +158 -0
- package/dist/modules/workflows/lib/outcome-routing.js.map +7 -0
- package/dist/modules/workflows/lib/owned-definition.js +107 -0
- package/dist/modules/workflows/lib/owned-definition.js.map +7 -0
- package/dist/modules/workflows/lib/owned-node-changes.js +10 -0
- package/dist/modules/workflows/lib/owned-node-changes.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drag.js +36 -0
- package/dist/modules/workflows/lib/palette-drag.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drop.js +45 -0
- package/dist/modules/workflows/lib/palette-drop.js.map +7 -0
- package/dist/modules/workflows/lib/parallel-handler.js +57 -2
- package/dist/modules/workflows/lib/parallel-handler.js.map +2 -2
- package/dist/modules/workflows/lib/port-contract.js +54 -0
- package/dist/modules/workflows/lib/port-contract.js.map +7 -0
- package/dist/modules/workflows/lib/portal-task-access.js +89 -0
- package/dist/modules/workflows/lib/portal-task-access.js.map +7 -0
- package/dist/modules/workflows/lib/rerun-from-step.js +65 -0
- package/dist/modules/workflows/lib/rerun-from-step.js.map +7 -0
- package/dist/modules/workflows/lib/route-chip-events.js +23 -0
- package/dist/modules/workflows/lib/route-chip-events.js.map +7 -0
- package/dist/modules/workflows/lib/route-chips.js +91 -0
- package/dist/modules/workflows/lib/route-chips.js.map +7 -0
- package/dist/modules/workflows/lib/route-edge.js +17 -0
- package/dist/modules/workflows/lib/route-edge.js.map +7 -0
- package/dist/modules/workflows/lib/route-kinds.js +67 -0
- package/dist/modules/workflows/lib/route-kinds.js.map +7 -0
- package/dist/modules/workflows/lib/route-priority.js +104 -0
- package/dist/modules/workflows/lib/route-priority.js.map +7 -0
- package/dist/modules/workflows/lib/run-duration.js +44 -0
- package/dist/modules/workflows/lib/run-duration.js.map +7 -0
- package/dist/modules/workflows/lib/run-event-tone.js +25 -0
- package/dist/modules/workflows/lib/run-event-tone.js.map +7 -0
- package/dist/modules/workflows/lib/run-execution.js +305 -0
- package/dist/modules/workflows/lib/run-execution.js.map +7 -0
- package/dist/modules/workflows/lib/run-gantt.js +180 -0
- package/dist/modules/workflows/lib/run-gantt.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js +33 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome.js +48 -0
- package/dist/modules/workflows/lib/run-outcome.js.map +7 -0
- package/dist/modules/workflows/lib/sample-resolver.js +71 -0
- package/dist/modules/workflows/lib/sample-resolver.js.map +7 -0
- package/dist/modules/workflows/lib/seeds.js +1 -1
- package/dist/modules/workflows/lib/seeds.js.map +2 -2
- package/dist/modules/workflows/lib/server-output-contract.js +65 -0
- package/dist/modules/workflows/lib/server-output-contract.js.map +7 -0
- package/dist/modules/workflows/lib/set-variable.js +47 -0
- package/dist/modules/workflows/lib/set-variable.js.map +7 -0
- package/dist/modules/workflows/lib/signal-handler.js +63 -4
- package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
- package/dist/modules/workflows/lib/start-fixtures.js +42 -0
- package/dist/modules/workflows/lib/start-fixtures.js.map +7 -0
- package/dist/modules/workflows/lib/status-colors.js +153 -22
- package/dist/modules/workflows/lib/status-colors.js.map +2 -2
- package/dist/modules/workflows/lib/step-handler.js +529 -53
- package/dist/modules/workflows/lib/step-handler.js.map +3 -3
- package/dist/modules/workflows/lib/step-presentation.js +147 -0
- package/dist/modules/workflows/lib/step-presentation.js.map +7 -0
- package/dist/modules/workflows/lib/step-through.js +26 -0
- package/dist/modules/workflows/lib/step-through.js.map +7 -0
- package/dist/modules/workflows/lib/step-type-conversion.js +167 -0
- package/dist/modules/workflows/lib/step-type-conversion.js.map +7 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js +114 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js.map +7 -0
- package/dist/modules/workflows/lib/task-decision-context.js +38 -0
- package/dist/modules/workflows/lib/task-decision-context.js.map +7 -0
- package/dist/modules/workflows/lib/task-decisions.js +49 -0
- package/dist/modules/workflows/lib/task-decisions.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-access.js +62 -0
- package/dist/modules/workflows/lib/task-entity-access.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js +39 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-types.js +36 -0
- package/dist/modules/workflows/lib/task-entity-types.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-registry.js +33 -0
- package/dist/modules/workflows/lib/task-form-registry.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-schema.js +75 -0
- package/dist/modules/workflows/lib/task-form-schema.js.map +7 -0
- package/dist/modules/workflows/lib/task-handler.js +251 -32
- package/dist/modules/workflows/lib/task-handler.js.map +2 -2
- package/dist/modules/workflows/lib/task-inspector-config.js +182 -0
- package/dist/modules/workflows/lib/task-inspector-config.js.map +7 -0
- package/dist/modules/workflows/lib/task-list-query.js +19 -0
- package/dist/modules/workflows/lib/task-list-query.js.map +7 -0
- package/dist/modules/workflows/lib/task-notifications.js +119 -0
- package/dist/modules/workflows/lib/task-notifications.js.map +7 -0
- package/dist/modules/workflows/lib/task-permission-settings.js +43 -0
- package/dist/modules/workflows/lib/task-permission-settings.js.map +7 -0
- package/dist/modules/workflows/lib/task-presets.js +35 -0
- package/dist/modules/workflows/lib/task-presets.js.map +7 -0
- package/dist/modules/workflows/lib/task-quick-action.js +45 -0
- package/dist/modules/workflows/lib/task-quick-action.js.map +7 -0
- package/dist/modules/workflows/lib/task-resolution.js +120 -0
- package/dist/modules/workflows/lib/task-resolution.js.map +7 -0
- package/dist/modules/workflows/lib/task-sla.js +357 -0
- package/dist/modules/workflows/lib/task-sla.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility-request.js +266 -0
- package/dist/modules/workflows/lib/task-visibility-request.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility.js +194 -0
- package/dist/modules/workflows/lib/task-visibility.js.map +7 -0
- package/dist/modules/workflows/lib/timer-handler.js +3 -1
- package/dist/modules/workflows/lib/timer-handler.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +148 -20
- package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
- package/dist/modules/workflows/lib/trigger-node.js +121 -0
- package/dist/modules/workflows/lib/trigger-node.js.map +7 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js +14 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js +52 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js +63 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js +11 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js +90 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js +118 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/query.js +70 -0
- package/dist/modules/workflows/lib/work-inbox/query.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/service.js +56 -0
- package/dist/modules/workflows/lib/work-inbox/service.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js +149 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js +57 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js +54 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-executor.js +658 -6
- package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-function-registry.js +40 -0
- package/dist/modules/workflows/lib/workflow-function-registry.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-safe-commands.js +11 -1
- package/dist/modules/workflows/lib/workflow-safe-commands.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-templates.js +69 -0
- package/dist/modules/workflows/lib/workflow-templates.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js +17 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js +12 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js.map +7 -0
- package/dist/modules/workflows/notifications.js +38 -10
- package/dist/modules/workflows/notifications.js.map +2 -2
- package/dist/modules/workflows/setup.js +81 -1
- package/dist/modules/workflows/setup.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-assigned-notification.js +19 -27
- package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js.map +7 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js +73 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js +17 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js.map +7 -0
- package/dist/modules/workflows/widgets/injection-table.js +26 -0
- package/dist/modules/workflows/widgets/injection-table.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-activities.worker.js +61 -39
- package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js +40 -0
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js +43 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js +30 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js.map +7 -0
- package/generated/entities/action_log/index.ts +1 -0
- package/generated/entities/user/index.ts +1 -0
- package/generated/entities/user_task/index.ts +7 -0
- package/generated/entities/workflow_definition/index.ts +3 -0
- package/generated/entities/workflow_definition_draft/index.ts +11 -0
- package/generated/entities/workflow_definition_metric_rollup/index.ts +10 -0
- package/generated/entities/workflow_instance/index.ts +2 -0
- package/generated/entities.ids.generated.ts +4 -1
- package/generated/entity-fields-registry.ts +39 -0
- package/jest.setup.ts +13 -0
- package/package.json +8 -7
- package/src/helpers/integration/workflowsFixtures.ts +765 -5
- package/src/helpers/integration/workflowsUi.ts +318 -0
- package/src/modules/attachments/lib/createFromBuffer.ts +120 -0
- package/src/modules/audit_logs/data/entities.ts +12 -0
- package/src/modules/audit_logs/data/validators.ts +1 -0
- package/src/modules/audit_logs/lib/projections.ts +5 -1
- package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +26 -0
- package/src/modules/audit_logs/migrations/Migration20260625120000.ts +15 -0
- package/src/modules/audit_logs/services/actionLogService.ts +3 -0
- package/src/modules/auth/data/entities.ts +21 -0
- package/src/modules/auth/i18n/de.json +31 -0
- package/src/modules/auth/i18n/en.json +31 -0
- package/src/modules/auth/i18n/es.json +31 -0
- package/src/modules/auth/i18n/ko.json +31 -0
- package/src/modules/auth/i18n/pl.json +31 -0
- package/src/modules/auth/lib/executionPrincipal.ts +235 -0
- package/src/modules/auth/migrations/.snapshot-open-mercato.json +16 -0
- package/src/modules/auth/migrations/Migration20260625050000.ts +21 -0
- package/src/modules/business_rules/components/InlineRuleEditor.tsx +231 -0
- package/src/modules/business_rules/data/validators.ts +6 -0
- package/src/modules/business_rules/i18n/de.json +4 -0
- package/src/modules/business_rules/i18n/en.json +4 -0
- package/src/modules/business_rules/i18n/es.json +4 -0
- package/src/modules/business_rules/i18n/ko.json +4 -0
- package/src/modules/business_rules/i18n/pl.json +4 -0
- package/src/modules/business_rules/lib/rule-engine.ts +15 -1
- package/src/modules/catalog/commands/products.ts +12 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/workflows.ts +35 -0
- package/src/modules/customer_accounts/AGENTS.md +11 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +2 -0
- package/src/modules/customer_accounts/cli.ts +96 -0
- package/src/modules/customer_accounts/i18n/de.json +5 -0
- package/src/modules/customer_accounts/i18n/en.json +5 -0
- package/src/modules/customer_accounts/i18n/es.json +5 -0
- package/src/modules/customer_accounts/i18n/ko.json +5 -0
- package/src/modules/customer_accounts/i18n/pl.json +5 -0
- package/src/modules/customer_accounts/lib/customerRoleAclSync.ts +92 -0
- package/src/modules/customer_accounts/setup.ts +15 -3
- package/src/modules/customers/commands/deals.ts +5 -0
- package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +4 -2
- package/src/modules/customers/components/detail/utils.ts +2 -0
- package/src/modules/customers/events.ts +21 -3
- package/src/modules/customers/i18n/de.json +4 -0
- package/src/modules/customers/i18n/en.json +4 -0
- package/src/modules/customers/i18n/es.json +4 -0
- package/src/modules/customers/i18n/ko.json +4 -0
- package/src/modules/customers/i18n/pl.json +4 -0
- package/src/modules/customers/lib/link-workflow-task-handler.ts +136 -0
- package/src/modules/customers/lib/todoCompatibility.ts +4 -1
- package/src/modules/customers/lib/workflowTaskLink.ts +23 -0
- package/src/modules/customers/subscribers/link-workflow-task.ts +19 -0
- package/src/modules/customers/workflows.ts +57 -0
- package/src/modules/entities/api/records.ts +18 -62
- package/src/modules/entities/lib/entityClassification.ts +102 -0
- package/src/modules/sales/commands/documents.ts +46 -0
- package/src/modules/sales/events.ts +20 -2
- package/src/modules/sales/i18n/de.json +2 -1
- package/src/modules/sales/i18n/en.json +2 -1
- package/src/modules/sales/i18n/es.json +2 -1
- package/src/modules/sales/i18n/ko.json +2 -1
- package/src/modules/sales/i18n/pl.json +2 -1
- package/src/modules/sales/workflows.ts +12 -1
- package/src/modules/seeds/README.md +86 -0
- package/src/modules/seeds/cli.ts +220 -0
- package/src/modules/seeds/examples/sample-seed.json +26 -0
- package/src/modules/seeds/index.ts +11 -0
- package/src/modules/workflows/AGENTS.md +851 -10
- package/src/modules/workflows/acl.ts +96 -0
- package/src/modules/workflows/ai-agents.ts +80 -0
- package/src/modules/workflows/ai-tools/authoring-pack.ts +798 -0
- package/src/modules/workflows/ai-tools/types.ts +117 -0
- package/src/modules/workflows/ai-tools.ts +20 -0
- package/src/modules/workflows/api/command-settings/route.ts +171 -0
- package/src/modules/workflows/api/commands/route.ts +109 -0
- package/src/modules/workflows/api/definitions/[id]/callers/route.ts +95 -0
- package/src/modules/workflows/api/definitions/[id]/context-schema/route.ts +187 -0
- package/src/modules/workflows/api/definitions/[id]/customize/route.ts +6 -1
- package/src/modules/workflows/api/definitions/[id]/draft/route.ts +395 -0
- package/src/modules/workflows/api/definitions/[id]/publish/route.ts +250 -0
- package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +5 -0
- package/src/modules/workflows/api/definitions/[id]/route.ts +107 -7
- package/src/modules/workflows/api/definitions/[id]/test-step/route.ts +288 -0
- package/src/modules/workflows/api/definitions/generate/route.ts +335 -0
- package/src/modules/workflows/api/definitions/route.ts +88 -113
- package/src/modules/workflows/api/definitions/serialize.ts +9 -0
- package/src/modules/workflows/api/endpoints/route.ts +88 -0
- package/src/modules/workflows/api/functions/route.ts +91 -0
- package/src/modules/workflows/api/grantable-features/route.ts +102 -0
- package/src/modules/workflows/api/instances/[id]/context/route.ts +214 -0
- package/src/modules/workflows/api/instances/[id]/rerun-step/route.ts +226 -0
- package/src/modules/workflows/api/instances/[id]/retry/route.ts +18 -2
- package/src/modules/workflows/api/instances/[id]/step-through/route.ts +195 -0
- package/src/modules/workflows/api/instances/[id]/steps/route.ts +160 -0
- package/src/modules/workflows/api/instances/[id]/would-do/route.ts +216 -0
- package/src/modules/workflows/api/instances/bulk-replay/route.ts +141 -0
- package/src/modules/workflows/api/instances/failure-queue/route.ts +197 -0
- package/src/modules/workflows/api/instances/route.ts +135 -3
- package/src/modules/workflows/api/metrics/definitions/route.ts +262 -0
- package/src/modules/workflows/api/openapi.ts +549 -2
- package/src/modules/workflows/api/portal/tasks/[id]/complete/route.ts +160 -0
- package/src/modules/workflows/api/portal/tasks/[id]/route.ts +124 -0
- package/src/modules/workflows/api/portal/tasks/route.ts +157 -0
- package/src/modules/workflows/api/rule-usage/route.ts +94 -0
- package/src/modules/workflows/api/task-settings/route.ts +138 -0
- package/src/modules/workflows/api/tasks/[id]/claim/route.ts +42 -17
- package/src/modules/workflows/api/tasks/[id]/complete/route.ts +47 -15
- package/src/modules/workflows/api/tasks/[id]/reassign/route.ts +197 -0
- package/src/modules/workflows/api/tasks/[id]/route.ts +57 -6
- package/src/modules/workflows/api/tasks/[id]/unclaim/route.ts +132 -0
- package/src/modules/workflows/api/tasks/route.ts +60 -5
- package/src/modules/workflows/api/tasks/serialize.ts +119 -0
- package/src/modules/workflows/api/templates/route.ts +87 -0
- package/src/modules/workflows/api/work-inbox/next/route.ts +170 -0
- package/src/modules/workflows/api/work-inbox/route.ts +153 -0
- package/src/modules/workflows/backend/config/workflows/page.meta.ts +33 -0
- package/src/modules/workflows/backend/config/workflows/page.tsx +12 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +19 -343
- package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/create/page.tsx +19 -59
- package/src/modules/workflows/backend/definitions/page.tsx +156 -76
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +3129 -584
- package/src/modules/workflows/backend/instances/[id]/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/[id]/page.tsx +711 -539
- package/src/modules/workflows/backend/instances/failure-queue/page.meta.ts +16 -0
- package/src/modules/workflows/backend/instances/failure-queue/page.tsx +311 -0
- package/src/modules/workflows/backend/instances/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/page.tsx +218 -38
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +639 -400
- package/src/modules/workflows/backend/tasks/page.meta.ts +7 -0
- package/src/modules/workflows/backend/tasks/page.tsx +20 -333
- package/src/modules/workflows/backend/work-inbox/page.meta.ts +15 -0
- package/src/modules/workflows/backend/work-inbox/page.tsx +506 -0
- package/src/modules/workflows/cli.ts +1 -1
- package/src/modules/workflows/commands/tasks.ts +146 -0
- package/src/modules/workflows/components/ActivitiesEditor.tsx +91 -114
- package/src/modules/workflows/components/ActivityEditDialog.tsx +244 -0
- package/src/modules/workflows/components/AgentSelector.tsx +200 -0
- package/src/modules/workflows/components/AnnotationEditDialog.tsx +157 -0
- package/src/modules/workflows/components/BusinessRuleUsagePanel.tsx +106 -0
- package/src/modules/workflows/components/BusinessRulesSelector.tsx +71 -17
- package/src/modules/workflows/components/ConfigJsonTextarea.tsx +111 -0
- package/src/modules/workflows/components/ContextSchemaEditor.tsx +165 -0
- package/src/modules/workflows/components/DefinitionErrorHandlerField.tsx +133 -0
- package/src/modules/workflows/components/DefinitionMetadataDrawer.tsx +456 -0
- package/src/modules/workflows/components/DefinitionMetricsCells.tsx +212 -0
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +196 -95
- package/src/modules/workflows/components/EdgeEditDialog.tsx +15 -16
- package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +130 -80
- package/src/modules/workflows/components/InputDataPanel.tsx +177 -0
- package/src/modules/workflows/components/InspectorPanel.tsx +250 -0
- package/src/modules/workflows/components/NodeEditDialog.tsx +444 -38
- package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +848 -178
- package/src/modules/workflows/components/StepsEditor.tsx +9 -2
- package/src/modules/workflows/components/TemplateGalleryDialog.tsx +205 -0
- package/src/modules/workflows/components/TransitionsEditor.tsx +98 -89
- package/src/modules/workflows/components/TriggersDialog.tsx +83 -0
- package/src/modules/workflows/components/TriggersEditor.tsx +363 -0
- package/src/modules/workflows/components/WorkflowAiDraftDialog.tsx +383 -0
- package/src/modules/workflows/components/WorkflowCodeView.tsx +257 -0
- package/src/modules/workflows/components/WorkflowCommandPalette.tsx +82 -0
- package/src/modules/workflows/components/WorkflowCompensationGhostEdge.tsx +78 -0
- package/src/modules/workflows/components/WorkflowDataMappingEdge.tsx +46 -0
- package/src/modules/workflows/components/WorkflowGraph.tsx +54 -1
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +463 -37
- package/src/modules/workflows/components/WorkflowIconPicker.tsx +144 -0
- package/src/modules/workflows/components/WorkflowLegend.tsx +59 -33
- package/src/modules/workflows/components/WorkflowNodeCard.tsx +355 -28
- package/src/modules/workflows/components/WorkflowRouteChips.tsx +145 -0
- package/src/modules/workflows/components/WorkflowSelector.tsx +33 -14
- package/src/modules/workflows/components/WorkflowTransitionEdge.tsx +83 -10
- package/src/modules/workflows/components/WorkflowTransitionLabel.tsx +13 -2
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +120 -30
- package/src/modules/workflows/components/fields/ActivityConfigFields.tsx +675 -0
- package/src/modules/workflows/components/fields/ActivityTestPanel.tsx +250 -0
- package/src/modules/workflows/components/fields/AgentInvokeConfigField.tsx +580 -0
- package/src/modules/workflows/components/fields/AgentReviewOnBreachField.tsx +88 -0
- package/src/modules/workflows/components/fields/BranchingRoutesEditor.tsx +323 -0
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +36 -4
- package/src/modules/workflows/components/fields/CommandPicker.tsx +158 -0
- package/src/modules/workflows/components/fields/EndpointPicker.tsx +330 -0
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/FunctionPicker.tsx +68 -0
- package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +46 -12
- package/src/modules/workflows/components/fields/PortFieldArrayEditor.tsx +255 -0
- package/src/modules/workflows/components/fields/RolesMultiSelect.tsx +68 -0
- package/src/modules/workflows/components/fields/RouteOrderEditor.tsx +169 -0
- package/src/modules/workflows/components/fields/SchemaBuilderDialog.tsx +139 -0
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/TaskAssignmentField.tsx +355 -0
- package/src/modules/workflows/components/fields/TaskDeadlineFields.tsx +172 -0
- package/src/modules/workflows/components/fields/TaskDecisionsField.tsx +294 -0
- package/src/modules/workflows/components/fields/TaskEntityBindingsField.tsx +156 -0
- package/src/modules/workflows/components/fields/TemplateTextControl.tsx +85 -0
- package/src/modules/workflows/components/fields/VariablePickerButton.tsx +177 -0
- package/src/modules/workflows/components/fields/ledgerDropTarget.ts +55 -0
- package/src/modules/workflows/components/fields/useActivityTypeOptions.ts +19 -0
- package/src/modules/workflows/components/formConfig.tsx +84 -10
- package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +5 -0
- package/src/modules/workflows/components/mobile/MobileMetadataSheet.tsx +10 -0
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +55 -19
- package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +49 -40
- package/src/modules/workflows/components/nodes/AnnotationGroupNode.tsx +81 -0
- package/src/modules/workflows/components/nodes/AutomatedNode.tsx +34 -17
- package/src/modules/workflows/components/nodes/EndNode.tsx +15 -14
- package/src/modules/workflows/components/nodes/ErrorOutputHandle.tsx +32 -0
- package/src/modules/workflows/components/nodes/IfElseNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/InvokeAgentNode.tsx +180 -0
- package/src/modules/workflows/components/nodes/NodeOutcomeRows.tsx +143 -0
- package/src/modules/workflows/components/nodes/ParallelForkNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/ParallelJoinNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/StartNode.tsx +78 -18
- package/src/modules/workflows/components/nodes/StickyNoteNode.tsx +65 -0
- package/src/modules/workflows/components/nodes/SubWorkflowNode.tsx +124 -23
- package/src/modules/workflows/components/nodes/SwitchNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/TriggerCap.tsx +103 -0
- package/src/modules/workflows/components/nodes/TriggerNode.tsx +151 -0
- package/src/modules/workflows/components/nodes/UserTaskNode.tsx +67 -22
- package/src/modules/workflows/components/nodes/WaitForConditionNode.tsx +74 -0
- package/src/modules/workflows/components/nodes/WaitForSignalNode.tsx +31 -17
- package/src/modules/workflows/components/nodes/WaitForTimerNode.tsx +31 -16
- package/src/modules/workflows/components/nodes/index.ts +17 -0
- package/src/modules/workflows/components/portal/PortalTaskForm.tsx +280 -0
- package/src/modules/workflows/components/run/AgentActivityPanel.tsx +48 -0
- package/src/modules/workflows/components/run/RerunStepDialog.tsx +133 -0
- package/src/modules/workflows/components/run/RunEventBadge.tsx +37 -0
- package/src/modules/workflows/components/run/RunGantt.tsx +180 -0
- package/src/modules/workflows/components/run/RunStatusBadge.tsx +112 -0
- package/src/modules/workflows/components/run/RunStepInspector.tsx +176 -0
- package/src/modules/workflows/components/run/WouldDoReport.tsx +93 -0
- package/src/modules/workflows/components/run/useAgentLabels.ts +42 -0
- package/src/modules/workflows/components/run/useLastRunOverlay.ts +150 -0
- package/src/modules/workflows/components/run/useLiveAgentActions.ts +70 -0
- package/src/modules/workflows/components/run/useLiveRunUpdates.ts +89 -0
- package/src/modules/workflows/components/settings/CommandSettingsPageClient.tsx +228 -0
- package/src/modules/workflows/components/work-inbox/EntityContextPanel.tsx +179 -0
- package/src/modules/workflows/components/work-inbox/ReassignTaskDialog.tsx +203 -0
- package/src/modules/workflows/components/work-inbox/StatusChip.tsx +61 -0
- package/src/modules/workflows/components/work-inbox/TaskActionNotice.tsx +77 -0
- package/src/modules/workflows/components/work-inbox/TaskFormFields.tsx +322 -0
- package/src/modules/workflows/components/work-inbox/WorkInboxEmptyState.tsx +43 -0
- package/src/modules/workflows/data/activity-config-schemas.ts +249 -0
- package/src/modules/workflows/data/activity-config-warnings.ts +71 -0
- package/src/modules/workflows/data/branching-route-warnings.ts +129 -0
- package/src/modules/workflows/data/entities.ts +397 -4
- package/src/modules/workflows/data/metrics-validators.ts +51 -0
- package/src/modules/workflows/data/task-primitives.ts +36 -0
- package/src/modules/workflows/data/types.ts +81 -2
- package/src/modules/workflows/data/validators.ts +729 -60
- package/src/modules/workflows/di.ts +22 -0
- package/src/modules/workflows/events.ts +68 -8
- package/src/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/src/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/src/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/src/modules/workflows/examples/templates/order-approval.json +230 -0
- package/src/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/src/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/src/modules/workflows/extension-points.ts +1 -1
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.ts +21 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.tsx +212 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.ts +25 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.tsx +185 -0
- package/src/modules/workflows/i18n/de.json +1083 -24
- package/src/modules/workflows/i18n/en.json +1081 -22
- package/src/modules/workflows/i18n/es.json +1083 -24
- package/src/modules/workflows/i18n/ko.json +1072 -13
- package/src/modules/workflows/i18n/pl.json +1082 -23
- package/src/modules/workflows/lib/activity-executor.ts +855 -186
- package/src/modules/workflows/lib/activity-queue-types.ts +120 -1
- package/src/modules/workflows/lib/activity-registry-bootstrap.ts +7 -0
- package/src/modules/workflows/lib/activity-registry.ts +89 -0
- package/src/modules/workflows/lib/activity-types.ts +415 -0
- package/src/modules/workflows/lib/activity-worker-handler.ts +744 -35
- package/src/modules/workflows/lib/advanced-config.ts +41 -0
- package/src/modules/workflows/lib/agent-disposition-task.ts +343 -0
- package/src/modules/workflows/lib/agent-outcome-paths.ts +153 -0
- package/src/modules/workflows/lib/agent-result-mapping.ts +88 -0
- package/src/modules/workflows/lib/agent-review-inspector.ts +125 -0
- package/src/modules/workflows/lib/agent-review.ts +171 -0
- package/src/modules/workflows/lib/ai-authoring.ts +402 -0
- package/src/modules/workflows/lib/ai-draft-runner.ts +105 -0
- package/src/modules/workflows/lib/annotation-events.ts +15 -0
- package/src/modules/workflows/lib/branching-routes.ts +280 -0
- package/src/modules/workflows/lib/breach-routing.ts +142 -0
- package/src/modules/workflows/lib/bulk-replay.ts +185 -0
- package/src/modules/workflows/lib/business-rule-usage.ts +154 -0
- package/src/modules/workflows/lib/caller-graph.ts +104 -0
- package/src/modules/workflows/lib/code-view-apply.ts +178 -0
- package/src/modules/workflows/lib/collect-validation-issues.ts +239 -0
- package/src/modules/workflows/lib/compensation-ghosts.ts +134 -0
- package/src/modules/workflows/lib/component-guard.ts +13 -0
- package/src/modules/workflows/lib/condition-handler.ts +658 -0
- package/src/modules/workflows/lib/context-ledger.ts +814 -0
- package/src/modules/workflows/lib/crud-form-dialogs-flag.ts +5 -0
- package/src/modules/workflows/lib/data-edge-mapping.ts +112 -0
- package/src/modules/workflows/lib/definition-context-schema.ts +103 -0
- package/src/modules/workflows/lib/definition-edit-safety.ts +228 -0
- package/src/modules/workflows/lib/definition-error-body.ts +43 -0
- package/src/modules/workflows/lib/definition-evaluation.ts +156 -0
- package/src/modules/workflows/lib/definition-grant.ts +211 -0
- package/src/modules/workflows/lib/definition-json-locations.ts +226 -0
- package/src/modules/workflows/lib/definition-payload.ts +81 -0
- package/src/modules/workflows/lib/draft-restore.ts +72 -0
- package/src/modules/workflows/lib/dry-run.ts +203 -0
- package/src/modules/workflows/lib/duration.ts +138 -24
- package/src/modules/workflows/lib/edge-reattachment.ts +186 -0
- package/src/modules/workflows/lib/edgeFormTransforms.ts +15 -14
- package/src/modules/workflows/lib/editor-annotations.ts +301 -0
- package/src/modules/workflows/lib/editor-commands.ts +205 -0
- package/src/modules/workflows/lib/editor-history.ts +151 -0
- package/src/modules/workflows/lib/endpoint-catalog.ts +283 -0
- package/src/modules/workflows/lib/endpoint-path.ts +134 -0
- package/src/modules/workflows/lib/engine-version.ts +67 -0
- package/src/modules/workflows/lib/error-handler.ts +192 -0
- package/src/modules/workflows/lib/error-routing.ts +236 -0
- package/src/modules/workflows/lib/event-logger.ts +27 -0
- package/src/modules/workflows/lib/expression-refs.ts +291 -0
- package/src/modules/workflows/lib/failure-grouping.ts +134 -0
- package/src/modules/workflows/lib/find-definition.ts +4 -0
- package/src/modules/workflows/lib/flow-logic-warnings.ts +591 -0
- package/src/modules/workflows/lib/graph-utils.ts +620 -110
- package/src/modules/workflows/lib/icon-search.ts +65 -0
- package/src/modules/workflows/lib/insert-at-cursor.ts +53 -0
- package/src/modules/workflows/lib/instance-date-filter.ts +56 -0
- package/src/modules/workflows/lib/interpolation-pipeline.ts +351 -0
- package/src/modules/workflows/lib/ledger-drag.ts +61 -0
- package/src/modules/workflows/lib/ledger-entry-display.ts +89 -0
- package/src/modules/workflows/lib/ledger-schema-flatten.ts +137 -0
- package/src/modules/workflows/lib/metrics/definition-metrics.ts +268 -0
- package/src/modules/workflows/lib/metrics/metrics-display.ts +57 -0
- package/src/modules/workflows/lib/metrics/rollup-schedule.ts +26 -0
- package/src/modules/workflows/lib/metrics/rollup-service.ts +292 -0
- package/src/modules/workflows/lib/node-config-summary.ts +235 -0
- package/src/modules/workflows/lib/node-geometry.ts +168 -0
- package/src/modules/workflows/lib/node-nudge.ts +63 -0
- package/src/modules/workflows/lib/node-outcome-rows.ts +195 -0
- package/src/modules/workflows/lib/node-placement.ts +104 -0
- package/src/modules/workflows/lib/node-type-icons.ts +71 -10
- package/src/modules/workflows/lib/nodeFormTransforms.ts +519 -28
- package/src/modules/workflows/lib/outcome-routing.ts +346 -0
- package/src/modules/workflows/lib/owned-definition.ts +188 -0
- package/src/modules/workflows/lib/owned-node-changes.ts +29 -0
- package/src/modules/workflows/lib/palette-drag.ts +68 -0
- package/src/modules/workflows/lib/palette-drop.ts +114 -0
- package/src/modules/workflows/lib/parallel-handler.ts +79 -2
- package/src/modules/workflows/lib/port-contract.ts +107 -0
- package/src/modules/workflows/lib/portal-task-access.ts +220 -0
- package/src/modules/workflows/lib/rerun-from-step.ts +140 -0
- package/src/modules/workflows/lib/route-chip-events.ts +45 -0
- package/src/modules/workflows/lib/route-chips.ts +177 -0
- package/src/modules/workflows/lib/route-edge.ts +57 -0
- package/src/modules/workflows/lib/route-kinds.ts +166 -0
- package/src/modules/workflows/lib/route-priority.ts +197 -0
- package/src/modules/workflows/lib/run-duration.ts +70 -0
- package/src/modules/workflows/lib/run-event-tone.ts +46 -0
- package/src/modules/workflows/lib/run-execution.ts +598 -0
- package/src/modules/workflows/lib/run-gantt.ts +311 -0
- package/src/modules/workflows/lib/run-outcome-evidence.ts +60 -0
- package/src/modules/workflows/lib/run-outcome.ts +142 -0
- package/src/modules/workflows/lib/sample-resolver.ts +113 -0
- package/src/modules/workflows/lib/seeds.ts +3 -1
- package/src/modules/workflows/lib/server-output-contract.ts +120 -0
- package/src/modules/workflows/lib/set-variable.ts +94 -0
- package/src/modules/workflows/lib/signal-handler.ts +134 -4
- package/src/modules/workflows/lib/start-fixtures.ts +93 -0
- package/src/modules/workflows/lib/status-colors.ts +220 -21
- package/src/modules/workflows/lib/step-handler.ts +744 -68
- package/src/modules/workflows/lib/step-presentation.ts +295 -0
- package/src/modules/workflows/lib/step-through.ts +71 -0
- package/src/modules/workflows/lib/step-type-conversion.ts +263 -0
- package/src/modules/workflows/lib/subgraph-clipboard.ts +214 -0
- package/src/modules/workflows/lib/task-decision-context.ts +76 -0
- package/src/modules/workflows/lib/task-decisions.ts +117 -0
- package/src/modules/workflows/lib/task-entity-access.ts +181 -0
- package/src/modules/workflows/lib/task-entity-aliases.ts +77 -0
- package/src/modules/workflows/lib/task-entity-types.ts +66 -0
- package/src/modules/workflows/lib/task-form-registry.ts +123 -0
- package/src/modules/workflows/lib/task-form-schema.ts +129 -0
- package/src/modules/workflows/lib/task-handler.ts +492 -51
- package/src/modules/workflows/lib/task-inspector-config.ts +348 -0
- package/src/modules/workflows/lib/task-list-query.ts +46 -0
- package/src/modules/workflows/lib/task-notifications.ts +218 -0
- package/src/modules/workflows/lib/task-permission-settings.ts +117 -0
- package/src/modules/workflows/lib/task-presets.ts +95 -0
- package/src/modules/workflows/lib/task-quick-action.ts +111 -0
- package/src/modules/workflows/lib/task-resolution.ts +270 -0
- package/src/modules/workflows/lib/task-sla.ts +628 -0
- package/src/modules/workflows/lib/task-visibility-request.ts +668 -0
- package/src/modules/workflows/lib/task-visibility.ts +627 -0
- package/src/modules/workflows/lib/timer-handler.ts +8 -1
- package/src/modules/workflows/lib/transition-handler.ts +228 -20
- package/src/modules/workflows/lib/trigger-node.ts +272 -0
- package/src/modules/workflows/lib/visual-editor-navigation.ts +29 -0
- package/src/modules/workflows/lib/work-inbox/empty-state.ts +150 -0
- package/src/modules/workflows/lib/work-inbox/entity-links.ts +99 -0
- package/src/modules/workflows/lib/work-inbox/navigation.ts +28 -0
- package/src/modules/workflows/lib/work-inbox/presentation.ts +163 -0
- package/src/modules/workflows/lib/work-inbox/provider.ts +390 -0
- package/src/modules/workflows/lib/work-inbox/query.ts +103 -0
- package/src/modules/workflows/lib/work-inbox/service.ts +122 -0
- package/src/modules/workflows/lib/work-inbox/user-task-source.ts +240 -0
- package/src/modules/workflows/lib/workflow-command-enablement.ts +188 -0
- package/src/modules/workflows/lib/workflow-command-settings.ts +124 -0
- package/src/modules/workflows/lib/workflow-executor.ts +1036 -10
- package/src/modules/workflows/lib/workflow-function-registry.ts +44 -0
- package/src/modules/workflows/lib/workflow-safe-commands.ts +42 -1
- package/src/modules/workflows/lib/workflow-templates.ts +91 -0
- package/src/modules/workflows/migrations/.snapshot-open-mercato.json +2321 -698
- package/src/modules/workflows/migrations/Migration20260626214855_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260626222424_workflows.ts +17 -0
- package/src/modules/workflows/migrations/Migration20260727074335_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260728104038_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260728163001_workflows.ts +36 -0
- package/src/modules/workflows/migrations/Migration20260729061736_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260729192652_workflows.ts +11 -0
- package/src/modules/workflows/migrations/Migration20260730085000_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260730092706_workflows.ts +13 -0
- package/src/modules/workflows/notifications.ts +40 -10
- package/src/modules/workflows/setup.ts +128 -0
- package/src/modules/workflows/subscribers/task-assigned-notification.ts +36 -45
- package/src/modules/workflows/subscribers/task-deadline-breached-notification.ts +31 -0
- package/src/modules/workflows/subscribers/task-reminder-notification.ts +31 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.client.tsx +119 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.ts +27 -0
- package/src/modules/workflows/widgets/injection-table.ts +52 -2
- package/src/modules/workflows/workers/workflow-activities.worker.ts +95 -42
- package/src/modules/workflows/workers/workflow-definition-metric-rollup.worker.ts +71 -0
- package/src/modules/workflows/workers/workflow-instance-bulk-replay.ts +51 -0
- package/src/modules/workflows/workers/workflow-invoke-agent.worker.ts +72 -0
|
@@ -11,16 +11,48 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { EntityManager, LockMode } from '@mikro-orm/core'
|
|
14
|
+
import type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'
|
|
14
15
|
import type { AwilixContainer } from 'awilix'
|
|
16
|
+
import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
15
17
|
import {
|
|
16
18
|
WorkflowDefinition,
|
|
17
19
|
WorkflowInstance,
|
|
18
20
|
WorkflowEvent,
|
|
19
21
|
type WorkflowInstanceStatus,
|
|
22
|
+
type WorkflowInstanceErrorHandlerMetadata,
|
|
20
23
|
} from '../data/entities'
|
|
21
24
|
import { compensateWorkflow } from './compensation-handler'
|
|
25
|
+
import { WORKFLOW_ENGINE_VERSION, isEngineVersionSupported } from './engine-version'
|
|
26
|
+
import {
|
|
27
|
+
WORKFLOW_ERROR_CONTEXT_KEY,
|
|
28
|
+
buildErrorContextEntry,
|
|
29
|
+
} from './error-routing'
|
|
30
|
+
import { excludeNonNormalTransitions } from './route-kinds'
|
|
31
|
+
import {
|
|
32
|
+
WORKFLOW_AGENT_OUTCOME_CONTEXT_KEY,
|
|
33
|
+
readAgentOutcomeMarker,
|
|
34
|
+
resolveAgentOutcomeHandling,
|
|
35
|
+
type OutcomeRoutingDefinitionLike,
|
|
36
|
+
type WorkflowAgentOutcomeContextEntry,
|
|
37
|
+
} from './outcome-routing'
|
|
38
|
+
import { scheduleWorkflowErrorHandler } from './error-handler'
|
|
39
|
+
import { resolveRunOutcome } from './run-outcome'
|
|
40
|
+
import { collectRunOutcomeEvidence } from './run-outcome-evidence'
|
|
22
41
|
import { findWorkflowDefinition, findDefinitionForInstance } from './find-definition'
|
|
42
|
+
import { resolveWorkflowDefinitionExecutionUserId } from './definition-grant'
|
|
23
43
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
44
|
+
import { emitWorkflowsEvent } from '../events'
|
|
45
|
+
import { DRY_RUN_EVENT_TYPES } from './dry-run'
|
|
46
|
+
import {
|
|
47
|
+
STEP_THROUGH_EVENT_TYPE,
|
|
48
|
+
consumeStepThroughRelease,
|
|
49
|
+
isStepThroughArmed,
|
|
50
|
+
shouldPauseForStepThrough,
|
|
51
|
+
} from './step-through'
|
|
52
|
+
import type {
|
|
53
|
+
WorkflowActivityJob,
|
|
54
|
+
WorkflowActivityJobResumeSubWorkflowParent,
|
|
55
|
+
} from './activity-queue-types'
|
|
24
56
|
|
|
25
57
|
const logger = createLogger('workflows')
|
|
26
58
|
|
|
@@ -38,13 +70,33 @@ export interface StartWorkflowOptions {
|
|
|
38
70
|
entityId?: string
|
|
39
71
|
initiatedBy?: string
|
|
40
72
|
labels?: Record<string, string>
|
|
73
|
+
// Set by the workflow-level error handler when it starts a handler run, so
|
|
74
|
+
// the depth guard travels with the child instance (spec 5.9).
|
|
75
|
+
errorHandler?: WorkflowInstanceErrorHandlerMetadata | null
|
|
41
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Run this instance as a side-effect-free simulation (spec section 8.2).
|
|
79
|
+
*
|
|
80
|
+
* It is durable state on the row rather than a per-call argument because a
|
|
81
|
+
* run outlives the call that started it: it parks on a signal, resumes from a
|
|
82
|
+
* worker, is advanced by a task completion. Anything that only lived on this
|
|
83
|
+
* options object would stop protecting the run the moment it suspended.
|
|
84
|
+
*/
|
|
85
|
+
isDryRun?: boolean
|
|
42
86
|
tenantId: string
|
|
43
87
|
organizationId: string
|
|
44
88
|
}
|
|
45
89
|
|
|
46
90
|
export interface ExecutionContext {
|
|
47
91
|
userId?: string
|
|
92
|
+
/**
|
|
93
|
+
* @deprecated Never read, and never was. Dry-run state lives on
|
|
94
|
+
* `WorkflowInstance.isDryRun` (spec section 8.2) because a per-execution flag
|
|
95
|
+
* cannot survive the instance parking on a signal and resuming inside a
|
|
96
|
+
* worker — which is exactly when a leak would happen. Kept as an inert field
|
|
97
|
+
* for one minor per `BACKWARD_COMPATIBILITY.md`; pass `isDryRun` to
|
|
98
|
+
* `startWorkflow` instead.
|
|
99
|
+
*/
|
|
48
100
|
dryRun?: boolean
|
|
49
101
|
timeout?: number
|
|
50
102
|
}
|
|
@@ -82,6 +134,30 @@ function resolveWorkflowExecutionUserId(
|
|
|
82
134
|
)
|
|
83
135
|
}
|
|
84
136
|
|
|
137
|
+
/**
|
|
138
|
+
* The identity this run advances under.
|
|
139
|
+
*
|
|
140
|
+
* A definition declaring `grantedFeatures` ALWAYS acts as its own least-
|
|
141
|
+
* privilege principal, so a run started by an admin cannot silently gain the
|
|
142
|
+
* admin's powers and an event-triggered run (which has no actor at all) gets a
|
|
143
|
+
* real one. Everything else keeps the historic borrow-the-starting-user
|
|
144
|
+
* behaviour, byte-for-byte.
|
|
145
|
+
*/
|
|
146
|
+
async function resolveRunActorUserId(
|
|
147
|
+
em: EntityManager,
|
|
148
|
+
definition: WorkflowDefinition,
|
|
149
|
+
context: ExecutionContext | undefined,
|
|
150
|
+
instance: WorkflowInstance,
|
|
151
|
+
): Promise<string | undefined> {
|
|
152
|
+
const fallback = resolveWorkflowExecutionUserId(context, instance)
|
|
153
|
+
const actor = await resolveWorkflowDefinitionExecutionUserId(
|
|
154
|
+
em as unknown as PostgreSqlEntityManager,
|
|
155
|
+
definition,
|
|
156
|
+
fallback,
|
|
157
|
+
)
|
|
158
|
+
return actor ?? undefined
|
|
159
|
+
}
|
|
160
|
+
|
|
85
161
|
export class WorkflowExecutionError extends Error {
|
|
86
162
|
constructor(
|
|
87
163
|
message: string,
|
|
@@ -115,6 +191,7 @@ export async function startWorkflow(
|
|
|
115
191
|
initialContext = {},
|
|
116
192
|
correlationKey,
|
|
117
193
|
metadata,
|
|
194
|
+
isDryRun = false,
|
|
118
195
|
tenantId,
|
|
119
196
|
organizationId,
|
|
120
197
|
} = options
|
|
@@ -143,6 +220,18 @@ export async function startWorkflow(
|
|
|
143
220
|
)
|
|
144
221
|
}
|
|
145
222
|
|
|
223
|
+
// Forward-compatibility guard: a definition authored against a newer engine
|
|
224
|
+
// is refused outright rather than executed with unknown step types treated
|
|
225
|
+
// as no-ops (spec section 5.8).
|
|
226
|
+
const minEngineVersion = definition.metadata?.minEngineVersion
|
|
227
|
+
if (!isEngineVersionSupported(minEngineVersion)) {
|
|
228
|
+
throw new WorkflowExecutionError(
|
|
229
|
+
`Workflow definition requires engine version ${minEngineVersion}, this engine is version ${WORKFLOW_ENGINE_VERSION}`,
|
|
230
|
+
'ENGINE_VERSION_TOO_OLD',
|
|
231
|
+
{ workflowId, version: definition.version, minEngineVersion, engineVersion: WORKFLOW_ENGINE_VERSION }
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
146
235
|
// Validate definition has required steps
|
|
147
236
|
const { steps, transitions } = definition.definition
|
|
148
237
|
if (!steps || steps.length < 2) {
|
|
@@ -209,6 +298,7 @@ export async function startWorkflow(
|
|
|
209
298
|
metadata,
|
|
210
299
|
startedAt: now,
|
|
211
300
|
retryCount: 0,
|
|
301
|
+
isDryRun,
|
|
212
302
|
tenantId,
|
|
213
303
|
organizationId,
|
|
214
304
|
createdAt: now,
|
|
@@ -233,6 +323,20 @@ export async function startWorkflow(
|
|
|
233
323
|
organizationId,
|
|
234
324
|
})
|
|
235
325
|
|
|
326
|
+
if (isDryRun) {
|
|
327
|
+
await logWorkflowEvent(em, {
|
|
328
|
+
workflowInstanceId: instance.id,
|
|
329
|
+
eventType: DRY_RUN_EVENT_TYPES.started,
|
|
330
|
+
eventData: { workflowId: instance.workflowId, version: instance.version },
|
|
331
|
+
userId: metadata?.initiatedBy,
|
|
332
|
+
tenantId,
|
|
333
|
+
organizationId,
|
|
334
|
+
})
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
await emitInstanceLifecycleEvent(instance, 'workflows.instance.created')
|
|
338
|
+
await emitInstanceLifecycleEvent(instance, 'workflows.instance.started')
|
|
339
|
+
|
|
236
340
|
return instance
|
|
237
341
|
}
|
|
238
342
|
|
|
@@ -308,7 +412,7 @@ export async function executeWorkflow(
|
|
|
308
412
|
|
|
309
413
|
const maxIterations = 100
|
|
310
414
|
let iterations = 0
|
|
311
|
-
const executionUserId =
|
|
415
|
+
const executionUserId = await resolveRunActorUserId(trx, definition, context, instance)
|
|
312
416
|
|
|
313
417
|
while (iterations < maxIterations) {
|
|
314
418
|
iterations++
|
|
@@ -359,10 +463,64 @@ export async function executeWorkflow(
|
|
|
359
463
|
}
|
|
360
464
|
}
|
|
361
465
|
|
|
466
|
+
// Defense in depth: a prior step parked the instance (e.g. an
|
|
467
|
+
// INVOKE_AGENT AUTOMATED step set PAUSED, or a transition set
|
|
468
|
+
// WAITING_FOR_ACTIVITIES). Every resume path (sendSignal,
|
|
469
|
+
// resumeWorkflowAfterActivities) flips status back to RUNNING before
|
|
470
|
+
// re-entering, so a PAUSED/WAITING_FOR_ACTIVITIES status here means an
|
|
471
|
+
// external completion is still pending — stop advancing.
|
|
472
|
+
if (currentInstance.status === 'PAUSED' || currentInstance.status === 'WAITING_FOR_ACTIVITIES') {
|
|
473
|
+
return {
|
|
474
|
+
status: 'RUNNING',
|
|
475
|
+
currentStep: currentInstance.currentStepId,
|
|
476
|
+
context: currentInstance.context,
|
|
477
|
+
events,
|
|
478
|
+
executionTime: Date.now() - startTime,
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
362
482
|
const currentStep = definition.definition.steps.find(
|
|
363
483
|
(s: any) => s.stepId === currentInstance.currentStepId
|
|
364
484
|
)
|
|
365
485
|
|
|
486
|
+
// Step-through (spec section 8.2). An instance-level PAUSED between
|
|
487
|
+
// steps — no new instance status and no new step status, so the state
|
|
488
|
+
// machines are untouched. The marker is a RELEASE TOKEN for exactly one
|
|
489
|
+
// step id, so replaying this loop after a crash cannot run a step the
|
|
490
|
+
// author never released, and a double Continue cannot run two.
|
|
491
|
+
if (
|
|
492
|
+
shouldPauseForStepThrough(
|
|
493
|
+
currentInstance,
|
|
494
|
+
currentInstance.currentStepId,
|
|
495
|
+
currentStep?.stepType
|
|
496
|
+
)
|
|
497
|
+
) {
|
|
498
|
+
await pauseForStepThrough(trx, currentInstance)
|
|
499
|
+
events.push({
|
|
500
|
+
eventType: STEP_THROUGH_EVENT_TYPE,
|
|
501
|
+
occurredAt: new Date(),
|
|
502
|
+
data: { stepId: currentInstance.currentStepId },
|
|
503
|
+
})
|
|
504
|
+
return {
|
|
505
|
+
status: 'RUNNING',
|
|
506
|
+
currentStep: currentInstance.currentStepId,
|
|
507
|
+
context: currentInstance.context,
|
|
508
|
+
events,
|
|
509
|
+
executionTime: Date.now() - startTime,
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
if (isStepThroughArmed(currentInstance)) {
|
|
514
|
+
// The released step is about to run: burn the token now so the cursor
|
|
515
|
+
// landing on the NEXT step pauses, whatever route it takes.
|
|
516
|
+
currentInstance.metadata = {
|
|
517
|
+
...(currentInstance.metadata || {}),
|
|
518
|
+
stepThrough: consumeStepThroughRelease(),
|
|
519
|
+
}
|
|
520
|
+
currentInstance.updatedAt = new Date()
|
|
521
|
+
await trx.flush()
|
|
522
|
+
}
|
|
523
|
+
|
|
366
524
|
if (currentStep?.stepType === 'END') {
|
|
367
525
|
await completeWorkflow(trx, container, instanceId, 'COMPLETED')
|
|
368
526
|
events.push({
|
|
@@ -393,7 +551,67 @@ export async function executeWorkflow(
|
|
|
393
551
|
}
|
|
394
552
|
}
|
|
395
553
|
|
|
396
|
-
|
|
554
|
+
// Outcome routing (spec 7.2). An agent step that resolved a disposition
|
|
555
|
+
// leaves an engine-owned marker; a wired outcome route is followed
|
|
556
|
+
// declaratively instead of via a condition matching a context string.
|
|
557
|
+
// `default` — the marker's absence, or a step that wired no outcome at
|
|
558
|
+
// all — falls straight through to the normal routing below, which is the
|
|
559
|
+
// whole of the backward-compatibility guarantee.
|
|
560
|
+
const outcomeMarker = readAgentOutcomeMarker(
|
|
561
|
+
currentInstance.context,
|
|
562
|
+
currentInstance.currentStepId ?? '',
|
|
563
|
+
)
|
|
564
|
+
if (outcomeMarker) {
|
|
565
|
+
const dispatched = await dispatchAgentOutcome(
|
|
566
|
+
trx,
|
|
567
|
+
container,
|
|
568
|
+
currentInstance,
|
|
569
|
+
definition.definition,
|
|
570
|
+
outcomeMarker,
|
|
571
|
+
{ workflowContext: currentInstance.context, userId: executionUserId },
|
|
572
|
+
)
|
|
573
|
+
if (dispatched.kind === 'routed') {
|
|
574
|
+
events.push({
|
|
575
|
+
eventType: 'OUTCOME_ROUTED',
|
|
576
|
+
occurredAt: new Date(),
|
|
577
|
+
data: {
|
|
578
|
+
stepId: outcomeMarker.stepId,
|
|
579
|
+
outcome: outcomeMarker.outcome,
|
|
580
|
+
toStepId: dispatched.toStepId,
|
|
581
|
+
transitionId: dispatched.transitionId,
|
|
582
|
+
},
|
|
583
|
+
})
|
|
584
|
+
continue
|
|
585
|
+
}
|
|
586
|
+
if (dispatched.kind === 'failed') {
|
|
587
|
+
errors.push(dispatched.error)
|
|
588
|
+
events.push({
|
|
589
|
+
eventType: 'OUTCOME_UNHANDLED',
|
|
590
|
+
occurredAt: new Date(),
|
|
591
|
+
data: { stepId: outcomeMarker.stepId, outcome: outcomeMarker.outcome },
|
|
592
|
+
})
|
|
593
|
+
await completeWorkflow(trx, container, instanceId, 'FAILED', { error: dispatched.error })
|
|
594
|
+
return {
|
|
595
|
+
status: 'FAILED',
|
|
596
|
+
currentStep: currentInstance.currentStepId,
|
|
597
|
+
context: currentInstance.context,
|
|
598
|
+
events,
|
|
599
|
+
errors,
|
|
600
|
+
executionTime: Date.now() - startTime,
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
if (dispatched.kind === 'parked') {
|
|
604
|
+
return {
|
|
605
|
+
status: 'RUNNING',
|
|
606
|
+
currentStep: currentInstance.currentStepId,
|
|
607
|
+
context: currentInstance.context,
|
|
608
|
+
events,
|
|
609
|
+
executionTime: Date.now() - startTime,
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
const transitions = excludeNonNormalTransitions(definition.definition.transitions).filter(
|
|
397
615
|
(t: any) =>
|
|
398
616
|
t.fromStepId === currentInstance.currentStepId &&
|
|
399
617
|
t.trigger === 'auto'
|
|
@@ -445,11 +663,88 @@ export async function executeWorkflow(
|
|
|
445
663
|
currentInstance,
|
|
446
664
|
selectedTransition.fromStepId,
|
|
447
665
|
selectedTransition.toStepId,
|
|
448
|
-
evalContext
|
|
666
|
+
{ ...evalContext, transitionId: selectedTransition.transitionId },
|
|
449
667
|
)
|
|
450
668
|
|
|
451
669
|
if (!transitionResult.success) {
|
|
452
670
|
const rejectionMessage = transitionResult.error || 'Transition failed'
|
|
671
|
+
|
|
672
|
+
// Error routing (spec 5.9): a wired error route is followed instead
|
|
673
|
+
// of failing the instance; a failure-queue directive parks it. Both
|
|
674
|
+
// are absent unless the definition opts in, so the legacy failure
|
|
675
|
+
// path below is byte-identical for every existing definition.
|
|
676
|
+
if (transitionResult.errorRoute && transitionResult.failedStepId) {
|
|
677
|
+
const routed = await followErrorRoute(
|
|
678
|
+
trx,
|
|
679
|
+
container,
|
|
680
|
+
currentInstance,
|
|
681
|
+
transitionResult.failedStepId,
|
|
682
|
+
transitionResult.errorRoute,
|
|
683
|
+
rejectionMessage,
|
|
684
|
+
evalContext
|
|
685
|
+
)
|
|
686
|
+
if (routed) {
|
|
687
|
+
events.push({
|
|
688
|
+
eventType: 'ERROR_ROUTED',
|
|
689
|
+
occurredAt: new Date(),
|
|
690
|
+
data: {
|
|
691
|
+
failedStepId: transitionResult.failedStepId,
|
|
692
|
+
toStepId: transitionResult.errorRoute.toStepId,
|
|
693
|
+
transitionId: transitionResult.errorRoute.transitionId,
|
|
694
|
+
},
|
|
695
|
+
})
|
|
696
|
+
continue
|
|
697
|
+
}
|
|
698
|
+
errors.push(`Error route from ${transitionResult.failedStepId} could not be followed`)
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
if (transitionResult.errorHandlerStepId && transitionResult.failedStepId) {
|
|
702
|
+
const entered = await enterErrorHandlerStep(
|
|
703
|
+
trx,
|
|
704
|
+
container,
|
|
705
|
+
currentInstance,
|
|
706
|
+
transitionResult.failedStepId,
|
|
707
|
+
transitionResult.errorHandlerStepId,
|
|
708
|
+
rejectionMessage,
|
|
709
|
+
executionUserId
|
|
710
|
+
)
|
|
711
|
+
if (entered) {
|
|
712
|
+
events.push({
|
|
713
|
+
eventType: 'ERROR_HANDLER_STARTED',
|
|
714
|
+
occurredAt: new Date(),
|
|
715
|
+
data: {
|
|
716
|
+
failedStepId: transitionResult.failedStepId,
|
|
717
|
+
handlerStepId: transitionResult.errorHandlerStepId,
|
|
718
|
+
},
|
|
719
|
+
})
|
|
720
|
+
continue
|
|
721
|
+
}
|
|
722
|
+
errors.push(
|
|
723
|
+
`Error handler step ${transitionResult.errorHandlerStepId} could not be entered`
|
|
724
|
+
)
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
if (transitionResult.parkForAttention && transitionResult.failedStepId) {
|
|
728
|
+
await parkInstanceForAttention(
|
|
729
|
+
trx,
|
|
730
|
+
currentInstance,
|
|
731
|
+
transitionResult.failedStepId,
|
|
732
|
+
rejectionMessage
|
|
733
|
+
)
|
|
734
|
+
events.push({
|
|
735
|
+
eventType: 'ERROR_PARKED',
|
|
736
|
+
occurredAt: new Date(),
|
|
737
|
+
data: { failedStepId: transitionResult.failedStepId },
|
|
738
|
+
})
|
|
739
|
+
return {
|
|
740
|
+
status: 'RUNNING',
|
|
741
|
+
currentStep: currentInstance.currentStepId,
|
|
742
|
+
context: currentInstance.context,
|
|
743
|
+
events,
|
|
744
|
+
executionTime: Date.now() - startTime,
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
453
748
|
logger.error('Transition rejected', {
|
|
454
749
|
instanceId: currentInstance.id,
|
|
455
750
|
workflowId: currentInstance.workflowId,
|
|
@@ -487,6 +782,13 @@ export async function executeWorkflow(
|
|
|
487
782
|
},
|
|
488
783
|
})
|
|
489
784
|
|
|
785
|
+
// Spec 2026-06-26: step/stage advances re-emit `started` with the
|
|
786
|
+
// destination stepId so projections can track stage transitions.
|
|
787
|
+
await emitInstanceLifecycleEvent(currentInstance, 'workflows.instance.started', {
|
|
788
|
+
stepId: selectedTransition.toStepId,
|
|
789
|
+
fromStepId: selectedTransition.fromStepId,
|
|
790
|
+
})
|
|
791
|
+
|
|
490
792
|
if (transitionResult.pausedForActivities) {
|
|
491
793
|
await logWorkflowEvent(trx, {
|
|
492
794
|
workflowInstanceId: currentInstance.id,
|
|
@@ -519,6 +821,21 @@ export async function executeWorkflow(
|
|
|
519
821
|
}
|
|
520
822
|
}
|
|
521
823
|
|
|
824
|
+
// The transition succeeded but the destination step parked the
|
|
825
|
+
// instance (e.g. an INVOKE_AGENT AUTOMATED step enqueued an async
|
|
826
|
+
// agent job and set PAUSED). The token cursor has already advanced to
|
|
827
|
+
// that parked step, so currentInstance.currentStepId is the parked
|
|
828
|
+
// step. Stop advancing until an external signal resumes it.
|
|
829
|
+
if (transitionResult.paused) {
|
|
830
|
+
return {
|
|
831
|
+
status: 'RUNNING',
|
|
832
|
+
currentStep: currentInstance.currentStepId,
|
|
833
|
+
context: currentInstance.context,
|
|
834
|
+
events,
|
|
835
|
+
executionTime: Date.now() - startTime,
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
|
|
522
839
|
await trx.flush()
|
|
523
840
|
} catch (error) {
|
|
524
841
|
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
@@ -581,6 +898,7 @@ export async function executeWorkflow(
|
|
|
581
898
|
instance.errorMessage = errorMessage
|
|
582
899
|
instance.errorDetails = error instanceof WorkflowExecutionError ? error.details : undefined
|
|
583
900
|
instance.updatedAt = new Date()
|
|
901
|
+
await writeRunOutcome(trx, instance, 'FAILED')
|
|
584
902
|
await trx.flush()
|
|
585
903
|
|
|
586
904
|
await logWorkflowEvent(trx, {
|
|
@@ -599,9 +917,476 @@ export async function executeWorkflow(
|
|
|
599
917
|
}
|
|
600
918
|
}
|
|
601
919
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
920
|
+
if (typeof transactionalEm.transactional !== 'function') {
|
|
921
|
+
return runExecution(em)
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
try {
|
|
925
|
+
return await transactionalEm.transactional((trx) => runExecution(trx))
|
|
926
|
+
} catch (error) {
|
|
927
|
+
// The throw has rolled back the execution transaction, discarding the
|
|
928
|
+
// in-transaction FAILED write (and every step/bookkeeping advance) — which
|
|
929
|
+
// would otherwise leave the instance silently stuck at RUNNING/start (#3632).
|
|
930
|
+
// The in-transaction FAILED write is also futile when the underlying error
|
|
931
|
+
// aborted the Postgres transaction (e.g. an effector issuing bad SQL): every
|
|
932
|
+
// subsequent write on that connection fails. Now that the transaction — and
|
|
933
|
+
// its PESSIMISTIC_WRITE lock on the instance row — has been released, durably
|
|
934
|
+
// persist FAILED on an independent fork so the failure is visible and
|
|
935
|
+
// retryable. Restores the #2593 "persist FAILED" guarantee even when the
|
|
936
|
+
// whole transaction is discarded. Best-effort: never masks the original error.
|
|
937
|
+
await persistFailedStatusAfterRollback(em, instanceId, error)
|
|
938
|
+
throw error
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
export type AgentOutcomeDispatch =
|
|
943
|
+
| { kind: 'routed'; toStepId: string; transitionId?: string; paused?: boolean }
|
|
944
|
+
| { kind: 'parked' }
|
|
945
|
+
| { kind: 'failed'; error: string }
|
|
946
|
+
| { kind: 'default' }
|
|
947
|
+
|
|
948
|
+
/**
|
|
949
|
+
* Dispatch a resolved agent disposition for whatever step the instance is
|
|
950
|
+
* currently on, or return null when there is no marker to act on.
|
|
951
|
+
*
|
|
952
|
+
* Exported because `sendSignal` advances a resumed instance ITSELF — it picks
|
|
953
|
+
* the next transition and executes it before handing back to the executor — so
|
|
954
|
+
* an outcome route wired on a parked agent step has to be honoured there too.
|
|
955
|
+
* Routing it in only one of the two places is how a disposition silently takes
|
|
956
|
+
* the happy path on the human-dispose path while working on the inline one.
|
|
957
|
+
*/
|
|
958
|
+
export async function dispatchAgentOutcomeForCurrentStep(
|
|
959
|
+
em: EntityManager,
|
|
960
|
+
container: AwilixContainer,
|
|
961
|
+
instance: WorkflowInstance,
|
|
962
|
+
definition: OutcomeRoutingDefinitionLike,
|
|
963
|
+
evalContext: { workflowContext: Record<string, unknown>; userId?: string }
|
|
964
|
+
): Promise<AgentOutcomeDispatch | null> {
|
|
965
|
+
const marker = readAgentOutcomeMarker(instance.context, instance.currentStepId ?? '')
|
|
966
|
+
if (!marker) return null
|
|
967
|
+
return await dispatchAgentOutcome(em, container, instance, definition, marker, evalContext)
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
/**
|
|
971
|
+
* Act on a resolved agent disposition (spec 7.2).
|
|
972
|
+
*
|
|
973
|
+
* The engine-owned marker is consumed here — cleared before anything else runs —
|
|
974
|
+
* so a route that loops back through the same step cannot re-fire on the old
|
|
975
|
+
* disposition, and so a `default` outcome leaves no residue in the run context.
|
|
976
|
+
*
|
|
977
|
+
* `default` means "route exactly as this instance always would have": the step
|
|
978
|
+
* wired no outcome at all, or the outcome is `approved`, which §7.2 renders as
|
|
979
|
+
* the node's ordinary output. Only a step that opted into outcome routing can
|
|
980
|
+
* reach the inheritance branch, which is what keeps this additive.
|
|
981
|
+
*/
|
|
982
|
+
async function dispatchAgentOutcome(
|
|
983
|
+
em: EntityManager,
|
|
984
|
+
container: AwilixContainer,
|
|
985
|
+
instance: WorkflowInstance,
|
|
986
|
+
definition: OutcomeRoutingDefinitionLike,
|
|
987
|
+
marker: WorkflowAgentOutcomeContextEntry,
|
|
988
|
+
evalContext: { workflowContext: Record<string, unknown>; userId?: string }
|
|
989
|
+
): Promise<AgentOutcomeDispatch> {
|
|
990
|
+
const { [WORKFLOW_AGENT_OUTCOME_CONTEXT_KEY]: _consumed, ...remainingContext } =
|
|
991
|
+
(instance.context || {}) as Record<string, unknown>
|
|
992
|
+
instance.context = remainingContext
|
|
993
|
+
instance.updatedAt = new Date()
|
|
994
|
+
await em.flush()
|
|
995
|
+
|
|
996
|
+
const clearedEvalContext = {
|
|
997
|
+
...evalContext,
|
|
998
|
+
workflowContext: remainingContext,
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
const failUnhandled = async (error: string): Promise<AgentOutcomeDispatch> => {
|
|
1002
|
+
await logWorkflowEvent(em, {
|
|
1003
|
+
workflowInstanceId: instance.id,
|
|
1004
|
+
eventType: 'OUTCOME_UNHANDLED',
|
|
1005
|
+
eventData: { stepId: marker.stepId, outcome: marker.outcome, error },
|
|
1006
|
+
tenantId: instance.tenantId,
|
|
1007
|
+
organizationId: instance.organizationId,
|
|
1008
|
+
})
|
|
1009
|
+
return { kind: 'failed', error }
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
const handling = resolveAgentOutcomeHandling(definition, marker.stepId, marker.outcome)
|
|
1013
|
+
if (handling.kind === 'default') return { kind: 'default' }
|
|
1014
|
+
|
|
1015
|
+
if (handling.kind === 'route') {
|
|
1016
|
+
const toStepId = handling.transition.toStepId
|
|
1017
|
+
if (!toStepId) return { kind: 'default' }
|
|
1018
|
+
|
|
1019
|
+
await logWorkflowEvent(em, {
|
|
1020
|
+
workflowInstanceId: instance.id,
|
|
1021
|
+
eventType: 'OUTCOME_ROUTED',
|
|
1022
|
+
eventData: {
|
|
1023
|
+
stepId: marker.stepId,
|
|
1024
|
+
outcome: marker.outcome,
|
|
1025
|
+
toStepId,
|
|
1026
|
+
transitionId: handling.transition.transitionId,
|
|
1027
|
+
proposalId: marker.proposalId,
|
|
1028
|
+
},
|
|
1029
|
+
tenantId: instance.tenantId,
|
|
1030
|
+
organizationId: instance.organizationId,
|
|
1031
|
+
})
|
|
1032
|
+
|
|
1033
|
+
const transitionHandler = await import('./transition-handler')
|
|
1034
|
+
const routed = await transitionHandler.executeTransition(
|
|
1035
|
+
em,
|
|
1036
|
+
container,
|
|
1037
|
+
instance,
|
|
1038
|
+
marker.stepId,
|
|
1039
|
+
toStepId,
|
|
1040
|
+
{ ...clearedEvalContext, transitionId: handling.transition.transitionId },
|
|
1041
|
+
)
|
|
1042
|
+
if (routed.success) {
|
|
1043
|
+
return {
|
|
1044
|
+
kind: 'routed',
|
|
1045
|
+
toStepId,
|
|
1046
|
+
transitionId: handling.transition.transitionId,
|
|
1047
|
+
paused: routed.paused,
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
return await failUnhandled(`Outcome route for "${marker.outcome}" could not be followed`)
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
// `inherit`: an unwired non-approved outcome follows the complete step-error
|
|
1054
|
+
// handling contract, including continuation, failure-queue parking and the
|
|
1055
|
+
// definition-level handler step.
|
|
1056
|
+
const unhandled = `Agent step ${marker.stepId} resolved outcome "${marker.outcome}", which is not wired`
|
|
1057
|
+
if (handling.handling.kind === 'route') {
|
|
1058
|
+
const errorRoute = handling.handling.transition
|
|
1059
|
+
if (errorRoute.toStepId) {
|
|
1060
|
+
const routed = await followErrorRoute(
|
|
1061
|
+
em,
|
|
1062
|
+
container,
|
|
1063
|
+
instance,
|
|
1064
|
+
marker.stepId,
|
|
1065
|
+
{ transitionId: errorRoute.transitionId, toStepId: errorRoute.toStepId },
|
|
1066
|
+
unhandled,
|
|
1067
|
+
clearedEvalContext
|
|
1068
|
+
)
|
|
1069
|
+
if (routed) {
|
|
1070
|
+
return {
|
|
1071
|
+
kind: 'routed',
|
|
1072
|
+
toStepId: errorRoute.toStepId,
|
|
1073
|
+
transitionId: errorRoute.transitionId,
|
|
1074
|
+
paused: instance.status === 'PAUSED',
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
if (handling.handling.kind === 'continue') {
|
|
1081
|
+
await logWorkflowEvent(em, {
|
|
1082
|
+
workflowInstanceId: instance.id,
|
|
1083
|
+
eventType: 'ERROR_DIRECTIVE_APPLIED',
|
|
1084
|
+
eventData: {
|
|
1085
|
+
stepId: marker.stepId,
|
|
1086
|
+
directive: 'continueWithFallback',
|
|
1087
|
+
source: 'agentOutcome',
|
|
1088
|
+
hasFallbackValue: handling.handling.fallbackValue !== undefined,
|
|
1089
|
+
},
|
|
1090
|
+
tenantId: instance.tenantId,
|
|
1091
|
+
organizationId: instance.organizationId,
|
|
1092
|
+
})
|
|
1093
|
+
if (handling.handling.fallbackValue !== undefined) {
|
|
1094
|
+
instance.context = {
|
|
1095
|
+
...(instance.context || {}),
|
|
1096
|
+
[marker.stepId]: handling.handling.fallbackValue,
|
|
1097
|
+
}
|
|
1098
|
+
instance.updatedAt = new Date()
|
|
1099
|
+
await em.flush()
|
|
1100
|
+
}
|
|
1101
|
+
return { kind: 'default' }
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
if (handling.handling.kind === 'park') {
|
|
1105
|
+
await parkInstanceForAttention(em, instance, marker.stepId, unhandled)
|
|
1106
|
+
return { kind: 'parked' }
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
if (handling.handling.kind === 'handlerStep') {
|
|
1110
|
+
const entered = await enterErrorHandlerStep(
|
|
1111
|
+
em,
|
|
1112
|
+
container,
|
|
1113
|
+
instance,
|
|
1114
|
+
marker.stepId,
|
|
1115
|
+
handling.handling.stepId,
|
|
1116
|
+
unhandled,
|
|
1117
|
+
clearedEvalContext.userId,
|
|
1118
|
+
)
|
|
1119
|
+
if (entered) {
|
|
1120
|
+
return {
|
|
1121
|
+
kind: 'routed',
|
|
1122
|
+
toStepId: handling.handling.stepId,
|
|
1123
|
+
paused: instance.status === 'PAUSED',
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
return await failUnhandled(unhandled)
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
/**
|
|
1132
|
+
* Follow a wired error route out of a failed step (spec 5.9). The failure is
|
|
1133
|
+
* published into the run context under `__error` so the handling branch can act
|
|
1134
|
+
* on it, then the error transition executes through the normal machinery — it
|
|
1135
|
+
* creates its step instance, runs its activities and logs its events like any
|
|
1136
|
+
* other route. Returns false when the route could not be taken, so the caller
|
|
1137
|
+
* falls back to the untouched failure path.
|
|
1138
|
+
*/
|
|
1139
|
+
async function followErrorRoute(
|
|
1140
|
+
em: EntityManager,
|
|
1141
|
+
container: AwilixContainer,
|
|
1142
|
+
instance: WorkflowInstance,
|
|
1143
|
+
failedStepId: string,
|
|
1144
|
+
errorRoute: { transitionId?: string; toStepId: string },
|
|
1145
|
+
error: string,
|
|
1146
|
+
evalContext: { workflowContext: Record<string, any>; userId?: string }
|
|
1147
|
+
): Promise<boolean> {
|
|
1148
|
+
await logWorkflowEvent(em, {
|
|
1149
|
+
workflowInstanceId: instance.id,
|
|
1150
|
+
eventType: 'ERROR_ROUTED',
|
|
1151
|
+
eventData: {
|
|
1152
|
+
failedStepId,
|
|
1153
|
+
toStepId: errorRoute.toStepId,
|
|
1154
|
+
transitionId: errorRoute.transitionId,
|
|
1155
|
+
error,
|
|
1156
|
+
},
|
|
1157
|
+
tenantId: instance.tenantId,
|
|
1158
|
+
organizationId: instance.organizationId,
|
|
1159
|
+
})
|
|
1160
|
+
|
|
1161
|
+
const errorEntry = buildErrorContextEntry(failedStepId, error)
|
|
1162
|
+
instance.context = {
|
|
1163
|
+
...(instance.context || {}),
|
|
1164
|
+
[WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
|
|
1165
|
+
}
|
|
1166
|
+
instance.updatedAt = new Date()
|
|
1167
|
+
await em.flush()
|
|
1168
|
+
|
|
1169
|
+
const transitionHandler = await import('./transition-handler')
|
|
1170
|
+
const routedResult = await transitionHandler.executeTransition(
|
|
1171
|
+
em,
|
|
1172
|
+
container,
|
|
1173
|
+
instance,
|
|
1174
|
+
failedStepId,
|
|
1175
|
+
errorRoute.toStepId,
|
|
1176
|
+
{
|
|
1177
|
+
...evalContext,
|
|
1178
|
+
workflowContext: {
|
|
1179
|
+
...evalContext.workflowContext,
|
|
1180
|
+
[WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
|
|
1181
|
+
},
|
|
1182
|
+
transitionId: errorRoute.transitionId,
|
|
1183
|
+
},
|
|
1184
|
+
)
|
|
1185
|
+
|
|
1186
|
+
return routedResult.success === true
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
/**
|
|
1190
|
+
* Enter the definition-level handler STEP (spec 5.9, `errorHandler.stepId`) for
|
|
1191
|
+
* a failure no route and no directive handled. The token jumps to the handler
|
|
1192
|
+
* step and executes it — the same cursor-move-plus-`executeStep` shape the
|
|
1193
|
+
* branch/timer/signal resumes already use, so no transition record is invented.
|
|
1194
|
+
* A failure of the handler step itself resolves to `fail` (the resolver never
|
|
1195
|
+
* jumps a step to itself), which is this form's recursion guard.
|
|
1196
|
+
*/
|
|
1197
|
+
async function enterErrorHandlerStep(
|
|
1198
|
+
em: EntityManager,
|
|
1199
|
+
container: AwilixContainer,
|
|
1200
|
+
instance: WorkflowInstance,
|
|
1201
|
+
failedStepId: string,
|
|
1202
|
+
handlerStepId: string,
|
|
1203
|
+
error: string,
|
|
1204
|
+
userId?: string
|
|
1205
|
+
): Promise<boolean> {
|
|
1206
|
+
const errorEntry = buildErrorContextEntry(failedStepId, error)
|
|
1207
|
+
|
|
1208
|
+
await logWorkflowEvent(em, {
|
|
1209
|
+
workflowInstanceId: instance.id,
|
|
1210
|
+
eventType: 'ERROR_HANDLER_STARTED',
|
|
1211
|
+
eventData: { failedStepId, handlerStepId, error },
|
|
1212
|
+
tenantId: instance.tenantId,
|
|
1213
|
+
organizationId: instance.organizationId,
|
|
1214
|
+
})
|
|
1215
|
+
|
|
1216
|
+
instance.context = {
|
|
1217
|
+
...(instance.context || {}),
|
|
1218
|
+
[WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
|
|
1219
|
+
}
|
|
1220
|
+
instance.currentStepId = handlerStepId
|
|
1221
|
+
instance.updatedAt = new Date()
|
|
1222
|
+
await em.flush()
|
|
1223
|
+
|
|
1224
|
+
const { executeStep } = await import('./step-handler')
|
|
1225
|
+
const result = await executeStep(
|
|
1226
|
+
em,
|
|
1227
|
+
instance,
|
|
1228
|
+
handlerStepId,
|
|
1229
|
+
{
|
|
1230
|
+
workflowContext: {
|
|
1231
|
+
...(instance.context || {}),
|
|
1232
|
+
[WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
|
|
1233
|
+
},
|
|
1234
|
+
userId,
|
|
1235
|
+
},
|
|
1236
|
+
container
|
|
1237
|
+
)
|
|
1238
|
+
|
|
1239
|
+
return result.status !== 'FAILED'
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
/**
|
|
1243
|
+
* Park a step-through run before the step the author has not released yet.
|
|
1244
|
+
*
|
|
1245
|
+
* Reuses PAUSED exactly as the failure queue does, and deliberately writes NO
|
|
1246
|
+
* `attention` marker: the run is waiting for the author, not for triage, so it
|
|
1247
|
+
* must not appear in the failure queue.
|
|
1248
|
+
*/
|
|
1249
|
+
async function pauseForStepThrough(
|
|
1250
|
+
em: EntityManager,
|
|
1251
|
+
instance: WorkflowInstance
|
|
1252
|
+
): Promise<void> {
|
|
1253
|
+
const now = new Date()
|
|
1254
|
+
instance.status = 'PAUSED'
|
|
1255
|
+
instance.pausedAt = now
|
|
1256
|
+
instance.updatedAt = now
|
|
1257
|
+
await em.flush()
|
|
1258
|
+
|
|
1259
|
+
await logWorkflowEvent(em, {
|
|
1260
|
+
workflowInstanceId: instance.id,
|
|
1261
|
+
eventType: STEP_THROUGH_EVENT_TYPE,
|
|
1262
|
+
eventData: { stepId: instance.currentStepId },
|
|
1263
|
+
tenantId: instance.tenantId,
|
|
1264
|
+
organizationId: instance.organizationId,
|
|
1265
|
+
})
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
/**
|
|
1269
|
+
* Park an instance for triage instead of failing it — the `failureQueue` error
|
|
1270
|
+
* directive (spec 5.9 "Send to failure queue"). Uses the existing PAUSED state
|
|
1271
|
+
* plus an engine-owned `metadata.attention` marker; no new instance status and
|
|
1272
|
+
* no compensation, because the run is suspended rather than terminated.
|
|
1273
|
+
*/
|
|
1274
|
+
async function parkInstanceForAttention(
|
|
1275
|
+
em: EntityManager,
|
|
1276
|
+
instance: WorkflowInstance,
|
|
1277
|
+
failedStepId: string,
|
|
1278
|
+
error: string
|
|
1279
|
+
): Promise<void> {
|
|
1280
|
+
const now = new Date()
|
|
1281
|
+
instance.status = 'PAUSED'
|
|
1282
|
+
instance.pausedAt = now
|
|
1283
|
+
instance.errorMessage = error
|
|
1284
|
+
instance.metadata = {
|
|
1285
|
+
...(instance.metadata || {}),
|
|
1286
|
+
attention: {
|
|
1287
|
+
reason: 'ERROR_DIRECTIVE',
|
|
1288
|
+
stepId: failedStepId,
|
|
1289
|
+
error,
|
|
1290
|
+
at: now.toISOString(),
|
|
1291
|
+
},
|
|
1292
|
+
}
|
|
1293
|
+
instance.updatedAt = now
|
|
1294
|
+
await em.flush()
|
|
1295
|
+
|
|
1296
|
+
await logWorkflowEvent(em, {
|
|
1297
|
+
workflowInstanceId: instance.id,
|
|
1298
|
+
eventType: 'ERROR_PARKED',
|
|
1299
|
+
eventData: { failedStepId, error, directive: 'failureQueue' },
|
|
1300
|
+
tenantId: instance.tenantId,
|
|
1301
|
+
organizationId: instance.organizationId,
|
|
1302
|
+
})
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
/**
|
|
1306
|
+
* Durably mark a workflow instance FAILED after its execution transaction has
|
|
1307
|
+
* rolled back. MUST run on a fresh fork (a clean connection): the rolled-back
|
|
1308
|
+
* transaction may be aborted/poisoned, and its PESSIMISTIC_WRITE lock on the
|
|
1309
|
+
* instance row is released only once the transactional callback unwinds, so an
|
|
1310
|
+
* in-transaction write here would be discarded or deadlock. Only transitions a
|
|
1311
|
+
* still-`RUNNING` instance (leaves CANCELLED/COMPLETED/PAUSED untouched).
|
|
1312
|
+
*/
|
|
1313
|
+
async function persistFailedStatusAfterRollback(
|
|
1314
|
+
em: EntityManager,
|
|
1315
|
+
instanceId: string,
|
|
1316
|
+
error: unknown,
|
|
1317
|
+
): Promise<void> {
|
|
1318
|
+
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
1319
|
+
const errorDetails = error instanceof WorkflowExecutionError ? error.details : undefined
|
|
1320
|
+
const markFailed = async (trx: EntityManager): Promise<void> => {
|
|
1321
|
+
const instance = await trx.findOne(
|
|
1322
|
+
WorkflowInstance,
|
|
1323
|
+
{ id: instanceId },
|
|
1324
|
+
{ lockMode: LockMode.PESSIMISTIC_WRITE },
|
|
1325
|
+
)
|
|
1326
|
+
if (!instance || instance.status !== 'RUNNING') return
|
|
1327
|
+
instance.status = 'FAILED'
|
|
1328
|
+
instance.errorMessage = errorMessage
|
|
1329
|
+
instance.errorDetails = errorDetails
|
|
1330
|
+
instance.updatedAt = new Date()
|
|
1331
|
+
await writeRunOutcome(trx, instance, 'FAILED')
|
|
1332
|
+
await trx.flush()
|
|
1333
|
+
await logWorkflowEvent(trx, {
|
|
1334
|
+
workflowInstanceId: instanceId,
|
|
1335
|
+
eventType: 'WORKFLOW_FAILED',
|
|
1336
|
+
eventData: { error: errorMessage },
|
|
1337
|
+
tenantId: instance.tenantId,
|
|
1338
|
+
organizationId: instance.organizationId,
|
|
1339
|
+
})
|
|
1340
|
+
await emitInstanceLifecycleEvent(instance, 'workflows.instance.failed')
|
|
1341
|
+
}
|
|
1342
|
+
try {
|
|
1343
|
+
if (typeof (em as { fork?: unknown }).fork !== 'function') return
|
|
1344
|
+
const fork = em.fork() as EntityManager & {
|
|
1345
|
+
transactional?: <TResult>(callback: (trx: EntityManager) => Promise<TResult>) => Promise<TResult>
|
|
1346
|
+
}
|
|
1347
|
+
if (typeof fork.transactional === 'function') {
|
|
1348
|
+
await fork.transactional((trx) => markFailed(trx))
|
|
1349
|
+
} else {
|
|
1350
|
+
await markFailed(fork)
|
|
1351
|
+
}
|
|
1352
|
+
} catch (persistError) {
|
|
1353
|
+
logger.error('failed to durably persist FAILED status after rollback', {
|
|
1354
|
+
instanceId,
|
|
1355
|
+
error: persistError instanceof Error ? persistError.message : String(persistError),
|
|
1356
|
+
})
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
/**
|
|
1361
|
+
* Write the run's terminal VERDICT onto the instance, and guarantee it has a
|
|
1362
|
+
* terminal timestamp.
|
|
1363
|
+
*
|
|
1364
|
+
* The ONE write site, so `outcome` cannot be assembled ad hoc per exit point:
|
|
1365
|
+
* every caller hands over the terminal status and the pure
|
|
1366
|
+
* `resolveRunOutcome` decides from the evidence the run recorded. Called before
|
|
1367
|
+
* the flush that persists the terminal status, so status and verdict land in the
|
|
1368
|
+
* same UPDATE and no reader can observe one without the other.
|
|
1369
|
+
*
|
|
1370
|
+
* The timestamp backstop closes a real gap. `compensation-handler` flips the
|
|
1371
|
+
* status to COMPENSATED (or back to FAILED on a partial compensation) and
|
|
1372
|
+
* `completeWorkflow` RETURNS before its own `completedAt` assignment on that
|
|
1373
|
+
* path, so a compensated run had no terminal instant at all — it could be
|
|
1374
|
+
* attributed to no KPI window and its duration was unmeasurable. Every other
|
|
1375
|
+
* path already assigns one, so this only ever fills a hole; it never moves an
|
|
1376
|
+
* instant that was already recorded, and CANCELLED is excluded because
|
|
1377
|
+
* `cancelledAt` is its terminal instant.
|
|
1378
|
+
*/
|
|
1379
|
+
async function writeRunOutcome(
|
|
1380
|
+
em: EntityManager,
|
|
1381
|
+
instance: WorkflowInstance,
|
|
1382
|
+
terminalStatus: string,
|
|
1383
|
+
): Promise<void> {
|
|
1384
|
+
const evidence = await collectRunOutcomeEvidence(em, instance, terminalStatus)
|
|
1385
|
+
instance.outcome = resolveRunOutcome(evidence)
|
|
1386
|
+
|
|
1387
|
+
if (terminalStatus !== 'CANCELLED' && !instance.completedAt) {
|
|
1388
|
+
instance.completedAt = new Date()
|
|
1389
|
+
}
|
|
605
1390
|
}
|
|
606
1391
|
|
|
607
1392
|
/**
|
|
@@ -629,6 +1414,19 @@ export async function completeWorkflow(
|
|
|
629
1414
|
)
|
|
630
1415
|
}
|
|
631
1416
|
|
|
1417
|
+
// Workflow-level error handler (spec 5.9) — scheduled BEFORE compensation so
|
|
1418
|
+
// the handler observes the state that failed rather than the rolled-back one,
|
|
1419
|
+
// and so it still runs when compensation throws (that block swallows errors
|
|
1420
|
+
// and returns early). Executed out of band by the worker; the
|
|
1421
|
+
// ERROR_HANDLER_SCHEDULED event is written here, inside this transaction.
|
|
1422
|
+
if (status === 'FAILED') {
|
|
1423
|
+
await scheduleWorkflowErrorHandler(em, instance, {
|
|
1424
|
+
failedStepId: result?.failedStepId ?? instance.currentStepId,
|
|
1425
|
+
error: result?.error,
|
|
1426
|
+
details: result?.details,
|
|
1427
|
+
})
|
|
1428
|
+
}
|
|
1429
|
+
|
|
632
1430
|
// Trigger compensation if workflow failed and has compensatable activities (Phase 8.2)
|
|
633
1431
|
if (status === 'FAILED') {
|
|
634
1432
|
const definition = await findDefinitionForInstance(em, instance)
|
|
@@ -660,7 +1458,21 @@ export async function completeWorkflow(
|
|
|
660
1458
|
})
|
|
661
1459
|
|
|
662
1460
|
// Note: instance status already updated by compensateWorkflow
|
|
663
|
-
// It will be COMPENSATED or remain FAILED
|
|
1461
|
+
// It will be COMPENSATED or remain FAILED. This branch RETURNS, so the
|
|
1462
|
+
// verdict is written here rather than at the shared tail below — same
|
|
1463
|
+
// resolver, same evidence, one more call site than the ideal one.
|
|
1464
|
+
await writeRunOutcome(em, instance, instance.status)
|
|
1465
|
+
await em.flush()
|
|
1466
|
+
|
|
1467
|
+
// A compensated/failed child must still resume its parent SUB_WORKFLOW
|
|
1468
|
+
// step — otherwise a parent parked on this child stays PAUSED forever.
|
|
1469
|
+
// From the parent's perspective the sub-workflow did not succeed, so this
|
|
1470
|
+
// mirrors the normal-path enqueue below but always signals FAILED.
|
|
1471
|
+
await enqueueSubWorkflowParentResume(instance, 'FAILED')
|
|
1472
|
+
// Terminal signal for external projections: the run did not succeed,
|
|
1473
|
+
// regardless of whether compensation left it COMPENSATED or FAILED
|
|
1474
|
+
// (payload `status` carries the actual post-compensation status).
|
|
1475
|
+
await emitInstanceLifecycleEvent(instance, 'workflows.instance.failed')
|
|
664
1476
|
return
|
|
665
1477
|
} catch (error: any) {
|
|
666
1478
|
logger.error('Compensation failed with exception', { err: error })
|
|
@@ -695,6 +1507,8 @@ export async function completeWorkflow(
|
|
|
695
1507
|
break
|
|
696
1508
|
}
|
|
697
1509
|
|
|
1510
|
+
await writeRunOutcome(em, instance, status)
|
|
1511
|
+
|
|
698
1512
|
await em.flush()
|
|
699
1513
|
|
|
700
1514
|
// Log completion event
|
|
@@ -712,6 +1526,69 @@ export async function completeWorkflow(
|
|
|
712
1526
|
tenantId: instance.tenantId,
|
|
713
1527
|
organizationId: instance.organizationId,
|
|
714
1528
|
})
|
|
1529
|
+
|
|
1530
|
+
await emitInstanceLifecycleEvent(
|
|
1531
|
+
instance,
|
|
1532
|
+
status === 'COMPLETED'
|
|
1533
|
+
? 'workflows.instance.completed'
|
|
1534
|
+
: status === 'FAILED'
|
|
1535
|
+
? 'workflows.instance.failed'
|
|
1536
|
+
: 'workflows.instance.cancelled'
|
|
1537
|
+
)
|
|
1538
|
+
|
|
1539
|
+
// If this instance is a child of a parked SUB_WORKFLOW step, enqueue a job to
|
|
1540
|
+
// resume the parent on the worker's own connection (never inline inside the
|
|
1541
|
+
// child's transaction — lock-ordering hazard). The worker guard skips the job
|
|
1542
|
+
// when the parent never parked (fully-synchronous fast path).
|
|
1543
|
+
if (status === 'COMPLETED' || status === 'FAILED') {
|
|
1544
|
+
await enqueueSubWorkflowParentResume(instance, status)
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
/**
|
|
1549
|
+
* Enqueue a `resume_subworkflow_parent` job when a terminating instance carries a
|
|
1550
|
+
* parent linkage. Best-effort: a queue hiccup must not undo the just-persisted
|
|
1551
|
+
* terminal status, so failures are logged rather than thrown. The small delay
|
|
1552
|
+
* lets the parent's PAUSED flush become visible before the worker runs.
|
|
1553
|
+
*/
|
|
1554
|
+
async function enqueueSubWorkflowParentResume(
|
|
1555
|
+
instance: WorkflowInstance,
|
|
1556
|
+
childStatus: 'COMPLETED' | 'FAILED'
|
|
1557
|
+
): Promise<void> {
|
|
1558
|
+
const labels = instance.metadata?.labels
|
|
1559
|
+
const parentInstanceId = labels?.parentInstanceId
|
|
1560
|
+
const parentStepId = labels?.parentStepId
|
|
1561
|
+
const parentStepInstanceId = labels?.parentStepInstanceId
|
|
1562
|
+
if (!parentInstanceId || !parentStepId || !parentStepInstanceId) return
|
|
1563
|
+
|
|
1564
|
+
try {
|
|
1565
|
+
const { createModuleQueue } = await import('@open-mercato/queue')
|
|
1566
|
+
const { WORKFLOW_ACTIVITIES_QUEUE_NAME } = await import('./activity-queue-types')
|
|
1567
|
+
const { INVOKE_AGENT_ENQUEUE_DELAY_MS } = await import('./activity-executor')
|
|
1568
|
+
|
|
1569
|
+
const queue = createModuleQueue<WorkflowActivityJob>(WORKFLOW_ACTIVITIES_QUEUE_NAME, {
|
|
1570
|
+
concurrency: parseInt(process.env.WORKFLOW_WORKER_CONCURRENCY || '5'),
|
|
1571
|
+
})
|
|
1572
|
+
|
|
1573
|
+
const job: WorkflowActivityJobResumeSubWorkflowParent = {
|
|
1574
|
+
kind: 'resume_subworkflow_parent',
|
|
1575
|
+
workflowInstanceId: parentInstanceId,
|
|
1576
|
+
parentInstanceId,
|
|
1577
|
+
parentStepId,
|
|
1578
|
+
parentStepInstanceId,
|
|
1579
|
+
childInstanceId: instance.id,
|
|
1580
|
+
childStatus,
|
|
1581
|
+
tenantId: instance.tenantId,
|
|
1582
|
+
organizationId: instance.organizationId,
|
|
1583
|
+
}
|
|
1584
|
+
await queue.enqueue(job, { delayMs: INVOKE_AGENT_ENQUEUE_DELAY_MS })
|
|
1585
|
+
} catch (error) {
|
|
1586
|
+
logger.error('failed to enqueue parent-resume job', {
|
|
1587
|
+
childInstanceId: instance.id,
|
|
1588
|
+
parentInstanceId,
|
|
1589
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1590
|
+
})
|
|
1591
|
+
}
|
|
715
1592
|
}
|
|
716
1593
|
|
|
717
1594
|
/**
|
|
@@ -794,6 +1671,7 @@ export async function resumeWorkflowAfterActivities(
|
|
|
794
1671
|
jobId: e.eventData.jobId,
|
|
795
1672
|
})),
|
|
796
1673
|
}
|
|
1674
|
+
await writeRunOutcome(trx, instance, 'FAILED')
|
|
797
1675
|
await trx.flush()
|
|
798
1676
|
|
|
799
1677
|
await logWorkflowEvent(trx, {
|
|
@@ -894,6 +1772,11 @@ export async function resumeWorkflowAfterActivities(
|
|
|
894
1772
|
organizationId: instance.organizationId,
|
|
895
1773
|
})
|
|
896
1774
|
|
|
1775
|
+
// The async-resume path runs inside a worker, so it re-resolves the actor
|
|
1776
|
+
// from the definition exactly as the main loop does — otherwise a granted
|
|
1777
|
+
// workflow would revert to the starting user's identity the moment one of
|
|
1778
|
+
// its activities went async.
|
|
1779
|
+
const resumeDefinition = await findDefinitionForInstance(trx, instance)
|
|
897
1780
|
const { executeStep } = await import('./step-handler')
|
|
898
1781
|
await executeStep(
|
|
899
1782
|
trx,
|
|
@@ -901,7 +1784,9 @@ export async function resumeWorkflowAfterActivities(
|
|
|
901
1784
|
pendingTransition.toStepId,
|
|
902
1785
|
{
|
|
903
1786
|
workflowContext: instance.context || {},
|
|
904
|
-
userId:
|
|
1787
|
+
userId: resumeDefinition
|
|
1788
|
+
? await resolveRunActorUserId(trx, resumeDefinition, undefined, instance)
|
|
1789
|
+
: resolveWorkflowExecutionUserId(undefined, instance),
|
|
905
1790
|
},
|
|
906
1791
|
container
|
|
907
1792
|
)
|
|
@@ -950,7 +1835,12 @@ function checkIfCompensationNeeded(definition: WorkflowDefinition): boolean {
|
|
|
950
1835
|
// ============================================================================
|
|
951
1836
|
|
|
952
1837
|
/**
|
|
953
|
-
* Get workflow instance by ID
|
|
1838
|
+
* Get workflow instance by ID.
|
|
1839
|
+
*
|
|
1840
|
+
* SECURITY: this helper is NOT tenant-scoped. It is an internal lookup whose
|
|
1841
|
+
* callers are expected to have resolved and enforced the scope already. Never
|
|
1842
|
+
* reach it directly from an HTTP handler — use a scoped query (see
|
|
1843
|
+
* `updateWorkflowContextScoped`) so a cross-tenant id cannot resolve.
|
|
954
1844
|
*
|
|
955
1845
|
* @param em - Entity manager
|
|
956
1846
|
* @param instanceId - Workflow instance ID
|
|
@@ -979,7 +1869,12 @@ async function getWorkflowInstanceForExecution(
|
|
|
979
1869
|
}
|
|
980
1870
|
|
|
981
1871
|
/**
|
|
982
|
-
* Update workflow context with new data
|
|
1872
|
+
* Update workflow context with new data.
|
|
1873
|
+
*
|
|
1874
|
+
* SECURITY: builds on the UNSCOPED {@link getWorkflowInstance} and therefore
|
|
1875
|
+
* performs no tenant/organization filtering of its own. It is preserved as-is
|
|
1876
|
+
* for backward compatibility (it is a DI-exposed surface). HTTP handlers MUST
|
|
1877
|
+
* use {@link updateWorkflowContextScoped} instead.
|
|
983
1878
|
*
|
|
984
1879
|
* @param em - Entity manager
|
|
985
1880
|
* @param instanceId - Workflow instance ID
|
|
@@ -1008,8 +1903,139 @@ export async function updateWorkflowContext(
|
|
|
1008
1903
|
await em.flush()
|
|
1009
1904
|
}
|
|
1010
1905
|
|
|
1906
|
+
/**
|
|
1907
|
+
* Context keys the engine owns. A caller-supplied patch may never write them:
|
|
1908
|
+
* `__result` carries the terminal workflow result, `_pendingAsyncActivities`
|
|
1909
|
+
* tracks in-flight async activity jobs, and `__park` marks a parked agent step.
|
|
1910
|
+
* Overwriting any of them would corrupt a running instance, so they are
|
|
1911
|
+
* rejected rather than silently dropped.
|
|
1912
|
+
*/
|
|
1913
|
+
export const RESERVED_WORKFLOW_CONTEXT_KEYS: readonly string[] = [
|
|
1914
|
+
'__result',
|
|
1915
|
+
'_pendingAsyncActivities',
|
|
1916
|
+
'__park',
|
|
1917
|
+
WORKFLOW_ERROR_CONTEXT_KEY,
|
|
1918
|
+
]
|
|
1919
|
+
|
|
1920
|
+
export function findReservedContextKeys(updates: Record<string, unknown>): string[] {
|
|
1921
|
+
return Object.keys(updates).filter((key) => RESERVED_WORKFLOW_CONTEXT_KEYS.includes(key))
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1924
|
+
export interface UpdateWorkflowContextScopedOptions {
|
|
1925
|
+
instanceId: string
|
|
1926
|
+
tenantId: string
|
|
1927
|
+
organizationId: string
|
|
1928
|
+
updates: Record<string, unknown>
|
|
1929
|
+
/**
|
|
1930
|
+
* Optional version check, awaited with the freshly loaded row's `updatedAt`
|
|
1931
|
+
* before the patch is applied. HTTP callers pass
|
|
1932
|
+
* `enforceCommandOptimisticLockWithGuards` here so a stale write 409s instead
|
|
1933
|
+
* of silently clobbering a concurrent context change.
|
|
1934
|
+
*/
|
|
1935
|
+
assertVersion?: (current: Date | null | undefined) => void | Promise<void>
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
/**
|
|
1939
|
+
* Tenant/organization-scoped sibling of {@link updateWorkflowContext}: the
|
|
1940
|
+
* scope is part of the lookup, so a cross-tenant instance id resolves to
|
|
1941
|
+
* nothing and the caller returns a 404 rather than reading or writing another
|
|
1942
|
+
* tenant's run. Shallow merge, consistent with the legacy helper.
|
|
1943
|
+
*/
|
|
1944
|
+
export async function updateWorkflowContextScoped(
|
|
1945
|
+
em: EntityManager,
|
|
1946
|
+
options: UpdateWorkflowContextScopedOptions
|
|
1947
|
+
): Promise<WorkflowInstance> {
|
|
1948
|
+
const { instanceId, tenantId, organizationId, updates, assertVersion } = options
|
|
1949
|
+
|
|
1950
|
+
const reserved = findReservedContextKeys(updates)
|
|
1951
|
+
if (reserved.length > 0) {
|
|
1952
|
+
throw new WorkflowExecutionError(
|
|
1953
|
+
`Reserved workflow context keys cannot be written: ${reserved.join(', ')}`,
|
|
1954
|
+
'RESERVED_CONTEXT_KEY',
|
|
1955
|
+
{ instanceId, reserved }
|
|
1956
|
+
)
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
const instance = await findOneWithDecryption(
|
|
1960
|
+
em as PostgreSqlEntityManager,
|
|
1961
|
+
WorkflowInstance,
|
|
1962
|
+
{ id: instanceId, tenantId, organizationId },
|
|
1963
|
+
undefined,
|
|
1964
|
+
{ tenantId, organizationId }
|
|
1965
|
+
)
|
|
1966
|
+
if (!instance) {
|
|
1967
|
+
throw new WorkflowExecutionError(
|
|
1968
|
+
`Workflow instance not found: ${instanceId}`,
|
|
1969
|
+
'INSTANCE_NOT_FOUND',
|
|
1970
|
+
{ instanceId }
|
|
1971
|
+
)
|
|
1972
|
+
}
|
|
1973
|
+
|
|
1974
|
+
if (instance.status !== 'RUNNING' && instance.status !== 'PAUSED' && instance.status !== 'FORKED') {
|
|
1975
|
+
throw new WorkflowExecutionError(
|
|
1976
|
+
`Workflow instance is not accepting context updates: ${instance.status}`,
|
|
1977
|
+
'INSTANCE_NOT_UPDATABLE',
|
|
1978
|
+
{ instanceId, status: instance.status }
|
|
1979
|
+
)
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1982
|
+
if (assertVersion) await assertVersion(instance.updatedAt)
|
|
1983
|
+
|
|
1984
|
+
instance.context = {
|
|
1985
|
+
...instance.context,
|
|
1986
|
+
...updates,
|
|
1987
|
+
}
|
|
1988
|
+
instance.updatedAt = new Date()
|
|
1989
|
+
|
|
1990
|
+
await em.flush()
|
|
1991
|
+
|
|
1992
|
+
return instance
|
|
1993
|
+
}
|
|
1994
|
+
|
|
1011
1995
|
// findWorkflowDefinition is imported from ./find-definition
|
|
1012
1996
|
|
|
1997
|
+
type InstanceLifecycleEventId =
|
|
1998
|
+
| 'workflows.instance.created'
|
|
1999
|
+
| 'workflows.instance.started'
|
|
2000
|
+
| 'workflows.instance.completed'
|
|
2001
|
+
| 'workflows.instance.failed'
|
|
2002
|
+
| 'workflows.instance.cancelled'
|
|
2003
|
+
|
|
2004
|
+
/**
|
|
2005
|
+
* Publish a declared `workflows.instance.*` lifecycle event to the event bus,
|
|
2006
|
+
* alongside (never instead of) the internal `WorkflowEvent` audit row. Delivery
|
|
2007
|
+
* is at-least-once and consumers must be idempotent; a bus failure must never
|
|
2008
|
+
* break workflow execution, so this is strictly best-effort.
|
|
2009
|
+
*/
|
|
2010
|
+
async function emitInstanceLifecycleEvent(
|
|
2011
|
+
instance: WorkflowInstance,
|
|
2012
|
+
eventId: InstanceLifecycleEventId,
|
|
2013
|
+
extra?: Record<string, unknown>
|
|
2014
|
+
): Promise<void> {
|
|
2015
|
+
try {
|
|
2016
|
+
await emitWorkflowsEvent(
|
|
2017
|
+
eventId,
|
|
2018
|
+
{
|
|
2019
|
+
id: instance.id,
|
|
2020
|
+
tenantId: instance.tenantId,
|
|
2021
|
+
organizationId: instance.organizationId,
|
|
2022
|
+
workflowId: instance.workflowId,
|
|
2023
|
+
version: instance.version,
|
|
2024
|
+
status: instance.status,
|
|
2025
|
+
stepId: instance.currentStepId ?? null,
|
|
2026
|
+
...extra,
|
|
2027
|
+
},
|
|
2028
|
+
{ persistent: true }
|
|
2029
|
+
)
|
|
2030
|
+
} catch (error) {
|
|
2031
|
+
logger.error('failed to emit workflow event', {
|
|
2032
|
+
eventId,
|
|
2033
|
+
instanceId: instance.id,
|
|
2034
|
+
error: error instanceof Error ? error.message : String(error),
|
|
2035
|
+
})
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
|
|
1013
2039
|
/**
|
|
1014
2040
|
* Log workflow event to event sourcing table
|
|
1015
2041
|
*
|