@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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/task-visibility.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Who may see and act on a user task (PURE).\n *\n * Spec \u00A76.4: *a user (backoffice or portal) can see and act on a task iff\n * (assigned, or holds an assigned role, or claims from a role queue) AND passes\n * access checks on the task's bound entities. `workflows.tasks.*` features gate\n * administration (viewing others', reassigning) \u2014 never one's own assigned\n * work.*\n *\n * Written out:\n *\n * visible = SCOPE \u2227 (RELATIONSHIP \u2228 ADMINISTRATIVE) \u2227 ENTITY\n * actable = SCOPE \u2227 RELATIONSHIP \u2227 ENTITY \u2227 workable(status) \u2227 own-the-row\n * claimable = actable \u2227 unassigned \u2227 unclaimed \u2227 PENDING \u2227 role overlap\n *\n * Three properties are the whole design and every change here must preserve\n * them:\n *\n * 1. **A task with no bindings passes the entity clause vacuously \u2014 for\n * backoffice.** `[].every(...)` is `true`, and that is deliberate: every\n * `UserTask` row written before Phase 4 carries zero bindings, so reading\n * \"no bindings \u21D2 deny\" would make the entire existing corpus invisible to\n * its own assignees on upgrade. That is an outage, not a narrowing. A PORTAL\n * principal is the mirror image: they carry no org-membership grant at all,\n * so the binding to their own record IS the authorization and an unbound\n * task is visible to nobody.\n * 2. **Fail-closed applies to resolution failures, never to absence of data.**\n * An unresolvable entity type, a map key the resolver never produced, and a\n * resolver that threw all deny. An empty binding list does not.\n * 3. **Administration widens seeing, never acting.** `workflows.tasks.view_all`\n * and superadmin admit a principal to somebody else's row; they never make\n * it actable. To act, an administrator reassigns it to themselves first,\n * which is audited (`reassigned_by`/`reassigned_at`/`reassign_reason` plus a\n * `WorkflowEvent`). That is what keeps \"who approved this?\" answerable.\n *\n * PURE by contract, like `lib/task-resolution.ts` and `lib/error-routing.ts`:\n * no ORM, no DI, no React, no entity registry. Everything impure \u2014 the ACL\n * load, entity classification, portal ownership expansion, the tenant setting \u2014\n * is resolved ONCE per request by the caller and handed in as data.\n */\n\nimport { isOrganizationAccessAllowed } from '@open-mercato/shared/lib/auth/organizationAccess'\nimport { hasAllFeatures, hasFeature } from '@open-mercato/shared/security/features'\n\n/** Admits a principal to the task API. Necessary, never sufficient. */\nexport const WORKFLOWS_TASKS_VIEW_FEATURE = 'workflows.tasks.view'\n\n/** Administration: read rows you have no relationship to. Never grants act. */\nexport const WORKFLOWS_TASKS_VIEW_ALL_FEATURE = 'workflows.tasks.view_all'\n\n/** Administration: move a row to another assignee or role queue. */\nexport const WORKFLOWS_TASKS_REASSIGN_FEATURE = 'workflows.tasks.reassign'\n\n/**\n * The statuses a task can still be worked in.\n *\n * Deliberately the set `completeUserTask` accepts rather than \"not terminal\":\n * the handler filters on `status IN ('PENDING','IN_PROGRESS')`, so treating an\n * `ESCALATED` row as actable would render a Complete button that always fails.\n * The predicate and the handler must agree or the UI lies.\n */\nexport const TASK_ACTIONABLE_STATUSES: readonly string[] = ['PENDING', 'IN_PROGRESS']\n\nexport type BackofficeTaskPrincipal = {\n kind: 'backoffice'\n userId: string\n tenantId: string\n /** `null` = unrestricted operator (`resolveOrganizationScopeFilter` \u2192 `where: {}`). */\n organizationIds: readonly string[] | null\n /** `auth.roles` \u2014 role NAMES, server-derived, never client-supplied. */\n roleNames: readonly string[]\n /** `rbacService.getGrantedFeatures(...)` \u2014 MAY contain `'*'` / `'workflows.*'`. */\n grantedFeatures: readonly string[]\n isSuperAdmin: boolean\n}\n\nexport type PortalTaskPrincipal = {\n kind: 'portal'\n /** `CustomerAuthContext.sub`. */\n principalId: string\n tenantId: string\n organizationId: string\n /**\n * Record ids this principal may legitimately be the subject of. For a plain\n * portal user: `{customerEntityId, personEntityId}` minus nulls. For a portal\n * admin: the same PLUS every company-member record id, resolved once per\n * request by the route \u2014 never by this module.\n */\n ownedRecordIds: ReadonlySet<string>\n isPortalAdmin: boolean\n}\n\nexport type TaskPrincipal = BackofficeTaskPrincipal | PortalTaskPrincipal\n\nexport type TaskEntityBindingFact = { entityType: string; entityId: string }\n\n/**\n * Per-entity-type answer to \"may this principal view records of this type at\n * all\", produced once per request by `lib/task-entity-access.ts`.\n *\n * A tagged union rather than the design's `string[] | null`, because that shape\n * cannot tell `denied:unknown-entity-type` (the authored type does not resolve\n * to any entity id \u2014 an author's typo) from `denied:entity-access` (it resolves\n * fine, but the caller may not view that type, or the platform has no rule for\n * it). \u00A72.3 and \u00A72.7 both need those apart: the first is a definition bug the\n * Problems panel should flag, the second is a policy decision an administrator\n * is told about. Both still deny.\n *\n * `requires` carries the REQUIRED features, not a verdict, so the wildcard-aware\n * match happens here in the one place that decides anything.\n */\nexport type TaskEntityAccessDecision =\n | { kind: 'requires'; features: readonly string[] }\n | { kind: 'unknown-entity-type' }\n | { kind: 'unavailable' }\n\n/** Keyed by the binding's AUTHORED `entityType`, verbatim \u2014 see `resolveTaskEntityAccess`. */\nexport type TaskEntityAccessMap = ReadonlyMap<string, TaskEntityAccessDecision>\n\nexport type TaskFacts = {\n id: string\n tenantId: string\n organizationId: string\n status: string\n assignedTo: string | null\n /** `'user'` = `assignedTo` names a backoffice user; `'customer'` = a portal principal. */\n assigneeKind: 'user' | 'customer'\n assignedToRoles: readonly string[] | null\n claimedBy: string | null\n entityBindings: readonly TaskEntityBindingFact[]\n /**\n * ACL feature that admits a principal to this row when it is an UNASSIGNED\n * administrative queue item rather than personal work \u2014 declared by the work\n * inbox source that produced it (`WorkInboxSourceProvider.administrativeQueueFeature`).\n * Absent falls back to core's own `workflows.tasks.view_all`.\n */\n administrativeQueueFeature?: string | null\n}\n\nexport type TaskVisibilityPolicy = {\n /** Tenant opt-out. `true` = the \u00A76.4 model (default). `false` = legacy read filter. */\n businessContextEnabled: boolean\n}\n\nexport type TaskVisibilityReason =\n // admits\n | 'assignee'\n | 'claimant'\n | 'role-queue'\n | 'administrative'\n | 'administrative-queue'\n | 'legacy-read-filter'\n | 'portal-assignee'\n | 'portal-company-admin'\n // refusals\n | 'denied:tenant'\n | 'denied:organization'\n | 'denied:no-relationship'\n | 'denied:entity-access'\n | 'denied:unknown-entity-type'\n | 'denied:portal-unbound'\n | 'denied:portal-not-owner'\n | 'denied:portal-wrong-assignee-kind'\n\nexport type TaskVisibilityDecision = {\n visible: boolean\n /** May complete / decide this task. */\n actable: boolean\n /** May claim it off a role queue. A refinement of `actable`, never wider. */\n claimable: boolean\n reason: TaskVisibilityReason\n /**\n * The binding that failed the entity clause, when one did.\n *\n * Set on refusals, where it powers the `view_all`-only 403-with-reason\n * diagnostic \u2014 a task hidden by the entity gate must never disappear without\n * trace. Also set on the `legacy-read-filter` ADMIT, which is the one path\n * that shows a row whose entity clause failed: the opt-out restores the read\n * and nothing else, so the act surfaces need to see that the gate is still\n * closed underneath.\n */\n blockedEntityType?: string\n}\n\nfunction deny(reason: TaskVisibilityReason, blockedEntityType?: string): TaskVisibilityDecision {\n return blockedEntityType\n ? { visible: false, actable: false, claimable: false, reason, blockedEntityType }\n : { visible: false, actable: false, claimable: false, reason }\n}\n\n/**\n * Both sides are role NAMES, not ids.\n *\n * `assignedToRoles` holds what the Studio picker wrote, and `roleNames` is\n * `auth.roles`, derived server-side from the session \u2014 so a client cannot forge\n * membership by claiming a role. Names are tenant-MUTABLE, though: renaming a\n * role silently orphans every assignment authored against the old name, and\n * this comparison is where that shows up. Moving to immutable ids needs a\n * coordinated data + authored-definition migration (`loadAcl` returns no role\n * ids today, so changing only this side would match nothing); it is tracked as\n * a follow-up and stated in `framework/workflows/task-visibility.mdx` \u2192\n * Known Limits.\n */\nfunction hasRoleOverlap(\n taskRoles: readonly string[] | null,\n roleNames: readonly string[],\n): boolean {\n if (!taskRoles || taskRoles.length === 0 || roleNames.length === 0) return false\n const held = new Set(roleNames)\n return taskRoles.some((role) => held.has(role))\n}\n\n/** No assignee, no claimant and no role queue \u2014 nobody's personal work. */\nfunction isUnassignedQueueItem(task: TaskFacts): boolean {\n return (\n task.assignedTo === null &&\n task.claimedBy === null &&\n (task.assignedToRoles === null || task.assignedToRoles.length === 0)\n )\n}\n\ntype EntityClauseResult =\n | { ok: true }\n | { ok: false; reason: 'denied:entity-access' | 'denied:unknown-entity-type'; entityType: string }\n\n/**\n * `every`, not `some`: a task bound to a sensitive deal AND a harmless customer\n * must not leak through the harmless one. The cost is real \u2014 a legitimately\n * assigned worker can be blinded by a binding they cannot see \u2014 and is paid for\n * by the author-time Problems check and the `denied:entity-access` diagnostic\n * rather than by weakening the rule.\n */\nfunction evaluateEntityClause(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n entityAccess: TaskEntityAccessMap,\n): EntityClauseResult {\n // Mirrors `assertEntityAclForRequest`'s own `if (acl?.isSuperAdmin) return`.\n if (principal.isSuperAdmin) return { ok: true }\n for (const binding of task.entityBindings) {\n const decision = entityAccess.get(binding.entityType)\n // A key the resolver never produced is a RESOLUTION FAILURE, never a pass.\n if (!decision) {\n return { ok: false, reason: 'denied:entity-access', entityType: binding.entityType }\n }\n if (decision.kind === 'unknown-entity-type') {\n return { ok: false, reason: 'denied:unknown-entity-type', entityType: binding.entityType }\n }\n if (decision.kind === 'unavailable') {\n return { ok: false, reason: 'denied:entity-access', entityType: binding.entityType }\n }\n if (!hasAllFeatures(principal.grantedFeatures, decision.features)) {\n return { ok: false, reason: 'denied:entity-access', entityType: binding.entityType }\n }\n }\n return { ok: true }\n}\n\n/** The queue feature that admits a principal to this row when it is unassigned. */\nfunction administrativeQueueFeatureOf(task: TaskFacts): string {\n return task.administrativeQueueFeature ?? WORKFLOWS_TASKS_VIEW_ALL_FEATURE\n}\n\nfunction resolveRelationshipReason(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n): TaskVisibilityReason | null {\n if (task.assigneeKind === 'user' && task.assignedTo === principal.userId) return 'assignee'\n if (task.claimedBy !== null && task.claimedBy === principal.userId) return 'claimant'\n if (hasRoleOverlap(task.assignedToRoles, principal.roleNames)) return 'role-queue'\n return null\n}\n\nfunction resolveAdministrativeReason(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n): TaskVisibilityReason | null {\n if (principal.isSuperAdmin) return 'administrative'\n if (hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_ALL_FEATURE)) return 'administrative'\n if (\n isUnassignedQueueItem(task) &&\n hasFeature(principal.grantedFeatures, administrativeQueueFeatureOf(task))\n ) {\n return 'administrative-queue'\n }\n return null\n}\n\n/**\n * Who owns the row right now. A claim outranks an assignment because that is\n * what `completeUserTask` enforces (`claimedBy ?? assignedTo`), and the two must\n * not disagree. `null` means the row is open, and membership in its queue is\n * then what confers the right to act.\n */\nexport function currentTaskOwnerId(task: TaskFacts): string | null {\n if (task.claimedBy !== null) return task.claimedBy\n if (task.assigneeKind === 'user') return task.assignedTo\n return null\n}\n\nfunction decideBackoffice(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n entityAccess: TaskEntityAccessMap,\n policy: TaskVisibilityPolicy,\n): TaskVisibilityDecision {\n // Never overridden \u2014 not by superadmin, not by the tenant opt-out.\n if (task.tenantId !== principal.tenantId) return deny('denied:tenant')\n if (\n !isOrganizationAccessAllowed({\n isSuperAdmin: principal.isSuperAdmin,\n allowedOrganizationIds: principal.organizationIds,\n targetOrganizationId: task.organizationId,\n })\n ) {\n return deny('denied:organization')\n }\n\n const relationshipReason = resolveRelationshipReason(principal, task)\n const administrativeReason = relationshipReason\n ? null\n : resolveAdministrativeReason(principal, task)\n const admitReason = relationshipReason ?? administrativeReason\n\n const entity = evaluateEntityClause(principal, task, entityAccess)\n\n // ACT is computed by the NEW rule always \u2014 the opt-out is a SELECT filter, not\n // an authorization mode, so it can neither widen nor narrow this.\n const owner = currentTaskOwnerId(task)\n const ownsTheRow =\n owner !== null\n ? owner === principal.userId\n : hasRoleOverlap(task.assignedToRoles, principal.roleNames)\n const actable =\n entity.ok &&\n ownsTheRow &&\n task.assigneeKind === 'user' &&\n TASK_ACTIONABLE_STATUSES.includes(task.status)\n const claimable =\n actable &&\n task.assignedTo === null &&\n task.claimedBy === null &&\n task.status === 'PENDING' &&\n hasRoleOverlap(task.assignedToRoles, principal.roleNames)\n\n if (admitReason && entity.ok) {\n return { visible: true, actable, claimable, reason: admitReason }\n }\n\n // The opt-out restores the pre-change READ filter and nothing else: same rows,\n // no entity gate, act path untouched. It is additive on purpose \u2014 it must\n // never hide a row the new model would have shown.\n if (\n !policy.businessContextEnabled &&\n hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_FEATURE)\n ) {\n return {\n visible: true,\n actable,\n claimable,\n reason: 'legacy-read-filter',\n // Reported even though the row is admitted: the read came back, the entity\n // gate did not, and an act surface must be able to tell the difference.\n ...(entity.ok ? {} : { blockedEntityType: entity.entityType }),\n }\n }\n\n // No relationship and no administrative grant discloses less than an entity\n // refusal does, so it is reported first: a caller with no legitimate knowledge\n // that the row exists learns nothing about which entity blocked them.\n if (!admitReason) return deny('denied:no-relationship')\n if (!entity.ok) return deny(entity.reason, entity.entityType)\n return deny('denied:no-relationship')\n}\n\nfunction decidePortal(principal: PortalTaskPrincipal, task: TaskFacts): TaskVisibilityDecision {\n if (task.tenantId !== principal.tenantId) return deny('denied:tenant')\n if (task.organizationId !== principal.organizationId) return deny('denied:organization')\n // Structural: a backoffice task is not portal work, whatever the caller holds.\n if (task.assigneeKind !== 'customer') return deny('denied:portal-wrong-assignee-kind')\n // A portal principal carries no org-membership grant, so an unbound task has\n // nothing tying it to them. Denying is the only correct answer, and it is what\n // keeps every legacy (binding-free) backoffice row out of the portal.\n if (task.entityBindings.length === 0) return deny('denied:portal-unbound')\n\n // A data comparison, never a feature check: `isPortalAdmin` resolves to `['*']`\n // in `customerAuth.ts` and short-circuits `userHasAllFeatures`, so a wildcard\n // must not be able to satisfy ownership. A `Set.has` cannot be wildcarded.\n const ownsEveryBinding = task.entityBindings.every((binding) =>\n principal.ownedRecordIds.has(binding.entityId),\n )\n if (!ownsEveryBinding) return deny('denied:portal-not-owner')\n\n if (task.assignedTo === principal.principalId) {\n const actable = TASK_ACTIONABLE_STATUSES.includes(task.status)\n return { visible: true, actable, claimable: false, reason: 'portal-assignee' }\n }\n\n // Consulted LAST, and only to widen seeing \u2014 a company admin reads their\n // members' work, they never complete it.\n if (principal.isPortalAdmin) {\n return { visible: true, actable: false, claimable: false, reason: 'portal-company-admin' }\n }\n\n return deny('denied:portal-not-owner')\n}\n\n/**\n * The one decision point. Every surface \u2014 list, detail, claim, unclaim,\n * complete, reassign, work inbox, the record-page pending-work widget, the\n * workload aggregate and the portal routes \u2014 routes through this function. A\n * second copy of the rule anywhere is a review failure.\n */\nexport function decideTaskVisibility(\n principal: TaskPrincipal,\n task: TaskFacts,\n entityAccess: TaskEntityAccessMap,\n policy: TaskVisibilityPolicy,\n): TaskVisibilityDecision {\n if (principal.kind === 'portal') return decidePortal(principal, task)\n return decideBackoffice(principal, task, entityAccess, policy)\n}\n\n/**\n * The statuses `reassignUserTask` accepts (`lib/task-handler.ts`\n * `REASSIGNABLE_STATUSES`). Restated here because this module is PURE and the\n * handler is not; the two must agree or the Reassign button lies.\n */\nexport const TASK_REASSIGNABLE_STATUSES: readonly string[] = ['PENDING', 'IN_PROGRESS']\n\n/**\n * The status `releaseUserTask` accepts. It looks the row up with\n * `status: 'IN_PROGRESS'`, so a PENDING row is `TASK_NOT_FOUND` there \u2014 which is\n * narrower than `TASK_ACTIONABLE_STATUSES` and must not be widened to it.\n */\nexport const TASK_RELEASABLE_STATUS = 'IN_PROGRESS'\n\n/**\n * Why an act surface is closed to a caller who CAN read the row.\n *\n * Every value here is derivable from fields the caller already has in the same\n * response (`status`, `assignedTo`, `claimedBy`, `assignedToRoles`), so naming\n * the reason discloses nothing the payload does not. The one deliberate\n * exception is `unavailable`, below.\n */\nexport type TaskActionBlockReason =\n /** Terminal status \u2014 the handler answers `TASK_NOT_FOUND`. */\n | 'not-workable'\n /** Somebody else is the assignee or the claimant \u2014 a 409 on click. */\n | 'owned-by-another'\n /** Open, but queued to a role the caller does not hold. */\n | 'not-in-your-queue'\n /** Nobody's work: no assignee, no claim, no queue \u2014 `TASK_NOT_ACTIONABLE`. */\n | 'unowned'\n /**\n * Refused without a reason, on purpose.\n *\n * Reachable only under the tenant opt-out, which restores the READ and never\n * the act path: the row comes back with `blockedEntityType` set and the act\n * routes answer a bare 404 for it, because \"the entity gate blocked you\" names\n * a binding the gate has just refused this caller. The UI must be exactly as\n * uninformative \u2014 it says the action is unavailable and stops there.\n */\n | 'unavailable'\n\n/**\n * What the page may OFFER, decided here so no client re-derives \u00A76.4.\n *\n * These are booleans, not features: a `workflows.tasks.view_all` administrator\n * holds `workflows.tasks.complete` and still gets `canComplete: false`, because\n * administration widens seeing and never acting. Each flag mirrors the gate its\n * own endpoint applies (`resolveTaskActRefusal` for complete/claim/release,\n * visibility + the reassign feature for reassign), so an offered action is one\n * the server will accept.\n */\nexport type TaskAffordances = {\n canComplete: boolean\n canClaim: boolean\n canRelease: boolean\n canReassign: boolean\n /** Why `canComplete` is false, for a caller who can read the row. */\n actBlockedReason: TaskActionBlockReason | null\n}\n\n/**\n * Resolve the act surfaces for one already-decided row.\n *\n * PURE, and deliberately a projection of `decideTaskVisibility`'s own answer\n * rather than a second evaluation of the rule: `canComplete` IS `actable` and\n * `canClaim` IS `claimable`. Only `canRelease` and `canReassign` add anything,\n * and each adds exactly the one condition its endpoint checks beyond visibility.\n */\nexport function resolveTaskAffordances(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n decision: TaskVisibilityDecision,\n): TaskAffordances {\n // Set on the `legacy-read-filter` ADMIT: the opt-out restored the read and the\n // entity gate is still shut underneath, so every act route answers 404.\n const entityGateClosed = decision.blockedEntityType !== undefined\n const actSurfaceOpen = decision.visible && !entityGateClosed\n\n const canComplete = decision.visible && decision.actable\n const canClaim = decision.visible && decision.claimable\n const canRelease =\n actSurfaceOpen && task.status === TASK_RELEASABLE_STATUS && task.claimedBy === principal.userId\n const canReassign =\n actSurfaceOpen &&\n TASK_REASSIGNABLE_STATUSES.includes(task.status) &&\n (principal.isSuperAdmin ||\n hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_REASSIGN_FEATURE))\n\n return {\n canComplete,\n canClaim,\n canRelease,\n canReassign,\n actBlockedReason: resolveActBlockReason(principal, task, decision, {\n canComplete,\n entityGateClosed,\n }),\n }\n}\n\n/**\n * Mirrors `resolveTaskActRefusal`'s precedence exactly \u2014 entity gate, then\n * status, then ownership \u2014 so the stated reason and the refusal a click would\n * produce can never disagree.\n */\nfunction resolveActBlockReason(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n decision: TaskVisibilityDecision,\n state: { canComplete: boolean; entityGateClosed: boolean },\n): TaskActionBlockReason | null {\n if (state.canComplete) return null\n if (!decision.visible) return null\n if (state.entityGateClosed) return 'unavailable'\n if (!TASK_ACTIONABLE_STATUSES.includes(task.status)) return 'not-workable'\n\n const owner = currentTaskOwnerId(task)\n if (owner !== null) return owner === principal.userId ? 'unavailable' : 'owned-by-another'\n if (task.assignedToRoles !== null && task.assignedToRoles.length > 0) return 'not-in-your-queue'\n return 'unowned'\n}\n\nexport type TaskVisibilityFilterOptions = {\n /**\n * Queue feature for the source being filtered, when it is not core's own\n * `workflows.tasks.view_all`. Supplying it adds the unassigned-queue arm.\n */\n administrativeQueueFeature?: string | null\n}\n\n/**\n * The RELATIONSHIP \u2228 ADMINISTRATIVE half of the rule as ORM conditions, for\n * pushing onto an existing `$and` array (`buildUserTaskWorkInboxWhere` composes\n * independent `$or` groups exactly this way).\n *\n * Returns `[]` when the caller may read everything in scope \u2014 an administrator,\n * a superadmin, or a tenant that has flipped the opt-out.\n *\n * **The ENTITY half is deliberately absent.** The predicate is \"no binding whose\n * type is outside my allowed set\", and the disallowed set is unbounded (authored\n * free text), so it cannot be enumerated as `$contains` negations over the\n * `entity_bindings` jsonb. It becomes a containment test against the\n * denormalized `user_tasks.entity_types` column (design D-2), emitted as one raw\n * fragment where the query is built. Do not try to express it here.\n */\nexport function buildTaskVisibilityConditions(\n principal: BackofficeTaskPrincipal,\n policy: TaskVisibilityPolicy,\n options: TaskVisibilityFilterOptions = {},\n): Record<string, unknown>[] {\n if (principal.isSuperAdmin) return []\n if (hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_ALL_FEATURE)) return []\n if (\n !policy.businessContextEnabled &&\n hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_FEATURE)\n ) {\n return []\n }\n\n const arms: Record<string, unknown>[] = [\n // `assigneeKind` discriminates a backoffice user id from a portal principal\n // id in the same column, so a customer-assigned row can never match a\n // backoffice caller whose user id happens to collide.\n { assignedTo: principal.userId, assigneeKind: 'user' },\n { claimedBy: principal.userId },\n ]\n if (principal.roleNames.length > 0) {\n arms.push({ assignedToRoles: { $overlap: [...principal.roleNames] } })\n }\n\n const queueFeature = options.administrativeQueueFeature\n if (queueFeature && hasFeature(principal.grantedFeatures, queueFeature)) {\n arms.push({\n assignedTo: null,\n claimedBy: null,\n $or: [{ assignedToRoles: null }, { assignedToRoles: { $eq: [] } }],\n })\n }\n\n return [{ $or: arms }]\n}\n\n/**\n * The full `WHERE` for a backoffice principal: tenant, organization and the\n * relationship clause. Same shape as `buildUserTaskWorkInboxWhere`'s output so\n * the two compose.\n *\n * Portal reads do not use this \u2014 they filter on `assignee_kind = 'customer'`\n * plus the caller's owned record ids, which is new surface with its own query.\n */\nexport function buildTaskVisibilityFilter(\n principal: BackofficeTaskPrincipal,\n policy: TaskVisibilityPolicy,\n options: TaskVisibilityFilterOptions = {},\n): Record<string, unknown> {\n const where: Record<string, unknown> = { tenantId: principal.tenantId }\n if (principal.organizationIds !== null) {\n where.organizationId = { $in: [...principal.organizationIds] }\n }\n const conditions = buildTaskVisibilityConditions(principal, policy, options)\n if (conditions.length > 0) where.$and = conditions\n return where\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -161,13 +161,15 @@ async function fireTimer(em, container, options) {
|
|
|
161
161
|
await em.flush();
|
|
162
162
|
return;
|
|
163
163
|
}
|
|
164
|
+
instance.status = "RUNNING";
|
|
165
|
+
await em.flush();
|
|
164
166
|
const transitionResult = await transitionHandler.executeTransition(
|
|
165
167
|
em,
|
|
166
168
|
container,
|
|
167
169
|
instance,
|
|
168
170
|
instance.currentStepId,
|
|
169
171
|
firstValidTransition.transition.toStepId,
|
|
170
|
-
transitionContext
|
|
172
|
+
{ ...transitionContext, transitionId: firstValidTransition.transition.transitionId }
|
|
171
173
|
);
|
|
172
174
|
if (!transitionResult.success) {
|
|
173
175
|
throw new TimerError(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/workflows/lib/timer-handler.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Timer Handler Service\n *\n * Fires timers for WAIT_FOR_TIMER steps: resumes a paused workflow instance\n * when its scheduled timer job is processed by the activity worker.\n */\n\nimport { EntityManager } from '@mikro-orm/core'\nimport type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { WorkflowInstance, WorkflowDefinition, StepInstance } from '../data/entities'\nimport type * as eventLoggerModule from './event-logger'\nimport type * as stepHandlerModule from './step-handler'\nimport type * as transitionHandlerModule from './transition-handler'\nimport type * as workflowExecutorModule from './workflow-executor'\nimport { resolveCodeDefinitionForInstance } from './find-definition'\n\nexport interface FireTimerOptions {\n instanceId: string\n stepInstanceId?: string\n branchInstanceId?: string | null\n userId?: string\n tenantId: string\n organizationId: string\n}\n\nexport class TimerError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: any\n ) {\n super(message)\n this.name = 'TimerError'\n }\n}\n\n/**\n * Fire a timer and resume workflow execution.\n *\n * Mirrors `sendSignal` from signal-handler.ts \u2014 verifies the instance is\n * paused at a WAIT_FOR_TIMER step, logs TIMER_FIRED, exits the step, then\n * executes auto transitions and resumes the workflow.\n */\nexport async function fireTimer(\n em: EntityManager,\n container: AwilixContainer,\n options: FireTimerOptions\n): Promise<void> {\n const { instanceId, stepInstanceId, branchInstanceId, userId, tenantId, organizationId } = options\n\n const eventLogger = container.resolve<typeof eventLoggerModule>('eventLogger')\n const stepHandler = container.resolve<typeof stepHandlerModule>('stepHandler')\n const transitionHandler = container.resolve<typeof transitionHandlerModule>('transitionHandler')\n const workflowExecutor = container.resolve<typeof workflowExecutorModule>('workflowExecutor')\n\n // Branch-scoped timer: the instance is FORKED and the branch is PAUSED at the\n // WAIT_FOR_TIMER step. Resume just that branch, then drive the parallel loop.\n if (branchInstanceId) {\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instanceId,\n stepInstanceId,\n branchInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: { firedAt: new Date().toISOString(), branch: true },\n userId,\n tenantId,\n organizationId,\n })\n const { resumeBranch } = await import('./parallel-handler')\n const resumed = await resumeBranch(em, {\n instanceId,\n branchInstanceId,\n tenantId,\n organizationId,\n exitStepInstanceId: stepInstanceId,\n exitOutput: { firedAt: new Date().toISOString() },\n })\n if (resumed) {\n await workflowExecutor.executeWorkflow(em, container, instanceId, { userId })\n }\n return\n }\n\n const instance = await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowInstance,\n {\n id: instanceId,\n tenantId,\n organizationId,\n },\n undefined,\n { tenantId, organizationId },\n )\n\n if (!instance) {\n throw new TimerError(\n 'Workflow instance not found',\n 'INSTANCE_NOT_FOUND',\n { instanceId }\n )\n }\n\n if (instance.status !== 'PAUSED') {\n throw new TimerError(\n 'Workflow is not paused',\n 'WORKFLOW_NOT_PAUSED',\n { instanceId, status: instance.status }\n )\n }\n\n const definition = (await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowDefinition,\n {\n id: instance.definitionId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )) ?? resolveCodeDefinitionForInstance(instance)\n if (!definition) {\n throw new TimerError(\n 'Workflow definition not found',\n 'DEFINITION_NOT_FOUND',\n { definitionId: instance.definitionId }\n )\n }\n\n const currentStep = definition.definition.steps.find(\n (s: any) => s.stepId === instance.currentStepId\n )\n\n if (!currentStep || currentStep.stepType !== 'WAIT_FOR_TIMER') {\n throw new TimerError(\n 'Workflow is not waiting for timer',\n 'NOT_WAITING_FOR_TIMER',\n { instanceId, currentStepId: instance.currentStepId }\n )\n }\n\n const now = new Date()\n instance.updatedAt = now\n\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n stepInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: {\n stepId: instance.currentStepId,\n firedAt: now.toISOString(),\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n\n const stepInstance = stepInstanceId\n ? await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n id: stepInstanceId,\n workflowInstanceId: instance.id,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n : await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n workflowInstanceId: instance.id,\n stepId: instance.currentStepId,\n status: 'ACTIVE',\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n\n if (stepInstance) {\n await stepHandler.exitStep(em, stepInstance, {\n firedAt: now.toISOString(),\n })\n }\n\n const autoTransitions = (definition.definition.transitions || []).filter(\n (t: any) => t.fromStepId === instance.currentStepId && t.trigger === 'auto'\n )\n\n if (autoTransitions.length === 0) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n const transitionContext = {\n workflowContext: instance.context,\n userId,\n }\n\n const validTransitions = await transitionHandler.findValidTransitions(\n em,\n instance,\n instance.currentStepId,\n transitionContext\n )\n\n const firstValidTransition = validTransitions.find((t) => t.isValid)\n\n if (!firstValidTransition || !firstValidTransition.transition) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n const transitionResult = await transitionHandler.executeTransition(\n em,\n container,\n instance,\n instance.currentStepId,\n firstValidTransition.transition.toStepId,\n transitionContext
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * Timer Handler Service\n *\n * Fires timers for WAIT_FOR_TIMER steps: resumes a paused workflow instance\n * when its scheduled timer job is processed by the activity worker.\n */\n\nimport { EntityManager } from '@mikro-orm/core'\nimport type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { WorkflowInstance, WorkflowDefinition, StepInstance } from '../data/entities'\nimport type * as eventLoggerModule from './event-logger'\nimport type * as stepHandlerModule from './step-handler'\nimport type * as transitionHandlerModule from './transition-handler'\nimport type * as workflowExecutorModule from './workflow-executor'\nimport { resolveCodeDefinitionForInstance } from './find-definition'\n\nexport interface FireTimerOptions {\n instanceId: string\n stepInstanceId?: string\n branchInstanceId?: string | null\n userId?: string\n tenantId: string\n organizationId: string\n}\n\nexport class TimerError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: any\n ) {\n super(message)\n this.name = 'TimerError'\n }\n}\n\n/**\n * Fire a timer and resume workflow execution.\n *\n * Mirrors `sendSignal` from signal-handler.ts \u2014 verifies the instance is\n * paused at a WAIT_FOR_TIMER step, logs TIMER_FIRED, exits the step, then\n * executes auto transitions and resumes the workflow.\n */\nexport async function fireTimer(\n em: EntityManager,\n container: AwilixContainer,\n options: FireTimerOptions\n): Promise<void> {\n const { instanceId, stepInstanceId, branchInstanceId, userId, tenantId, organizationId } = options\n\n const eventLogger = container.resolve<typeof eventLoggerModule>('eventLogger')\n const stepHandler = container.resolve<typeof stepHandlerModule>('stepHandler')\n const transitionHandler = container.resolve<typeof transitionHandlerModule>('transitionHandler')\n const workflowExecutor = container.resolve<typeof workflowExecutorModule>('workflowExecutor')\n\n // Branch-scoped timer: the instance is FORKED and the branch is PAUSED at the\n // WAIT_FOR_TIMER step. Resume just that branch, then drive the parallel loop.\n if (branchInstanceId) {\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instanceId,\n stepInstanceId,\n branchInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: { firedAt: new Date().toISOString(), branch: true },\n userId,\n tenantId,\n organizationId,\n })\n const { resumeBranch } = await import('./parallel-handler')\n const resumed = await resumeBranch(em, {\n instanceId,\n branchInstanceId,\n tenantId,\n organizationId,\n exitStepInstanceId: stepInstanceId,\n exitOutput: { firedAt: new Date().toISOString() },\n })\n if (resumed) {\n await workflowExecutor.executeWorkflow(em, container, instanceId, { userId })\n }\n return\n }\n\n const instance = await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowInstance,\n {\n id: instanceId,\n tenantId,\n organizationId,\n },\n undefined,\n { tenantId, organizationId },\n )\n\n if (!instance) {\n throw new TimerError(\n 'Workflow instance not found',\n 'INSTANCE_NOT_FOUND',\n { instanceId }\n )\n }\n\n if (instance.status !== 'PAUSED') {\n throw new TimerError(\n 'Workflow is not paused',\n 'WORKFLOW_NOT_PAUSED',\n { instanceId, status: instance.status }\n )\n }\n\n const definition = (await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowDefinition,\n {\n id: instance.definitionId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )) ?? resolveCodeDefinitionForInstance(instance)\n if (!definition) {\n throw new TimerError(\n 'Workflow definition not found',\n 'DEFINITION_NOT_FOUND',\n { definitionId: instance.definitionId }\n )\n }\n\n const currentStep = definition.definition.steps.find(\n (s: any) => s.stepId === instance.currentStepId\n )\n\n if (!currentStep || currentStep.stepType !== 'WAIT_FOR_TIMER') {\n throw new TimerError(\n 'Workflow is not waiting for timer',\n 'NOT_WAITING_FOR_TIMER',\n { instanceId, currentStepId: instance.currentStepId }\n )\n }\n\n const now = new Date()\n instance.updatedAt = now\n\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n stepInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: {\n stepId: instance.currentStepId,\n firedAt: now.toISOString(),\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n\n const stepInstance = stepInstanceId\n ? await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n id: stepInstanceId,\n workflowInstanceId: instance.id,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n : await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n workflowInstanceId: instance.id,\n stepId: instance.currentStepId,\n status: 'ACTIVE',\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n\n if (stepInstance) {\n await stepHandler.exitStep(em, stepInstance, {\n firedAt: now.toISOString(),\n })\n }\n\n const autoTransitions = (definition.definition.transitions || []).filter(\n (t: any) => t.fromStepId === instance.currentStepId && t.trigger === 'auto'\n )\n\n if (autoTransitions.length === 0) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n const transitionContext = {\n workflowContext: instance.context,\n userId,\n }\n\n const validTransitions = await transitionHandler.findValidTransitions(\n em,\n instance,\n instance.currentStepId,\n transitionContext\n )\n\n const firstValidTransition = validTransitions.find((t) => t.isValid)\n\n if (!firstValidTransition || !firstValidTransition.transition) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n // Resume from the paused wait BEFORE executing the transition, exactly as\n // `sendSignal` does. Without it the executor's defense-in-depth PAUSED check\n // stops the run at the very first step the timer traverses, so the instance\n // sits at that step (typically END) as PAUSED and never completes.\n instance.status = 'RUNNING'\n await em.flush()\n\n const transitionResult = await transitionHandler.executeTransition(\n em,\n container,\n instance,\n instance.currentStepId,\n firstValidTransition.transition.toStepId,\n { ...transitionContext, transitionId: firstValidTransition.transition.transitionId },\n )\n\n if (!transitionResult.success) {\n throw new TimerError(\n 'Transition failed after timer fired',\n 'TRANSITION_FAILED',\n { error: transitionResult.error }\n )\n }\n\n await workflowExecutor.executeWorkflow(em, container, instance.id, { userId })\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,6 +6,13 @@ import * as ruleEngine from "../../business_rules/lib/rule-engine.js";
|
|
|
6
6
|
import * as activityExecutor from "./activity-executor.js";
|
|
7
7
|
import * as stepHandler from "./step-handler.js";
|
|
8
8
|
import { findDefinitionForInstance } from "./find-definition.js";
|
|
9
|
+
import { resolveDefinitionInterpolationMode } from "./interpolation-pipeline.js";
|
|
10
|
+
import { buildSetVariableContextPatch, isSetVariableOutput } from "./set-variable.js";
|
|
11
|
+
import {
|
|
12
|
+
resolveStepFailureHandling
|
|
13
|
+
} from "./error-routing.js";
|
|
14
|
+
import { DRY_RUN_EVENT_TYPES, isDryRunInstance } from "./dry-run.js";
|
|
15
|
+
import { excludeNonNormalTransitions } from "./route-kinds.js";
|
|
9
16
|
import {
|
|
10
17
|
rootToken,
|
|
11
18
|
tokenBranchInstanceId,
|
|
@@ -19,6 +26,33 @@ import {
|
|
|
19
26
|
} from "./execution-token.js";
|
|
20
27
|
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
21
28
|
const logger = createLogger("workflows");
|
|
29
|
+
function buildFailureRouting(handling, failedStepId) {
|
|
30
|
+
if (handling.kind === "route" && typeof handling.transition.toStepId === "string") {
|
|
31
|
+
return {
|
|
32
|
+
failedStepId,
|
|
33
|
+
errorRoute: {
|
|
34
|
+
transitionId: handling.transition.transitionId,
|
|
35
|
+
toStepId: handling.transition.toStepId
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (handling.kind === "park") {
|
|
40
|
+
return { failedStepId, parkForAttention: true };
|
|
41
|
+
}
|
|
42
|
+
if (handling.kind === "handlerStep") {
|
|
43
|
+
return { failedStepId, errorHandlerStepId: handling.stepId };
|
|
44
|
+
}
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
async function logSuppressedRuleActions(em, instance, ruleId, phase) {
|
|
48
|
+
await logTransitionEvent(em, {
|
|
49
|
+
workflowInstanceId: instance.id,
|
|
50
|
+
eventType: DRY_RUN_EVENT_TYPES.businessRuleActionsSuppressed,
|
|
51
|
+
eventData: { ruleId, phase },
|
|
52
|
+
tenantId: instance.tenantId,
|
|
53
|
+
organizationId: instance.organizationId
|
|
54
|
+
});
|
|
55
|
+
}
|
|
22
56
|
class TransitionError extends Error {
|
|
23
57
|
constructor(message, code, details) {
|
|
24
58
|
super(message);
|
|
@@ -42,7 +76,7 @@ async function evaluateTransition(em, instance, fromStepId, toStepId, context) {
|
|
|
42
76
|
let transition;
|
|
43
77
|
if (toStepId) {
|
|
44
78
|
transition = transitions.find(
|
|
45
|
-
(
|
|
79
|
+
(candidate) => candidate.fromStepId === fromStepId && candidate.toStepId === toStepId && (context.transitionId === void 0 || candidate.transitionId === context.transitionId)
|
|
46
80
|
);
|
|
47
81
|
if (!transition) {
|
|
48
82
|
return {
|
|
@@ -52,7 +86,7 @@ async function evaluateTransition(em, instance, fromStepId, toStepId, context) {
|
|
|
52
86
|
};
|
|
53
87
|
}
|
|
54
88
|
} else {
|
|
55
|
-
const availableTransitions = transitions.filter(
|
|
89
|
+
const availableTransitions = excludeNonNormalTransitions(transitions).filter(
|
|
56
90
|
(t) => t.fromStepId === fromStepId
|
|
57
91
|
);
|
|
58
92
|
if (availableTransitions.length === 0) {
|
|
@@ -108,7 +142,7 @@ async function findValidTransitions(em, instance, fromStepId, context) {
|
|
|
108
142
|
if (!definition) {
|
|
109
143
|
return [];
|
|
110
144
|
}
|
|
111
|
-
const transitions = (definition.definition.transitions || []).filter((t) => t.fromStepId === fromStepId).sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
145
|
+
const transitions = excludeNonNormalTransitions(definition.definition.transitions || []).filter((t) => t.fromStepId === fromStepId).sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
112
146
|
const results = [];
|
|
113
147
|
for (const transition of transitions) {
|
|
114
148
|
const conditionResult = await evaluateTransition(
|
|
@@ -116,7 +150,7 @@ async function findValidTransitions(em, instance, fromStepId, context) {
|
|
|
116
150
|
instance,
|
|
117
151
|
fromStepId,
|
|
118
152
|
transition.toStepId,
|
|
119
|
-
context
|
|
153
|
+
{ ...context, transitionId: transition.transitionId }
|
|
120
154
|
);
|
|
121
155
|
if (!conditionResult.isValid) {
|
|
122
156
|
results.push(conditionResult);
|
|
@@ -222,6 +256,7 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
|
|
|
222
256
|
let activityOutputs = {};
|
|
223
257
|
const activityResults = [];
|
|
224
258
|
if (transition.activities && transition.activities.length > 0) {
|
|
259
|
+
const definitionForInterpolation = await findDefinitionForInstance(em, instance);
|
|
225
260
|
const activityContext = {
|
|
226
261
|
workflowInstance: instance,
|
|
227
262
|
workflowContext: {
|
|
@@ -229,7 +264,8 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
|
|
|
229
264
|
...context.workflowContext
|
|
230
265
|
},
|
|
231
266
|
branchInstanceId,
|
|
232
|
-
userId: context.userId
|
|
267
|
+
userId: context.userId,
|
|
268
|
+
interpolationMode: resolveDefinitionInterpolationMode(definitionForInterpolation?.definition)
|
|
233
269
|
};
|
|
234
270
|
const results = await activityExecutor.executeActivities(
|
|
235
271
|
em,
|
|
@@ -240,6 +276,14 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
|
|
|
240
276
|
activityResults.push(...results);
|
|
241
277
|
const failedActivities = results.filter((r) => !r.success);
|
|
242
278
|
if (failedActivities.length > 0) {
|
|
279
|
+
const refusal = failedActivities.find((result) => result.dryRunRefused);
|
|
280
|
+
if (refusal) {
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
error: refusal.error ?? "Dry run stopped",
|
|
284
|
+
conditionsEvaluated: { preConditions: true, postConditions: false }
|
|
285
|
+
};
|
|
286
|
+
}
|
|
243
287
|
const continueOnFailure = transition.continueOnActivityFailure ?? false;
|
|
244
288
|
await logTransitionEvent(em, {
|
|
245
289
|
workflowInstanceId: instance.id,
|
|
@@ -261,20 +305,57 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
|
|
|
261
305
|
organizationId: instance.organizationId
|
|
262
306
|
});
|
|
263
307
|
if (!continueOnFailure) {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
308
|
+
const failureHandling = resolveStepFailureHandling(
|
|
309
|
+
definitionForInterpolation?.definition,
|
|
310
|
+
fromStepId
|
|
311
|
+
);
|
|
312
|
+
if (failureHandling.kind === "continue") {
|
|
313
|
+
await logTransitionEvent(em, {
|
|
314
|
+
workflowInstanceId: instance.id,
|
|
315
|
+
branchInstanceId,
|
|
316
|
+
eventType: "ERROR_DIRECTIVE_APPLIED",
|
|
317
|
+
eventData: {
|
|
318
|
+
stepId: fromStepId,
|
|
319
|
+
directive: "continueWithFallback",
|
|
320
|
+
transitionId: transition.transitionId || `${fromStepId}->${toStepId}`,
|
|
321
|
+
hasFallbackValue: failureHandling.fallbackValue !== void 0
|
|
322
|
+
},
|
|
323
|
+
userId: context.userId,
|
|
324
|
+
tenantId: instance.tenantId,
|
|
325
|
+
organizationId: instance.organizationId
|
|
326
|
+
});
|
|
327
|
+
if (failureHandling.fallbackValue !== void 0) {
|
|
328
|
+
activityOutputs[fromStepId] = failureHandling.fallbackValue;
|
|
270
329
|
}
|
|
271
|
-
}
|
|
330
|
+
} else {
|
|
331
|
+
return {
|
|
332
|
+
success: false,
|
|
333
|
+
error: `Activities failed: ${failedActivities.map((f) => f.error).join(", ")}`,
|
|
334
|
+
conditionsEvaluated: {
|
|
335
|
+
preConditions: true,
|
|
336
|
+
postConditions: false
|
|
337
|
+
},
|
|
338
|
+
...buildFailureRouting(failureHandling, fromStepId)
|
|
339
|
+
};
|
|
340
|
+
}
|
|
272
341
|
}
|
|
273
342
|
}
|
|
274
343
|
results.forEach((result) => {
|
|
275
344
|
if (result.success && result.output) {
|
|
276
|
-
|
|
277
|
-
|
|
345
|
+
if (result.activityType === "SET_VARIABLE" && isSetVariableOutput(result.output)) {
|
|
346
|
+
const assignmentBase = {
|
|
347
|
+
...tokenReadContext(token),
|
|
348
|
+
...context.workflowContext,
|
|
349
|
+
...activityOutputs
|
|
350
|
+
};
|
|
351
|
+
Object.assign(
|
|
352
|
+
activityOutputs,
|
|
353
|
+
buildSetVariableContextPatch(assignmentBase, result.output.assignments)
|
|
354
|
+
);
|
|
355
|
+
} else {
|
|
356
|
+
const key = result.activityName || result.activityType;
|
|
357
|
+
activityOutputs[key] = result.output;
|
|
358
|
+
}
|
|
278
359
|
}
|
|
279
360
|
});
|
|
280
361
|
}
|
|
@@ -335,11 +416,37 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
|
|
|
335
416
|
);
|
|
336
417
|
await em.flush();
|
|
337
418
|
if (stepExecutionResult.status === "FAILED") {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
419
|
+
const definitionForFailure = await findDefinitionForInstance(em, instance);
|
|
420
|
+
const failureHandling = resolveStepFailureHandling(definitionForFailure?.definition, toStepId);
|
|
421
|
+
if (failureHandling.kind === "continue") {
|
|
422
|
+
await logTransitionEvent(em, {
|
|
423
|
+
workflowInstanceId: instance.id,
|
|
424
|
+
branchInstanceId,
|
|
425
|
+
eventType: "ERROR_DIRECTIVE_APPLIED",
|
|
426
|
+
eventData: {
|
|
427
|
+
stepId: toStepId,
|
|
428
|
+
directive: "continueWithFallback",
|
|
429
|
+
transitionId: transition.transitionId || `${fromStepId}->${toStepId}`,
|
|
430
|
+
error: stepExecutionResult.error,
|
|
431
|
+
hasFallbackValue: failureHandling.fallbackValue !== void 0
|
|
432
|
+
},
|
|
433
|
+
userId: context.userId,
|
|
434
|
+
tenantId: instance.tenantId,
|
|
435
|
+
organizationId: instance.organizationId
|
|
436
|
+
});
|
|
437
|
+
if (failureHandling.fallbackValue !== void 0) {
|
|
438
|
+
mergeTokenContext(token, { [toStepId]: failureHandling.fallbackValue });
|
|
439
|
+
await em.flush();
|
|
440
|
+
}
|
|
441
|
+
} else {
|
|
442
|
+
return {
|
|
443
|
+
success: false,
|
|
444
|
+
error: stepExecutionResult.error || "Step execution failed",
|
|
445
|
+
...buildFailureRouting(failureHandling, toStepId)
|
|
446
|
+
};
|
|
447
|
+
}
|
|
342
448
|
}
|
|
449
|
+
const stepPaused = stepExecutionResult.status === "WAITING" && stepExecutionResult.waitReason !== "FORK";
|
|
343
450
|
const postConditionsResult = await evaluatePostConditions(
|
|
344
451
|
em,
|
|
345
452
|
instance,
|
|
@@ -385,6 +492,7 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
|
|
|
385
492
|
return {
|
|
386
493
|
success: true,
|
|
387
494
|
nextStepId: toStepId,
|
|
495
|
+
paused: stepPaused,
|
|
388
496
|
conditionsEvaluated: {
|
|
389
497
|
preConditions: true,
|
|
390
498
|
postConditions: postConditionsResult.allowed
|
|
@@ -463,6 +571,7 @@ async function evaluatePreConditions(em, instance, transition, context, eventBus
|
|
|
463
571
|
totalExecutionTime: 0
|
|
464
572
|
};
|
|
465
573
|
}
|
|
574
|
+
const dryRun = isDryRunInstance(instance);
|
|
466
575
|
const startTime = Date.now();
|
|
467
576
|
const executedRules = [];
|
|
468
577
|
const errors = [];
|
|
@@ -488,8 +597,17 @@ async function evaluatePreConditions(em, instance, transition, context, eventBus
|
|
|
488
597
|
executedBy: context.userId,
|
|
489
598
|
entityType: `workflow:${definition.workflowId}:transition`,
|
|
490
599
|
entityId: transition.transitionId || `${transition.fromStepId}->${transition.toStepId}`,
|
|
491
|
-
eventType: "pre_transition"
|
|
600
|
+
eventType: "pre_transition",
|
|
601
|
+
// Dry run (spec section 8.2): the rule engine's own `dryRun` only
|
|
602
|
+
// suppresses its execution LOG — a rule's success/failure ACTIONS run
|
|
603
|
+
// regardless — so a side-effect-free run has to ask for `skipActions`.
|
|
604
|
+
// The conditions still evaluate, so the run takes the routes it really
|
|
605
|
+
// would; only the ACTION arm is withheld, and it is reported.
|
|
606
|
+
skipActions: dryRun
|
|
492
607
|
});
|
|
608
|
+
if (dryRun && result.actionsExecuted === null) {
|
|
609
|
+
await logSuppressedRuleActions(em, instance, condition.ruleId, "pre_transition");
|
|
610
|
+
}
|
|
493
611
|
const ruleResult = {
|
|
494
612
|
rule: {
|
|
495
613
|
ruleId: result.ruleId,
|
|
@@ -551,6 +669,7 @@ async function evaluatePostConditions(em, instance, transition, context, eventBu
|
|
|
551
669
|
totalExecutionTime: 0
|
|
552
670
|
};
|
|
553
671
|
}
|
|
672
|
+
const dryRun = isDryRunInstance(instance);
|
|
554
673
|
const startTime = Date.now();
|
|
555
674
|
const executedRules = [];
|
|
556
675
|
const errors = [];
|
|
@@ -576,8 +695,17 @@ async function evaluatePostConditions(em, instance, transition, context, eventBu
|
|
|
576
695
|
executedBy: context.userId,
|
|
577
696
|
entityType: `workflow:${definition.workflowId}:transition`,
|
|
578
697
|
entityId: transition.transitionId || `${transition.fromStepId}->${transition.toStepId}`,
|
|
579
|
-
eventType: "post_transition"
|
|
698
|
+
eventType: "post_transition",
|
|
699
|
+
// Dry run (spec section 8.2): the rule engine's own `dryRun` only
|
|
700
|
+
// suppresses its execution LOG — a rule's success/failure ACTIONS run
|
|
701
|
+
// regardless — so a side-effect-free run has to ask for `skipActions`.
|
|
702
|
+
// The conditions still evaluate, so the run takes the routes it really
|
|
703
|
+
// would; only the ACTION arm is withheld, and it is reported.
|
|
704
|
+
skipActions: dryRun
|
|
580
705
|
});
|
|
706
|
+
if (dryRun && result.actionsExecuted === null) {
|
|
707
|
+
await logSuppressedRuleActions(em, instance, condition.ruleId, "post_transition");
|
|
708
|
+
}
|
|
581
709
|
const ruleResult = {
|
|
582
710
|
rule: {
|
|
583
711
|
ruleId: result.ruleId,
|