@open-mercato/core 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7195.1.b5efd1d51a
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/bootstrap.js +7 -3
- package/dist/bootstrap.js.map +2 -2
- 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/bootstrap.ts +13 -3
- 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
|
@@ -13,16 +13,47 @@ import { EntityManager } from '@mikro-orm/core'
|
|
|
13
13
|
import {
|
|
14
14
|
WorkflowInstance,
|
|
15
15
|
WorkflowBranchInstance,
|
|
16
|
+
WorkflowDefinition,
|
|
16
17
|
StepInstance,
|
|
17
18
|
UserTask,
|
|
18
19
|
WorkflowEvent,
|
|
19
20
|
type StepInstanceStatus,
|
|
20
21
|
type WorkflowStepType,
|
|
21
22
|
} from '../data/entities'
|
|
22
|
-
import {
|
|
23
|
+
import { emitWorkflowsEvent } from '../events'
|
|
24
|
+
import { calculateDueDate, parseDuration } from './duration'
|
|
25
|
+
import {
|
|
26
|
+
CONDITION_STEP_TYPE,
|
|
27
|
+
conditionReadContext,
|
|
28
|
+
evaluateConditionExpression,
|
|
29
|
+
readWaitForConditionConfig,
|
|
30
|
+
} from './condition-handler'
|
|
31
|
+
import { mapAgentResultToContext } from './agent-result-mapping'
|
|
32
|
+
import {
|
|
33
|
+
WORKFLOW_AGENT_OUTCOME_CONTEXT_KEY,
|
|
34
|
+
buildAgentOutcomeContextEntry,
|
|
35
|
+
mapDispositionToAgentOutcome,
|
|
36
|
+
} from './outcome-routing'
|
|
23
37
|
import { logWorkflowEvent } from './event-logger'
|
|
38
|
+
import { DRY_RUN_EVENT_TYPES, isDryRunInstance } from './dry-run'
|
|
24
39
|
import { findDefinitionForInstance } from './find-definition'
|
|
40
|
+
import { resolveDefinitionInterpolationMode, type WorkflowInterpolationMode } from './interpolation-pipeline'
|
|
41
|
+
import {
|
|
42
|
+
collectResolvedEntityTypes,
|
|
43
|
+
flattenTaskText,
|
|
44
|
+
resolveTaskAssignment,
|
|
45
|
+
resolveTaskDeadlineDuration,
|
|
46
|
+
resolveTaskDecisions,
|
|
47
|
+
resolveTaskEntityBindings,
|
|
48
|
+
resolveTaskText,
|
|
49
|
+
type TaskInterpolate,
|
|
50
|
+
} from './task-resolution'
|
|
51
|
+
import { scheduleUserTaskSla } from './task-sla'
|
|
52
|
+
import type { TaskQuickActionInput } from './task-quick-action'
|
|
25
53
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
54
|
+
import { findWorkflowDefinition } from './find-definition'
|
|
55
|
+
import { validateAgainstPorts } from './port-contract'
|
|
56
|
+
import type { WorkflowIoContract } from '../data/validators'
|
|
26
57
|
|
|
27
58
|
const logger = createLogger('workflows')
|
|
28
59
|
|
|
@@ -34,13 +65,18 @@ export interface StepExecutionContext {
|
|
|
34
65
|
workflowContext: Record<string, any>
|
|
35
66
|
userId?: string
|
|
36
67
|
triggerData?: any
|
|
68
|
+
// Populated by executeStep from the loaded definition; absent means lenient.
|
|
69
|
+
interpolationMode?: WorkflowInterpolationMode
|
|
70
|
+
// Populated by executeStep from the loaded definition so task notifications
|
|
71
|
+
// can name the workflow the way its author did.
|
|
72
|
+
workflowName?: string
|
|
37
73
|
}
|
|
38
74
|
|
|
39
75
|
export interface StepExecutionResult {
|
|
40
76
|
status: 'COMPLETED' | 'WAITING' | 'FAILED'
|
|
41
77
|
outputData?: any
|
|
42
78
|
nextSteps?: string[] // For parallel forks (Phase 7)
|
|
43
|
-
waitReason?: 'USER_TASK' | 'SIGNAL' | 'TIMER' | 'FORK'
|
|
79
|
+
waitReason?: 'USER_TASK' | 'SIGNAL' | 'TIMER' | 'FORK' | 'CONDITION'
|
|
44
80
|
error?: string
|
|
45
81
|
}
|
|
46
82
|
|
|
@@ -143,6 +179,49 @@ export async function enterStep(
|
|
|
143
179
|
* @param stepInstance - Step instance to exit
|
|
144
180
|
* @param outputData - Optional output data from step execution
|
|
145
181
|
*/
|
|
182
|
+
/**
|
|
183
|
+
* Announces the BUSINESS milestone a completing step carries, if it carries one.
|
|
184
|
+
*
|
|
185
|
+
* Resolved here rather than plumbed through every `exitStep` caller because a
|
|
186
|
+
* milestone must be announced from EVERY completion path — the inline advance,
|
|
187
|
+
* a signal resume, a task completion, a timer, a condition wake, a parallel
|
|
188
|
+
* branch — and a per-caller argument would silently miss whichever path was
|
|
189
|
+
* added next. Both reads are by primary key and the executor already loaded both
|
|
190
|
+
* rows, so in practice they resolve from the identity map rather than the
|
|
191
|
+
* database.
|
|
192
|
+
*
|
|
193
|
+
* Best-effort by construction: a step that completed HAS completed, and a failure
|
|
194
|
+
* to announce that fact must never undo it.
|
|
195
|
+
*/
|
|
196
|
+
async function emitStepMilestone(em: EntityManager, stepInstance: StepInstance): Promise<void> {
|
|
197
|
+
try {
|
|
198
|
+
const instance = await em.findOne(WorkflowInstance, { id: stepInstance.workflowInstanceId })
|
|
199
|
+
if (!instance) return
|
|
200
|
+
const definition = await em.findOne(WorkflowDefinition, { id: instance.definitionId })
|
|
201
|
+
const stepDef = definition?.definition?.steps?.find((step: any) => step.stepId === stepInstance.stepId)
|
|
202
|
+
const milestoneKey = typeof stepDef?.milestone === 'string' ? stepDef.milestone : null
|
|
203
|
+
if (!milestoneKey) return
|
|
204
|
+
await emitWorkflowsEvent(
|
|
205
|
+
'workflows.instance.milestone_reached',
|
|
206
|
+
{
|
|
207
|
+
instanceId: instance.id,
|
|
208
|
+
workflowId: instance.workflowId,
|
|
209
|
+
milestoneKey,
|
|
210
|
+
// For the trace only. A consumer matches on `milestoneKey`; matching on
|
|
211
|
+
// the step is exactly the coupling the milestone model removes.
|
|
212
|
+
stepId: stepInstance.stepId,
|
|
213
|
+
occurredAt: new Date().toISOString(),
|
|
214
|
+
data: stepInstance.outputData ?? null,
|
|
215
|
+
tenantId: instance.tenantId,
|
|
216
|
+
organizationId: instance.organizationId,
|
|
217
|
+
},
|
|
218
|
+
{ persistent: true },
|
|
219
|
+
)
|
|
220
|
+
} catch {
|
|
221
|
+
// ignore — announcing a milestone can never fail a step that completed
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
146
225
|
export async function exitStep(
|
|
147
226
|
em: EntityManager,
|
|
148
227
|
stepInstance: StepInstance,
|
|
@@ -179,6 +258,55 @@ export async function exitStep(
|
|
|
179
258
|
tenantId: stepInstance.tenantId,
|
|
180
259
|
organizationId: stepInstance.organizationId,
|
|
181
260
|
})
|
|
261
|
+
|
|
262
|
+
await emitStepMilestone(em, stepInstance)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Mark a step instance FAILED and log `STEP_FAILED`.
|
|
267
|
+
*
|
|
268
|
+
* The ONE place a step row becomes FAILED, so a failure the run went on to
|
|
269
|
+
* tolerate leaves the same durable trace a fatal one does. Tolerating a failure
|
|
270
|
+
* is a routing decision, not a reason to forget it happened: without the row and
|
|
271
|
+
* the event there is nothing for the run verdict to be computed from, and
|
|
272
|
+
* rerun-from-step refuses the step it exists for because its latest attempt
|
|
273
|
+
* still reads ACTIVE.
|
|
274
|
+
*
|
|
275
|
+
* Idempotent — a second call on an already-FAILED row is a no-op, so a handler
|
|
276
|
+
* that reported the failure itself never produces two `STEP_FAILED` rows.
|
|
277
|
+
*/
|
|
278
|
+
export async function markStepInstanceFailed(
|
|
279
|
+
em: EntityManager,
|
|
280
|
+
stepInstance: StepInstance,
|
|
281
|
+
failure: {
|
|
282
|
+
error: string
|
|
283
|
+
details?: unknown
|
|
284
|
+
branchInstanceId?: string | null
|
|
285
|
+
userId?: string
|
|
286
|
+
}
|
|
287
|
+
): Promise<void> {
|
|
288
|
+
if (stepInstance.status === 'FAILED') return
|
|
289
|
+
|
|
290
|
+
const now = new Date()
|
|
291
|
+
stepInstance.status = 'FAILED'
|
|
292
|
+
stepInstance.errorData = {
|
|
293
|
+
error: failure.error,
|
|
294
|
+
details: failure.details ?? undefined,
|
|
295
|
+
}
|
|
296
|
+
stepInstance.exitedAt = now
|
|
297
|
+
stepInstance.updatedAt = now
|
|
298
|
+
await em.flush()
|
|
299
|
+
|
|
300
|
+
await logStepEvent(em, {
|
|
301
|
+
workflowInstanceId: stepInstance.workflowInstanceId,
|
|
302
|
+
stepInstanceId: stepInstance.id,
|
|
303
|
+
...(failure.branchInstanceId ? { branchInstanceId: failure.branchInstanceId } : {}),
|
|
304
|
+
eventType: 'STEP_FAILED',
|
|
305
|
+
eventData: { stepId: stepInstance.stepId, error: failure.error },
|
|
306
|
+
...(failure.userId ? { userId: failure.userId } : {}),
|
|
307
|
+
tenantId: stepInstance.tenantId,
|
|
308
|
+
organizationId: stepInstance.organizationId,
|
|
309
|
+
})
|
|
182
310
|
}
|
|
183
311
|
|
|
184
312
|
/**
|
|
@@ -236,7 +364,11 @@ export async function executeStep(
|
|
|
236
364
|
instance,
|
|
237
365
|
stepInstance,
|
|
238
366
|
stepDef,
|
|
239
|
-
|
|
367
|
+
{
|
|
368
|
+
...context,
|
|
369
|
+
interpolationMode: resolveDefinitionInterpolationMode(definition.definition),
|
|
370
|
+
workflowName: definition.workflowName,
|
|
371
|
+
},
|
|
240
372
|
container,
|
|
241
373
|
branch
|
|
242
374
|
)
|
|
@@ -244,6 +376,18 @@ export async function executeStep(
|
|
|
244
376
|
// If step completed, exit it
|
|
245
377
|
if (result.status === 'COMPLETED') {
|
|
246
378
|
await exitStep(em, stepInstance, result.outputData)
|
|
379
|
+
} else if (result.status === 'FAILED') {
|
|
380
|
+
// A handler that REPORTS a failure (`handleAutomatedStep` returns
|
|
381
|
+
// `{status:'FAILED'}` for a failed sync activity) never reaches the catch
|
|
382
|
+
// below, so before this the row stayed ACTIVE for ever and no
|
|
383
|
+
// `STEP_FAILED` was logged — the failure existed only in a value the
|
|
384
|
+
// caller was free to tolerate. The row is now terminal on both paths.
|
|
385
|
+
await markStepInstanceFailed(em, stepInstance, {
|
|
386
|
+
error: result.error ?? 'Step execution failed',
|
|
387
|
+
details: result.outputData,
|
|
388
|
+
branchInstanceId: branch?.id ?? null,
|
|
389
|
+
userId: context.userId,
|
|
390
|
+
})
|
|
247
391
|
}
|
|
248
392
|
|
|
249
393
|
return result
|
|
@@ -260,22 +404,11 @@ export async function executeStep(
|
|
|
260
404
|
})
|
|
261
405
|
|
|
262
406
|
if (failedStepInstance) {
|
|
263
|
-
failedStepInstance
|
|
264
|
-
failedStepInstance.errorData = {
|
|
407
|
+
await markStepInstanceFailed(em, failedStepInstance, {
|
|
265
408
|
error: errorMessage,
|
|
266
409
|
details: error instanceof StepExecutionError ? error.details : undefined,
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
failedStepInstance.updatedAt = new Date()
|
|
270
|
-
await em.flush()
|
|
271
|
-
|
|
272
|
-
await logStepEvent(em, {
|
|
273
|
-
workflowInstanceId: instance.id,
|
|
274
|
-
stepInstanceId: failedStepInstance.id,
|
|
275
|
-
eventType: 'STEP_FAILED',
|
|
276
|
-
eventData: { error: errorMessage },
|
|
277
|
-
tenantId: instance.tenantId,
|
|
278
|
-
organizationId: instance.organizationId,
|
|
410
|
+
branchInstanceId: branch?.id ?? null,
|
|
411
|
+
userId: context.userId,
|
|
279
412
|
})
|
|
280
413
|
}
|
|
281
414
|
} catch (updateError) {
|
|
@@ -338,12 +471,19 @@ async function executeStepByType(
|
|
|
338
471
|
}
|
|
339
472
|
return await handleSubWorkflowStep(em, container, instance, stepInstance, stepDef, context)
|
|
340
473
|
|
|
474
|
+
case 'IF_ELSE':
|
|
475
|
+
case 'SWITCH':
|
|
476
|
+
return handleBranchingStep(stepType)
|
|
477
|
+
|
|
341
478
|
case 'WAIT_FOR_SIGNAL':
|
|
342
479
|
return await handleWaitForSignalStep(em, instance, stepInstance, stepDef, context, branch)
|
|
343
480
|
|
|
344
481
|
case 'WAIT_FOR_TIMER':
|
|
345
482
|
return await handleWaitForTimerStep(em, instance, stepInstance, stepDef, context, branch)
|
|
346
483
|
|
|
484
|
+
case 'WAIT_FOR_CONDITION':
|
|
485
|
+
return await handleWaitForConditionStep(em, instance, stepInstance, stepDef, context, branch)
|
|
486
|
+
|
|
347
487
|
case 'PARALLEL_FORK': {
|
|
348
488
|
// Entering a fork opens branch tokens and parks the root token in the
|
|
349
489
|
// FORKED state; the interleaved loop in the executor drives the branches.
|
|
@@ -416,6 +556,25 @@ function handleEndStep(
|
|
|
416
556
|
}
|
|
417
557
|
}
|
|
418
558
|
|
|
559
|
+
/**
|
|
560
|
+
* Handle IF_ELSE / SWITCH steps - pure transition sugar.
|
|
561
|
+
*
|
|
562
|
+
* Branching nodes carry NO runtime semantics of their own: they behave exactly
|
|
563
|
+
* like an AUTOMATED step with no activities and complete immediately. Every
|
|
564
|
+
* routing decision stays in `findValidTransitions`, which already evaluates the
|
|
565
|
+
* business_rules condition language and orders candidates by priority, so the
|
|
566
|
+
* unconditioned "otherwise" route wins only when no cased route matches.
|
|
567
|
+
*/
|
|
568
|
+
function handleBranchingStep(stepType: 'IF_ELSE' | 'SWITCH'): StepExecutionResult {
|
|
569
|
+
return {
|
|
570
|
+
status: 'COMPLETED',
|
|
571
|
+
outputData: {
|
|
572
|
+
stepType,
|
|
573
|
+
timestamp: new Date().toISOString(),
|
|
574
|
+
},
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
419
578
|
/**
|
|
420
579
|
* Handle AUTOMATED step - execute activities
|
|
421
580
|
*
|
|
@@ -446,7 +605,35 @@ async function handleAutomatedStep(
|
|
|
446
605
|
}
|
|
447
606
|
|
|
448
607
|
// Import activity executor
|
|
449
|
-
const { executeActivities } = await import('./activity-executor')
|
|
608
|
+
const { executeActivities, interpolateVariables } = await import('./activity-executor')
|
|
609
|
+
|
|
610
|
+
// Persist the resolved INVOKE_AGENT input so the run inspector shows what this
|
|
611
|
+
// step actually received. `inputData` was seeded at step entry from the
|
|
612
|
+
// workflow trigger data (null for a manually-started run), never the agent's
|
|
613
|
+
// real, interpolated `config.input` — the same value the executor computes via
|
|
614
|
+
// `interpolateActivityConfig` (a thin wrapper over `interpolateVariables`), so
|
|
615
|
+
// re-interpolating the input field here yields exactly what the agent runs on.
|
|
616
|
+
const agentActivity = activities.find(
|
|
617
|
+
(activity: any) => activity.activityType === 'INVOKE_AGENT' && activity?.config?.input !== undefined,
|
|
618
|
+
)
|
|
619
|
+
if (agentActivity) {
|
|
620
|
+
try {
|
|
621
|
+
const resolvedInput = interpolateVariables(
|
|
622
|
+
(agentActivity as any).config.input,
|
|
623
|
+
context.workflowContext,
|
|
624
|
+
instance,
|
|
625
|
+
{ mode: context.interpolationMode },
|
|
626
|
+
)
|
|
627
|
+
if (resolvedInput !== undefined) {
|
|
628
|
+
stepInstance.inputData = resolvedInput
|
|
629
|
+
stepInstance.updatedAt = new Date()
|
|
630
|
+
await em.flush()
|
|
631
|
+
}
|
|
632
|
+
} catch {
|
|
633
|
+
// Display-only capture: an interpolation error is surfaced by the actual
|
|
634
|
+
// activity run below, so it must never abort the step here.
|
|
635
|
+
}
|
|
636
|
+
}
|
|
450
637
|
|
|
451
638
|
try {
|
|
452
639
|
// Execute activities with proper context
|
|
@@ -456,6 +643,7 @@ async function handleAutomatedStep(
|
|
|
456
643
|
stepContext: { stepId: stepDef.stepId, stepName: stepDef.stepName },
|
|
457
644
|
stepInstanceId: stepInstance.id,
|
|
458
645
|
userId: context.userId,
|
|
646
|
+
interpolationMode: context.interpolationMode,
|
|
459
647
|
})
|
|
460
648
|
|
|
461
649
|
// Check if there are pending async activities
|
|
@@ -504,6 +692,103 @@ async function handleAutomatedStep(
|
|
|
504
692
|
}
|
|
505
693
|
}
|
|
506
694
|
|
|
695
|
+
// INVOKE_AGENT (agent_orchestrator) integration:
|
|
696
|
+
// A `__park` marker means the agent's proposal was routed to a human — park
|
|
697
|
+
// the instance on the signal exactly like handleWaitForSignalStep. The step
|
|
698
|
+
// declares `signalConfig.signalName`, so sendSignal (relaxed) resumes it when
|
|
699
|
+
// agent_orchestrator's dispose path fires `agent_orchestrator.proposal.ready`.
|
|
700
|
+
const parkResult = results.find((r) => r.output && (r.output as any).__park)
|
|
701
|
+
if (parkResult) {
|
|
702
|
+
const signalName = (parkResult.output as any).__park.signalName as string
|
|
703
|
+
const proposalId = (parkResult.output as any).proposalId
|
|
704
|
+
const now = new Date()
|
|
705
|
+
await logStepEvent(em, {
|
|
706
|
+
workflowInstanceId: instance.id,
|
|
707
|
+
stepInstanceId: stepInstance.id,
|
|
708
|
+
...(branch ? { branchInstanceId: branch.id } : {}),
|
|
709
|
+
eventType: 'SIGNAL_AWAITING',
|
|
710
|
+
eventData: { signalName, proposalId, reason: 'INVOKE_AGENT' },
|
|
711
|
+
userId: context.userId,
|
|
712
|
+
tenantId: instance.tenantId,
|
|
713
|
+
organizationId: instance.organizationId,
|
|
714
|
+
})
|
|
715
|
+
if (branch) {
|
|
716
|
+
branch.status = 'PAUSED'
|
|
717
|
+
branch.updatedAt = now
|
|
718
|
+
} else {
|
|
719
|
+
instance.status = 'PAUSED'
|
|
720
|
+
instance.pausedAt = now
|
|
721
|
+
instance.updatedAt = now
|
|
722
|
+
}
|
|
723
|
+
await em.flush()
|
|
724
|
+
return {
|
|
725
|
+
status: 'WAITING',
|
|
726
|
+
waitReason: 'SIGNAL',
|
|
727
|
+
outputData: { signalName, proposalId, awaitingSince: now },
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Inline-resolved agent result (auto_approved / researcher / artifact):
|
|
732
|
+
// surface the disposition into context (top-level, matching the human-path
|
|
733
|
+
// signal merge) so the outgoing transition can branch (effector vs skip)
|
|
734
|
+
// uniformly.
|
|
735
|
+
const inlineAgent = results.find(
|
|
736
|
+
(r) => r.output && typeof (r.output as any).kind === 'string' && 'agentId' in (r.output as any),
|
|
737
|
+
)
|
|
738
|
+
if (inlineAgent && !branch) {
|
|
739
|
+
const out = inlineAgent.output as any
|
|
740
|
+
const agentActivity = activities.find(
|
|
741
|
+
(a: any) => a.activityType === 'INVOKE_AGENT' && a.activityId === inlineAgent.activityId,
|
|
742
|
+
)
|
|
743
|
+
const mappedPatch = mapAgentResultToContext(
|
|
744
|
+
{
|
|
745
|
+
kind: out.kind,
|
|
746
|
+
agentId: out.agentId,
|
|
747
|
+
proposalId: out.proposalId,
|
|
748
|
+
proposalPayload: out.proposalPayload,
|
|
749
|
+
data: out.data,
|
|
750
|
+
artifacts: out.artifacts,
|
|
751
|
+
},
|
|
752
|
+
agentActivity?.config?.outputMapping,
|
|
753
|
+
)
|
|
754
|
+
const contextPatch =
|
|
755
|
+
mappedPatch ??
|
|
756
|
+
(out.kind === 'auto_approved'
|
|
757
|
+
? {
|
|
758
|
+
disposition: 'auto_approved',
|
|
759
|
+
agentProposalId: out.proposalId,
|
|
760
|
+
proposalPayload: out.proposalPayload,
|
|
761
|
+
}
|
|
762
|
+
: out.kind === 'artifact'
|
|
763
|
+
? {
|
|
764
|
+
disposition: 'researcher',
|
|
765
|
+
[`${stepInstance.stepId}_agent`]: { artifacts: out.artifacts, summary: out.summary },
|
|
766
|
+
}
|
|
767
|
+
: null)
|
|
768
|
+
// Outcome routing (spec 7.2): record which of the five fixed disposition
|
|
769
|
+
// kinds this step resolved to under an ENGINE-OWNED context key. The
|
|
770
|
+
// executor routes on this marker alone — never on the author-visible
|
|
771
|
+
// `disposition` key — which is what makes branching on a disposition
|
|
772
|
+
// wiring rather than context string-matching.
|
|
773
|
+
const resolvedOutcome = mapDispositionToAgentOutcome(out.kind)
|
|
774
|
+
const outcomeMarker = resolvedOutcome
|
|
775
|
+
? {
|
|
776
|
+
[WORKFLOW_AGENT_OUTCOME_CONTEXT_KEY]: buildAgentOutcomeContextEntry(
|
|
777
|
+
stepInstance.stepId,
|
|
778
|
+
resolvedOutcome,
|
|
779
|
+
out.proposalId,
|
|
780
|
+
),
|
|
781
|
+
}
|
|
782
|
+
: null
|
|
783
|
+
|
|
784
|
+
const nextContext = { ...instance.context, ...(contextPatch ?? {}), ...(outcomeMarker ?? {}) }
|
|
785
|
+
if (contextPatch || outcomeMarker) {
|
|
786
|
+
instance.context = nextContext
|
|
787
|
+
instance.updatedAt = new Date()
|
|
788
|
+
await em.flush()
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
507
792
|
// All activities completed successfully
|
|
508
793
|
const activityOutputs = results.reduce((acc, r) => {
|
|
509
794
|
if (r.output) {
|
|
@@ -529,6 +814,99 @@ async function handleAutomatedStep(
|
|
|
529
814
|
}
|
|
530
815
|
}
|
|
531
816
|
|
|
817
|
+
/**
|
|
818
|
+
* Resolve a user task's deadline from its authored duration.
|
|
819
|
+
*
|
|
820
|
+
* An unparseable duration fails the step with an actionable message instead of
|
|
821
|
+
* quietly resolving to some default the author never asked for.
|
|
822
|
+
*/
|
|
823
|
+
function resolveUserTaskDeadline(stepId: string, slaDuration: string): Date {
|
|
824
|
+
try {
|
|
825
|
+
return calculateDueDate(slaDuration)
|
|
826
|
+
} catch (error) {
|
|
827
|
+
throw new StepExecutionError(
|
|
828
|
+
`Invalid user task deadline "${slaDuration}": ${error instanceof Error ? error.message : String(error)}`,
|
|
829
|
+
'INVALID_USER_TASK_DEADLINE',
|
|
830
|
+
{ stepId, slaDuration }
|
|
831
|
+
)
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
/**
|
|
836
|
+
* Publish the declared `workflows.task.assigned` domain event for a freshly
|
|
837
|
+
* created task, alongside (never instead of) the internal `USER_TASK_CREATED`
|
|
838
|
+
* audit row. It carries both the individual assignee and the role queue so the
|
|
839
|
+
* notification subscriber can reach role-assigned tasks too.
|
|
840
|
+
*
|
|
841
|
+
* Delivery is at-least-once and consumers must be idempotent; a bus failure
|
|
842
|
+
* must never break workflow execution, so this is strictly best-effort.
|
|
843
|
+
*/
|
|
844
|
+
async function emitTaskAssignedEvent(
|
|
845
|
+
userTask: UserTask,
|
|
846
|
+
instance: WorkflowInstance,
|
|
847
|
+
context: StepExecutionContext,
|
|
848
|
+
quickAction?: TaskQuickActionInput
|
|
849
|
+
): Promise<void> {
|
|
850
|
+
try {
|
|
851
|
+
await emitWorkflowsEvent(
|
|
852
|
+
'workflows.task.assigned',
|
|
853
|
+
{
|
|
854
|
+
// Everything the notification quick-action rule needs, and nothing more.
|
|
855
|
+
// ABSENT means "unknown", and the subscriber falls back to the deep
|
|
856
|
+
// link — a quick action must never be offered on a guess.
|
|
857
|
+
...(quickAction ? { quickAction } : {}),
|
|
858
|
+
taskId: userTask.id,
|
|
859
|
+
taskName: userTask.taskName,
|
|
860
|
+
workflowInstanceId: instance.id,
|
|
861
|
+
workflowId: instance.workflowId,
|
|
862
|
+
workflowName: context.workflowName ?? instance.workflowId,
|
|
863
|
+
assignedUserId: userTask.assignedTo ?? null,
|
|
864
|
+
assignedToRoles: userTask.assignedToRoles ?? null,
|
|
865
|
+
dueDate: userTask.dueDate ? userTask.dueDate.toISOString() : null,
|
|
866
|
+
// Additive: the records the task is about. Modules that own those
|
|
867
|
+
// records subscribe and surface the task on their own turf — the
|
|
868
|
+
// customers module writes a `CustomerTodoLink` from this. Workflows
|
|
869
|
+
// never reaches into another module's tables to do it itself.
|
|
870
|
+
entityBindings: userTask.entityBindings ?? null,
|
|
871
|
+
tenantId: instance.tenantId,
|
|
872
|
+
organizationId: instance.organizationId ?? null,
|
|
873
|
+
},
|
|
874
|
+
{ persistent: true }
|
|
875
|
+
)
|
|
876
|
+
} catch (error) {
|
|
877
|
+
logger.error('Failed to emit workflows.task.assigned', {
|
|
878
|
+
component: 'step-handler',
|
|
879
|
+
taskId: userTask.id,
|
|
880
|
+
err: error,
|
|
881
|
+
})
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
if (userTask.assigneeKind !== 'customer' || !userTask.assignedTo) return
|
|
885
|
+
|
|
886
|
+
try {
|
|
887
|
+
// Addressed to ONE portal principal (`recipientUserId` is what narrows the
|
|
888
|
+
// SSE audience) and carrying an id and nothing else. The receiver asks the
|
|
889
|
+
// authorized portal API what the task is; the bridge never carries the
|
|
890
|
+
// answer, so a mis-scoped connection learns nothing from it.
|
|
891
|
+
await emitWorkflowsEvent(
|
|
892
|
+
'workflows.task.portal_assigned',
|
|
893
|
+
{
|
|
894
|
+
taskId: userTask.id,
|
|
895
|
+
recipientUserId: userTask.assignedTo,
|
|
896
|
+
tenantId: instance.tenantId,
|
|
897
|
+
organizationId: instance.organizationId ?? null,
|
|
898
|
+
},
|
|
899
|
+
{ persistent: false }
|
|
900
|
+
)
|
|
901
|
+
} catch (error) {
|
|
902
|
+
logger.error('Failed to emit workflows.task.portal_assigned', {
|
|
903
|
+
component: 'step-handler',
|
|
904
|
+
taskId: userTask.id,
|
|
905
|
+
err: error,
|
|
906
|
+
})
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
|
|
532
910
|
/**
|
|
533
911
|
* Handle USER_TASK step - create user task and enter waiting state
|
|
534
912
|
*
|
|
@@ -545,29 +923,124 @@ async function handleUserTaskStep(
|
|
|
545
923
|
): Promise<StepExecutionResult> {
|
|
546
924
|
const userTaskConfig = stepDef.userTaskConfig || {}
|
|
547
925
|
|
|
548
|
-
//
|
|
549
|
-
|
|
550
|
-
|
|
926
|
+
// Everything an author can write on a task — its title, its instructions, its
|
|
927
|
+
// decision labels, its dynamic assignee and its entity bindings — is resolved
|
|
928
|
+
// HERE, once, against the context the run has at creation time. Resolving
|
|
929
|
+
// later would let a definition edit retro-change what a running task says.
|
|
930
|
+
// Lenient on purpose: an unresolved dynamic assignee is what the fallback role
|
|
931
|
+
// queue exists for, not a reason to fail the step.
|
|
932
|
+
//
|
|
933
|
+
// Imported dynamically like every other activity-executor use in this file, so
|
|
934
|
+
// the module graph stays acyclic.
|
|
935
|
+
const { interpolateVariables } = await import('./activity-executor')
|
|
936
|
+
const interpolate: TaskInterpolate = (value) =>
|
|
937
|
+
interpolateVariables(value, context.workflowContext, instance)
|
|
938
|
+
|
|
939
|
+
const assignment = resolveTaskAssignment(userTaskConfig, interpolate)
|
|
940
|
+
if (assignment.fellBackToRoles) {
|
|
941
|
+
logger.warn('Dynamic task assignee resolved to nothing; falling back to the role queue', {
|
|
942
|
+
component: 'step-handler',
|
|
943
|
+
stepId: stepDef.stepId,
|
|
944
|
+
workflowInstanceId: instance.id,
|
|
945
|
+
assignedToRoles: assignment.assignedToRoles,
|
|
946
|
+
})
|
|
947
|
+
}
|
|
948
|
+
if (assignment.fellBackFromCustomer) {
|
|
949
|
+
// The author addressed this to a portal principal and no id resolved, so it
|
|
950
|
+
// landed in the backoffice namespace instead. The work is still reachable,
|
|
951
|
+
// but by a different audience than intended — that is worth saying out loud.
|
|
952
|
+
logger.warn('Portal task assignee resolved to nothing; task created for the backoffice instead', {
|
|
953
|
+
component: 'step-handler',
|
|
954
|
+
stepId: stepDef.stepId,
|
|
955
|
+
workflowInstanceId: instance.id,
|
|
956
|
+
})
|
|
957
|
+
}
|
|
551
958
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
959
|
+
const { bindings, unresolved } = resolveTaskEntityBindings(userTaskConfig.entityBindings, interpolate)
|
|
960
|
+
if (unresolved.length) {
|
|
961
|
+
logger.warn('Task entity bindings skipped because their ids did not resolve', {
|
|
962
|
+
component: 'step-handler',
|
|
963
|
+
stepId: stepDef.stepId,
|
|
964
|
+
workflowInstanceId: instance.id,
|
|
965
|
+
unresolved,
|
|
966
|
+
})
|
|
555
967
|
}
|
|
556
968
|
|
|
969
|
+
const taskName = String(interpolate(stepDef.stepName) ?? stepDef.stepName)
|
|
970
|
+
const instructions = resolveTaskText(userTaskConfig.instructions, interpolate)
|
|
971
|
+
const decisions = resolveTaskDecisions(userTaskConfig.decisions, interpolate)
|
|
972
|
+
const deadlineDuration = resolveTaskDeadlineDuration(userTaskConfig)
|
|
973
|
+
|
|
557
974
|
// Create user task
|
|
558
975
|
const now = new Date()
|
|
976
|
+
|
|
977
|
+
// Dry run (spec section 8.2): a simulation raises NO real task. The row is
|
|
978
|
+
// what everything else hangs off — the `workflows.task.assigned` event and
|
|
979
|
+
// therefore the notification subscriber, the SLA reminder/breach queue jobs,
|
|
980
|
+
// and every Work Inbox and task-list query — so suppressing the row is what
|
|
981
|
+
// suppresses all of them, rather than a filter at each read site that a new
|
|
982
|
+
// reader could forget. Everything above still runs, so the report says
|
|
983
|
+
// exactly who the task WOULD have gone to. The step still WAITS: the author
|
|
984
|
+
// simulates the decision through step-through or the advance action.
|
|
985
|
+
if (isDryRunInstance(instance)) {
|
|
986
|
+
await logStepEvent(em, {
|
|
987
|
+
workflowInstanceId: instance.id,
|
|
988
|
+
stepInstanceId: stepInstance.id,
|
|
989
|
+
...(branch ? { branchInstanceId: branch.id } : {}),
|
|
990
|
+
eventType: DRY_RUN_EVENT_TYPES.userTaskSimulated,
|
|
991
|
+
eventData: {
|
|
992
|
+
taskName,
|
|
993
|
+
assignedTo: assignment.assignedTo,
|
|
994
|
+
assignedToRoles: assignment.assignedToRoles,
|
|
995
|
+
assigneeKind: assignment.assigneeKind,
|
|
996
|
+
...(bindings.length ? { entityBindings: bindings } : {}),
|
|
997
|
+
...(decisions.length ? { decisions } : {}),
|
|
998
|
+
...(deadlineDuration ? { deadlineDuration } : {}),
|
|
999
|
+
},
|
|
1000
|
+
tenantId: instance.tenantId,
|
|
1001
|
+
organizationId: instance.organizationId,
|
|
1002
|
+
})
|
|
1003
|
+
|
|
1004
|
+
if (branch) {
|
|
1005
|
+
branch.status = 'PAUSED'
|
|
1006
|
+
branch.updatedAt = now
|
|
1007
|
+
} else {
|
|
1008
|
+
instance.status = 'PAUSED'
|
|
1009
|
+
instance.updatedAt = now
|
|
1010
|
+
}
|
|
1011
|
+
await em.flush()
|
|
1012
|
+
|
|
1013
|
+
return {
|
|
1014
|
+
status: 'WAITING',
|
|
1015
|
+
waitReason: 'USER_TASK',
|
|
1016
|
+
outputData: { simulated: true, wouldRaiseTask: taskName },
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
|
|
559
1020
|
const userTask = em.create(UserTask, {
|
|
560
1021
|
workflowInstanceId: instance.id,
|
|
561
1022
|
stepInstanceId: stepInstance.id,
|
|
562
1023
|
branchInstanceId: branch ? branch.id : null,
|
|
563
|
-
taskName
|
|
564
|
-
description: stepDef.description
|
|
1024
|
+
taskName,
|
|
1025
|
+
description: flattenTaskText(instructions) ?? stepDef.description ?? null,
|
|
565
1026
|
status: 'PENDING',
|
|
566
1027
|
formSchema: userTaskConfig.formSchema || null,
|
|
567
1028
|
formData: null,
|
|
568
|
-
assignedTo: assignedTo,
|
|
569
|
-
|
|
570
|
-
|
|
1029
|
+
assignedTo: assignment.assignedTo,
|
|
1030
|
+
// Decided by `resolveTaskAssignment` from the authored `assigneeKind`, and
|
|
1031
|
+
// `'customer'` only when an individual assignee actually resolved. Written
|
|
1032
|
+
// explicitly rather than left to the column default so the discriminator is
|
|
1033
|
+
// a decision at every creation site, not an accident.
|
|
1034
|
+
assigneeKind: assignment.assigneeKind,
|
|
1035
|
+
assignedToRoles: assignment.assignedToRoles,
|
|
1036
|
+
entityBindings: bindings.length ? bindings : null,
|
|
1037
|
+
// Denormalized from the SAME resolved bindings, so the two can never drift.
|
|
1038
|
+
// Null for a task about nothing, which is what the vacuous-pass rule reads.
|
|
1039
|
+
entityTypes: bindings.length ? collectResolvedEntityTypes(bindings) : null,
|
|
1040
|
+
priority: userTaskConfig.priority ?? null,
|
|
1041
|
+
dueDate: deadlineDuration
|
|
1042
|
+
? resolveUserTaskDeadline(stepDef.stepId, deadlineDuration)
|
|
1043
|
+
: null,
|
|
571
1044
|
tenantId: instance.tenantId,
|
|
572
1045
|
organizationId: instance.organizationId,
|
|
573
1046
|
createdAt: now,
|
|
@@ -587,11 +1060,37 @@ async function handleUserTaskStep(
|
|
|
587
1060
|
taskName: userTask.taskName,
|
|
588
1061
|
assignedTo: userTask.assignedTo,
|
|
589
1062
|
assignedToRoles: userTask.assignedToRoles,
|
|
1063
|
+
...(bindings.length ? { entityBindings: bindings } : {}),
|
|
1064
|
+
...(userTask.priority ? { priority: userTask.priority } : {}),
|
|
1065
|
+
...(decisions.length ? { decisions } : {}),
|
|
1066
|
+
...(assignment.fellBackToRoles ? { assignmentFallback: 'roles' } : {}),
|
|
590
1067
|
},
|
|
591
1068
|
tenantId: instance.tenantId,
|
|
592
1069
|
organizationId: instance.organizationId,
|
|
593
1070
|
})
|
|
594
1071
|
|
|
1072
|
+
await emitTaskAssignedEvent(userTask, instance, context, {
|
|
1073
|
+
decisions: decisions.map((decision) => ({ id: decision.id })),
|
|
1074
|
+
formSchema: userTask.formSchema ?? null,
|
|
1075
|
+
editablePrefilled: userTaskConfig.editablePrefilled ?? null,
|
|
1076
|
+
})
|
|
1077
|
+
|
|
1078
|
+
// Reminders and the deadline breach are scheduled HERE, once, with the
|
|
1079
|
+
// deadline already absolute on each job payload — see `lib/task-sla.ts`. A
|
|
1080
|
+
// task with no deadline schedules nothing at all.
|
|
1081
|
+
await scheduleUserTaskSla({
|
|
1082
|
+
workflowInstanceId: instance.id,
|
|
1083
|
+
stepInstanceId: stepInstance.id,
|
|
1084
|
+
branchInstanceId: branch ? branch.id : null,
|
|
1085
|
+
userTaskId: userTask.id,
|
|
1086
|
+
dueDate: userTask.dueDate ?? null,
|
|
1087
|
+
reminders: userTaskConfig.reminders ?? null,
|
|
1088
|
+
tenantId: instance.tenantId,
|
|
1089
|
+
organizationId: instance.organizationId,
|
|
1090
|
+
userId: context.userId,
|
|
1091
|
+
now,
|
|
1092
|
+
})
|
|
1093
|
+
|
|
595
1094
|
// Pause execution - waits for user task completion. For a branch, only the
|
|
596
1095
|
// branch pauses; sibling branches keep running.
|
|
597
1096
|
if (branch) {
|
|
@@ -636,12 +1135,43 @@ async function handleSubWorkflowStep(
|
|
|
636
1135
|
}
|
|
637
1136
|
|
|
638
1137
|
// Map input data from parent context to child context
|
|
639
|
-
|
|
1138
|
+
let childContext = mapInputData(instance.context, inputMapping || {})
|
|
640
1139
|
|
|
641
1140
|
// Import workflow executor functions
|
|
642
1141
|
const { startWorkflow, executeWorkflow } = await import('./workflow-executor')
|
|
643
1142
|
|
|
644
1143
|
try {
|
|
1144
|
+
// Resolve the child definition to read its declared port contract (if any).
|
|
1145
|
+
// Validation is opt-in by contract presence: only children that declare
|
|
1146
|
+
// `definition.io` ports are checked, so legacy untyped sub-workflows behave
|
|
1147
|
+
// exactly as before.
|
|
1148
|
+
const childDefinition = await findWorkflowDefinition(em, {
|
|
1149
|
+
workflowId: subWorkflowId,
|
|
1150
|
+
version,
|
|
1151
|
+
tenantId: instance.tenantId,
|
|
1152
|
+
organizationId: instance.organizationId,
|
|
1153
|
+
})
|
|
1154
|
+
const ioContract = (childDefinition?.definition as { io?: WorkflowIoContract } | undefined)?.io
|
|
1155
|
+
|
|
1156
|
+
// Validate/coerce mapped inputs against the child's declared input ports.
|
|
1157
|
+
if (ioContract?.inputs?.length) {
|
|
1158
|
+
const { coerced, errors } = validateAgainstPorts(childContext, ioContract.inputs)
|
|
1159
|
+
if (errors.length > 0) {
|
|
1160
|
+
const message = `Sub-workflow input validation failed: ${errors.map((e) => e.message).join('; ')}`
|
|
1161
|
+
await logStepEvent(em, {
|
|
1162
|
+
workflowInstanceId: instance.id,
|
|
1163
|
+
stepInstanceId: stepInstance.id,
|
|
1164
|
+
eventType: 'SUB_WORKFLOW_FAILED',
|
|
1165
|
+
eventData: { subWorkflowId, reason: 'INPUT_VALIDATION', error: message },
|
|
1166
|
+
userId: context.userId,
|
|
1167
|
+
tenantId: instance.tenantId,
|
|
1168
|
+
organizationId: instance.organizationId,
|
|
1169
|
+
})
|
|
1170
|
+
return { status: 'FAILED', error: message }
|
|
1171
|
+
}
|
|
1172
|
+
childContext = coerced
|
|
1173
|
+
}
|
|
1174
|
+
|
|
645
1175
|
// Start child workflow with parent metadata
|
|
646
1176
|
const childInstance = await startWorkflow(em, {
|
|
647
1177
|
workflowId: subWorkflowId,
|
|
@@ -684,8 +1214,23 @@ async function handleSubWorkflowStep(
|
|
|
684
1214
|
|
|
685
1215
|
// Handle child workflow result
|
|
686
1216
|
if (result.status === 'COMPLETED') {
|
|
687
|
-
// Map output data from child context to parent context
|
|
688
|
-
|
|
1217
|
+
// Map output data from child context to parent context (+ io-port
|
|
1218
|
+
// validation). Shared with the async resume path so both apply identical
|
|
1219
|
+
// mapping/validation rules.
|
|
1220
|
+
const mapped = mapSubWorkflowOutput(result.context, outputMapping || {}, ioContract)
|
|
1221
|
+
if (mapped.error) {
|
|
1222
|
+
await logStepEvent(em, {
|
|
1223
|
+
workflowInstanceId: instance.id,
|
|
1224
|
+
stepInstanceId: stepInstance.id,
|
|
1225
|
+
eventType: 'SUB_WORKFLOW_FAILED',
|
|
1226
|
+
eventData: { childInstanceId: childInstance.id, reason: 'OUTPUT_VALIDATION', error: mapped.error },
|
|
1227
|
+
userId: context.userId,
|
|
1228
|
+
tenantId: instance.tenantId,
|
|
1229
|
+
organizationId: instance.organizationId,
|
|
1230
|
+
})
|
|
1231
|
+
return { status: 'FAILED', error: mapped.error }
|
|
1232
|
+
}
|
|
1233
|
+
const outputData = mapped.outputData
|
|
689
1234
|
|
|
690
1235
|
await logStepEvent(em, {
|
|
691
1236
|
workflowInstanceId: instance.id,
|
|
@@ -723,10 +1268,34 @@ async function handleSubWorkflowStep(
|
|
|
723
1268
|
error: `Sub-workflow failed: ${result.errors?.join(', ')}`,
|
|
724
1269
|
}
|
|
725
1270
|
} else {
|
|
726
|
-
//
|
|
1271
|
+
// The child parked at its first async/agent step (RUNNING / PAUSED /
|
|
1272
|
+
// WAITING_FOR_ACTIVITIES). Make the SUB_WORKFLOW step suspendable: park the
|
|
1273
|
+
// parent on SUB_WORKFLOW_SIGNAL_NAME. The child's terminal completeWorkflow
|
|
1274
|
+
// enqueues a resume job that resumes this parent (mirrors the INVOKE_AGENT
|
|
1275
|
+
// __park branch above).
|
|
1276
|
+
const { SUB_WORKFLOW_SIGNAL_NAME } = await import('./activity-executor')
|
|
1277
|
+
const now = new Date()
|
|
1278
|
+
await logStepEvent(em, {
|
|
1279
|
+
workflowInstanceId: instance.id,
|
|
1280
|
+
stepInstanceId: stepInstance.id,
|
|
1281
|
+
eventType: 'SIGNAL_AWAITING',
|
|
1282
|
+
eventData: {
|
|
1283
|
+
signalName: SUB_WORKFLOW_SIGNAL_NAME,
|
|
1284
|
+
childInstanceId: childInstance.id,
|
|
1285
|
+
reason: 'SUB_WORKFLOW',
|
|
1286
|
+
},
|
|
1287
|
+
userId: context.userId,
|
|
1288
|
+
tenantId: instance.tenantId,
|
|
1289
|
+
organizationId: instance.organizationId,
|
|
1290
|
+
})
|
|
1291
|
+
instance.status = 'PAUSED'
|
|
1292
|
+
instance.pausedAt = now
|
|
1293
|
+
instance.updatedAt = now
|
|
1294
|
+
await em.flush()
|
|
727
1295
|
return {
|
|
728
|
-
status: '
|
|
729
|
-
|
|
1296
|
+
status: 'WAITING',
|
|
1297
|
+
waitReason: 'SIGNAL',
|
|
1298
|
+
outputData: { childInstanceId: childInstance.id },
|
|
730
1299
|
}
|
|
731
1300
|
}
|
|
732
1301
|
} catch (error: any) {
|
|
@@ -925,6 +1494,120 @@ async function handleWaitForTimerStep(
|
|
|
925
1494
|
}
|
|
926
1495
|
}
|
|
927
1496
|
|
|
1497
|
+
/**
|
|
1498
|
+
* Handle WAIT_FOR_CONDITION step - pause until a context predicate holds.
|
|
1499
|
+
*
|
|
1500
|
+
* Evaluates the step's ConditionExpression against the token read context. A
|
|
1501
|
+
* predicate that already holds completes the step inline with no queue job at
|
|
1502
|
+
* all. Otherwise the token parks and a delayed `kind: 'condition'` poll job is
|
|
1503
|
+
* enqueued carrying an ABSOLUTE `deadlineAt`, so neither a slow queue nor a
|
|
1504
|
+
* re-enqueue can extend the configured timeout. The event-driven wake
|
|
1505
|
+
* (`conditionHandler.wakeConditionWaiters`) is the fast path on top of it.
|
|
1506
|
+
*/
|
|
1507
|
+
async function handleWaitForConditionStep(
|
|
1508
|
+
em: EntityManager,
|
|
1509
|
+
instance: WorkflowInstance,
|
|
1510
|
+
stepInstance: StepInstance,
|
|
1511
|
+
stepDef: any,
|
|
1512
|
+
context: StepExecutionContext,
|
|
1513
|
+
branch?: WorkflowBranchInstance | null
|
|
1514
|
+
): Promise<StepExecutionResult> {
|
|
1515
|
+
const config = readWaitForConditionConfig(stepDef)
|
|
1516
|
+
|
|
1517
|
+
const data = {
|
|
1518
|
+
...conditionReadContext(instance, branch ?? null),
|
|
1519
|
+
...(context.workflowContext || {}),
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
const met = await evaluateConditionExpression({
|
|
1523
|
+
condition: config.condition,
|
|
1524
|
+
data,
|
|
1525
|
+
instanceId: instance.id,
|
|
1526
|
+
userId: context.userId,
|
|
1527
|
+
})
|
|
1528
|
+
|
|
1529
|
+
const now = new Date()
|
|
1530
|
+
|
|
1531
|
+
if (met) {
|
|
1532
|
+
await logWorkflowEvent(em, {
|
|
1533
|
+
workflowInstanceId: instance.id,
|
|
1534
|
+
stepInstanceId: stepInstance.id,
|
|
1535
|
+
...(branch ? { branchInstanceId: branch.id } : {}),
|
|
1536
|
+
eventType: 'CONDITION_MET',
|
|
1537
|
+
eventData: { stepId: stepDef.stepId, attempts: 1, waitedMs: 0, wokenBy: 'immediate' },
|
|
1538
|
+
userId: context.userId,
|
|
1539
|
+
tenantId: instance.tenantId,
|
|
1540
|
+
organizationId: instance.organizationId,
|
|
1541
|
+
})
|
|
1542
|
+
|
|
1543
|
+
return {
|
|
1544
|
+
status: 'COMPLETED',
|
|
1545
|
+
outputData: {
|
|
1546
|
+
stepType: CONDITION_STEP_TYPE,
|
|
1547
|
+
conditionMet: true,
|
|
1548
|
+
attempts: 1,
|
|
1549
|
+
waitedMs: 0,
|
|
1550
|
+
wokenBy: 'immediate',
|
|
1551
|
+
},
|
|
1552
|
+
}
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1555
|
+
const deadlineAt = new Date(now.getTime() + config.timeoutMs)
|
|
1556
|
+
|
|
1557
|
+
const { enqueueConditionCheckJob } = await import('./activity-executor')
|
|
1558
|
+
const jobId = await enqueueConditionCheckJob({
|
|
1559
|
+
workflowInstanceId: instance.id,
|
|
1560
|
+
stepInstanceId: stepInstance.id,
|
|
1561
|
+
branchInstanceId: branch ? branch.id : undefined,
|
|
1562
|
+
tenantId: instance.tenantId,
|
|
1563
|
+
organizationId: instance.organizationId,
|
|
1564
|
+
userId: context.userId,
|
|
1565
|
+
deadlineAt: deadlineAt.toISOString(),
|
|
1566
|
+
attempt: 1,
|
|
1567
|
+
delayMs: Math.min(config.pollIntervalMs, config.timeoutMs),
|
|
1568
|
+
})
|
|
1569
|
+
|
|
1570
|
+
await logWorkflowEvent(em, {
|
|
1571
|
+
workflowInstanceId: instance.id,
|
|
1572
|
+
stepInstanceId: stepInstance.id,
|
|
1573
|
+
...(branch ? { branchInstanceId: branch.id } : {}),
|
|
1574
|
+
eventType: 'CONDITION_AWAITING',
|
|
1575
|
+
eventData: {
|
|
1576
|
+
stepId: stepDef.stepId,
|
|
1577
|
+
condition: config.condition,
|
|
1578
|
+
deadlineAt: deadlineAt.toISOString(),
|
|
1579
|
+
pollIntervalMs: config.pollIntervalMs,
|
|
1580
|
+
onTimeout: config.onTimeout,
|
|
1581
|
+
jobId,
|
|
1582
|
+
},
|
|
1583
|
+
userId: context.userId,
|
|
1584
|
+
tenantId: instance.tenantId,
|
|
1585
|
+
organizationId: instance.organizationId,
|
|
1586
|
+
})
|
|
1587
|
+
|
|
1588
|
+
if (branch) {
|
|
1589
|
+
branch.status = 'PAUSED'
|
|
1590
|
+
branch.updatedAt = now
|
|
1591
|
+
} else {
|
|
1592
|
+
instance.status = 'PAUSED'
|
|
1593
|
+
instance.pausedAt = now
|
|
1594
|
+
instance.updatedAt = now
|
|
1595
|
+
}
|
|
1596
|
+
await em.flush()
|
|
1597
|
+
|
|
1598
|
+
return {
|
|
1599
|
+
status: 'WAITING',
|
|
1600
|
+
waitReason: 'CONDITION',
|
|
1601
|
+
outputData: {
|
|
1602
|
+
stepType: CONDITION_STEP_TYPE,
|
|
1603
|
+
deadlineAt: deadlineAt.toISOString(),
|
|
1604
|
+
pollIntervalMs: config.pollIntervalMs,
|
|
1605
|
+
onTimeout: config.onTimeout,
|
|
1606
|
+
jobId,
|
|
1607
|
+
},
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1610
|
+
|
|
928
1611
|
// ============================================================================
|
|
929
1612
|
// Helper Functions
|
|
930
1613
|
// ============================================================================
|
|
@@ -956,39 +1639,6 @@ async function logStepEvent(
|
|
|
956
1639
|
return workflowEvent
|
|
957
1640
|
}
|
|
958
1641
|
|
|
959
|
-
/**
|
|
960
|
-
* Calculate due date from ISO 8601 duration string
|
|
961
|
-
*
|
|
962
|
-
* @param duration - ISO 8601 duration (e.g., "P1D" for 1 day)
|
|
963
|
-
* @returns Due date
|
|
964
|
-
*/
|
|
965
|
-
function calculateDueDate(duration: string): Date {
|
|
966
|
-
// Simple implementation for MVP
|
|
967
|
-
// Supports: P1D (1 day), P1H (1 hour), P1W (1 week)
|
|
968
|
-
const now = new Date()
|
|
969
|
-
|
|
970
|
-
const daysMatch = duration.match(/P(\d+)D/)
|
|
971
|
-
if (daysMatch) {
|
|
972
|
-
const days = parseInt(daysMatch[1], 10)
|
|
973
|
-
return new Date(now.getTime() + days * 24 * 60 * 60 * 1000)
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
const hoursMatch = duration.match(/PT(\d+)H/)
|
|
977
|
-
if (hoursMatch) {
|
|
978
|
-
const hours = parseInt(hoursMatch[1], 10)
|
|
979
|
-
return new Date(now.getTime() + hours * 60 * 60 * 1000)
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
const weeksMatch = duration.match(/P(\d+)W/)
|
|
983
|
-
if (weeksMatch) {
|
|
984
|
-
const weeks = parseInt(weeksMatch[1], 10)
|
|
985
|
-
return new Date(now.getTime() + weeks * 7 * 24 * 60 * 60 * 1000)
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
// Default: 1 day
|
|
989
|
-
return new Date(now.getTime() + 24 * 60 * 60 * 1000)
|
|
990
|
-
}
|
|
991
|
-
|
|
992
1642
|
/**
|
|
993
1643
|
* Get nested value from object using dot notation
|
|
994
1644
|
*
|
|
@@ -1064,3 +1714,29 @@ function mapOutputData(
|
|
|
1064
1714
|
// If no mapping provided, pass entire child context
|
|
1065
1715
|
return Object.keys(result).length > 0 ? result : childContext
|
|
1066
1716
|
}
|
|
1717
|
+
|
|
1718
|
+
/**
|
|
1719
|
+
* Map a completed sub-workflow's child context to parent output and validate it
|
|
1720
|
+
* against the child's declared output ports. Shared by the synchronous
|
|
1721
|
+
* (inline) completion branch in `handleSubWorkflowStep` and the async parent
|
|
1722
|
+
* resume path so both apply identical mapping/validation rules. Returns the
|
|
1723
|
+
* mapped `outputData` on success or an `error` message on port-validation
|
|
1724
|
+
* failure (never throws).
|
|
1725
|
+
*/
|
|
1726
|
+
export function mapSubWorkflowOutput(
|
|
1727
|
+
childContext: Record<string, any>,
|
|
1728
|
+
outputMapping: Record<string, string>,
|
|
1729
|
+
ioContract?: WorkflowIoContract
|
|
1730
|
+
): { outputData: Record<string, any>; error?: undefined } | { outputData?: undefined; error: string } {
|
|
1731
|
+
let outputData = mapOutputData(childContext, outputMapping || {})
|
|
1732
|
+
|
|
1733
|
+
if (ioContract?.outputs?.length) {
|
|
1734
|
+
const { coerced, errors } = validateAgainstPorts(outputData, ioContract.outputs)
|
|
1735
|
+
if (errors.length > 0) {
|
|
1736
|
+
return { error: `Sub-workflow output validation failed: ${errors.map((e) => e.message).join('; ')}` }
|
|
1737
|
+
}
|
|
1738
|
+
outputData = coerced
|
|
1739
|
+
}
|
|
1740
|
+
|
|
1741
|
+
return { outputData }
|
|
1742
|
+
}
|