@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
|
@@ -23,12 +23,54 @@ import {
|
|
|
23
23
|
} from '@open-mercato/shared/lib/url-safety'
|
|
24
24
|
import { parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'
|
|
25
25
|
import { isPrivateCrossProcessBroadcastEvent } from '@open-mercato/shared/modules/events'
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
26
|
+
import { hasAllFeatures } from '@open-mercato/shared/security/features'
|
|
27
|
+
import {
|
|
28
|
+
definitionDeclaresGrant,
|
|
29
|
+
resolveWorkflowDefinitionExecutionUserId,
|
|
30
|
+
} from './definition-grant'
|
|
31
|
+
import {
|
|
32
|
+
callWebhookConfigSchema,
|
|
33
|
+
invokeAgentConfigSchema,
|
|
34
|
+
setVariableConfigSchema,
|
|
35
|
+
} from '../data/activity-config-schemas'
|
|
36
|
+
import {
|
|
37
|
+
buildSetVariableContextPatch,
|
|
38
|
+
isSetVariableOutput,
|
|
39
|
+
splitAssignmentPath,
|
|
40
|
+
type SetVariableOutput,
|
|
41
|
+
} from './set-variable'
|
|
42
|
+
import {
|
|
43
|
+
DRY_RUN_EVENT_TYPES,
|
|
44
|
+
WorkflowDryRunRefusalError,
|
|
45
|
+
isDryRunInstance,
|
|
46
|
+
isDryRunRefusal,
|
|
47
|
+
} from './dry-run'
|
|
48
|
+
import {
|
|
49
|
+
applyTransforms,
|
|
50
|
+
parseInterpolationToken,
|
|
51
|
+
type WorkflowInterpolationMode,
|
|
52
|
+
} from './interpolation-pipeline'
|
|
53
|
+
|
|
54
|
+
export { resolveDefinitionInterpolationMode, type WorkflowInterpolationMode } from './interpolation-pipeline'
|
|
55
|
+
import {
|
|
56
|
+
WorkflowActivityJob,
|
|
57
|
+
WorkflowActivityJobInvokeAgent,
|
|
58
|
+
WORKFLOW_ACTIVITIES_QUEUE_NAME,
|
|
59
|
+
WORKFLOW_INVOKE_AGENT_QUEUE_NAME,
|
|
60
|
+
} from './activity-queue-types'
|
|
61
|
+
import './activity-registry-bootstrap'
|
|
62
|
+
import { bindActivityExecutor } from './activity-types'
|
|
63
|
+
import { getActivityType } from './activity-registry'
|
|
28
64
|
import { logWorkflowEvent } from './event-logger'
|
|
29
|
-
import { parseDuration } from './duration'
|
|
65
|
+
import { calculateWaitDelayMs, parseDuration } from './duration'
|
|
66
|
+
|
|
67
|
+
export { calculateWaitDelayMs } from './duration'
|
|
30
68
|
import { resolveActivityTimeoutMs } from './activityTimeoutFields'
|
|
31
69
|
import { getWorkflowSafeCommand } from './workflow-safe-commands'
|
|
70
|
+
import { isWorkflowCommandEnabled } from './workflow-command-enablement'
|
|
71
|
+
import { resolveWorkflowCommandPolicyForContainer } from './workflow-command-settings'
|
|
72
|
+
import { resolveAgentReview, toAgentDispositionReview } from './agent-review'
|
|
73
|
+
import type { AgentDispositionReview } from './agent-disposition-task'
|
|
32
74
|
|
|
33
75
|
export { isPrivateUrl } from '@open-mercato/shared/lib/network'
|
|
34
76
|
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
@@ -79,14 +121,6 @@ function getWorkflowEnvInterpolationAllowlist(): Set<string> {
|
|
|
79
121
|
return allowlist
|
|
80
122
|
}
|
|
81
123
|
|
|
82
|
-
function resolveWorkflowEnvInterpolation(envKey: string): string {
|
|
83
|
-
if (!getWorkflowEnvInterpolationAllowlist().has(envKey)) {
|
|
84
|
-
return ''
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return process.env[envKey] ?? ''
|
|
88
|
-
}
|
|
89
|
-
|
|
90
124
|
// ============================================================================
|
|
91
125
|
// Types and Interfaces
|
|
92
126
|
// ============================================================================
|
|
@@ -99,6 +133,50 @@ export type ActivityType =
|
|
|
99
133
|
| 'CALL_WEBHOOK'
|
|
100
134
|
| 'EXECUTE_FUNCTION'
|
|
101
135
|
| 'WAIT'
|
|
136
|
+
| 'SET_VARIABLE'
|
|
137
|
+
| 'INVOKE_AGENT'
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Signal name the INVOKE_AGENT step parks on when a proposal is routed to a
|
|
141
|
+
* human. agent_orchestrator's proposal-dispose path emits
|
|
142
|
+
* `agent_orchestrator.proposal.ready` and calls workflows `sendSignal` with this
|
|
143
|
+
* name to resume the parked step.
|
|
144
|
+
*/
|
|
145
|
+
export const INVOKE_AGENT_SIGNAL_NAME = 'agent_orchestrator.proposal.ready'
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Signal name a parked SUB_WORKFLOW step resumes on once its child instance
|
|
149
|
+
* reaches a terminal state. `completeWorkflow` enqueues a resume job when the
|
|
150
|
+
* child carries a parent linkage; the worker resumes the parent step via
|
|
151
|
+
* `sendSignal` with this name.
|
|
152
|
+
*/
|
|
153
|
+
export const SUB_WORKFLOW_SIGNAL_NAME = 'workflows.sub_workflow.completed'
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Small enqueue delay for the INVOKE_AGENT job so the workflow transaction that
|
|
157
|
+
* parked the step commits before the worker picks the job up. The worker also
|
|
158
|
+
* guards against the race (it requires the instance to be PAUSED at the step
|
|
159
|
+
* before running the agent), so this only trims needless retries.
|
|
160
|
+
*/
|
|
161
|
+
export const INVOKE_AGENT_ENQUEUE_DELAY_MS = 1000
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Marker carried on an activity result's output when the step must park and wait
|
|
165
|
+
* for a signal (INVOKE_AGENT routed a proposal to a human). The step handler
|
|
166
|
+
* inspects activity outputs for this marker and parks the instance accordingly.
|
|
167
|
+
* researcher / auto_approved outcomes do NOT carry it and proceed inline.
|
|
168
|
+
*/
|
|
169
|
+
export type ActivityParkMarker = { signalName: string }
|
|
170
|
+
|
|
171
|
+
export function getActivityParkMarker(output: unknown): ActivityParkMarker | null {
|
|
172
|
+
if (output && typeof output === 'object' && '__park' in output) {
|
|
173
|
+
const park = (output as { __park?: unknown }).__park
|
|
174
|
+
if (park && typeof park === 'object' && typeof (park as { signalName?: unknown }).signalName === 'string') {
|
|
175
|
+
return { signalName: (park as { signalName: string }).signalName }
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return null
|
|
179
|
+
}
|
|
102
180
|
|
|
103
181
|
export interface ActivityDefinition {
|
|
104
182
|
activityId: string // Unique identifier for activity
|
|
@@ -135,6 +213,10 @@ export interface ActivityContext {
|
|
|
135
213
|
branchInstanceId?: string | null
|
|
136
214
|
transitionId?: string
|
|
137
215
|
userId?: string
|
|
216
|
+
// The owning definition's `interpolation` mode; absent means lenient.
|
|
217
|
+
// Async activities enforce strict mode at enqueue-time, so the worker-side
|
|
218
|
+
// context deliberately leaves this unset.
|
|
219
|
+
interpolationMode?: WorkflowInterpolationMode
|
|
138
220
|
}
|
|
139
221
|
|
|
140
222
|
type RbacFeatureResolver = {
|
|
@@ -174,6 +256,13 @@ export interface ActivityExecutionResult {
|
|
|
174
256
|
executionTimeMs: number
|
|
175
257
|
async?: boolean // Marks activity as async (queued)
|
|
176
258
|
jobId?: string // Queue job ID for async activities
|
|
259
|
+
/**
|
|
260
|
+
* The activity was not attempted because a dry run cannot simulate its type
|
|
261
|
+
* (spec section 8.2). Callers MUST treat it as a stop, never as a failure:
|
|
262
|
+
* error routes and error directives describe what to do when an effector
|
|
263
|
+
* fails, and no effector ran.
|
|
264
|
+
*/
|
|
265
|
+
dryRunRefused?: boolean
|
|
177
266
|
}
|
|
178
267
|
|
|
179
268
|
export class ActivityExecutionError extends Error {
|
|
@@ -188,11 +277,29 @@ export class ActivityExecutionError extends Error {
|
|
|
188
277
|
}
|
|
189
278
|
}
|
|
190
279
|
|
|
280
|
+
/**
|
|
281
|
+
* Thrown by `interpolateVariables` in strict mode when a token cannot be
|
|
282
|
+
* resolved (unresolved context path, env-allowlist miss, unknown workflow.*
|
|
283
|
+
* key, failed or unparseable transform pipeline). Activity call sites rethrow
|
|
284
|
+
* it as `ActivityExecutionError` so it flows through the normal retry/failure
|
|
285
|
+
* machinery.
|
|
286
|
+
*/
|
|
287
|
+
export class WorkflowInterpolationError extends Error {
|
|
288
|
+
constructor(
|
|
289
|
+
message: string,
|
|
290
|
+
public token: string
|
|
291
|
+
) {
|
|
292
|
+
super(message)
|
|
293
|
+
this.name = 'WorkflowInterpolationError'
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
191
297
|
// ============================================================================
|
|
192
298
|
// Queue Integration for Async Activities
|
|
193
299
|
// ============================================================================
|
|
194
300
|
|
|
195
301
|
let activityQueue: Queue<WorkflowActivityJob> | null = null
|
|
302
|
+
let invokeAgentQueue: Queue<WorkflowActivityJob> | null = null
|
|
196
303
|
|
|
197
304
|
/**
|
|
198
305
|
* Get or create the activity queue (lazy initialization)
|
|
@@ -208,6 +315,24 @@ function getActivityQueue(): Queue<WorkflowActivityJob> {
|
|
|
208
315
|
return activityQueue
|
|
209
316
|
}
|
|
210
317
|
|
|
318
|
+
/**
|
|
319
|
+
* Get or create the dedicated invoke-agent queue (lazy initialization).
|
|
320
|
+
*
|
|
321
|
+
* Minute-long agent runs get their own queue so they never starve the fast
|
|
322
|
+
* activities sharing 'workflow-activities'. Consumer-side concurrency is
|
|
323
|
+
* governed by the workflow-invoke-agent worker's metadata.
|
|
324
|
+
*/
|
|
325
|
+
function getInvokeAgentQueue(): Queue<WorkflowActivityJob> {
|
|
326
|
+
if (!invokeAgentQueue) {
|
|
327
|
+
invokeAgentQueue = createModuleQueue<WorkflowActivityJob>(
|
|
328
|
+
WORKFLOW_INVOKE_AGENT_QUEUE_NAME,
|
|
329
|
+
{ concurrency: parseInt(process.env.WORKERS_WORKFLOW_INVOKE_AGENT_CONCURRENCY || '5', 10) },
|
|
330
|
+
)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return invokeAgentQueue
|
|
334
|
+
}
|
|
335
|
+
|
|
211
336
|
/**
|
|
212
337
|
* Enqueue an activity for background execution
|
|
213
338
|
*
|
|
@@ -224,8 +349,23 @@ export async function enqueueActivity(
|
|
|
224
349
|
const { workflowInstance, workflowContext, stepContext, transitionId, stepInstanceId, branchInstanceId } =
|
|
225
350
|
context
|
|
226
351
|
|
|
227
|
-
|
|
228
|
-
|
|
352
|
+
const registryEntry = getActivityType(activity.activityType)
|
|
353
|
+
if (registryEntry && registryEntry.async.capable === false) {
|
|
354
|
+
throw new ActivityExecutionError(
|
|
355
|
+
`[internal] Activity type ${activity.activityType} cannot run asynchronously (${registryEntry.async.reason})`,
|
|
356
|
+
activity.activityType,
|
|
357
|
+
activity.activityName
|
|
358
|
+
)
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Interpolate config variables NOW (before queuing) — strict mode is
|
|
362
|
+
// enforced here, at enqueue-time, before the job serializes frozen config.
|
|
363
|
+
const interpolatedConfig = interpolateActivityConfig(
|
|
364
|
+
activity.config,
|
|
365
|
+
context,
|
|
366
|
+
activity.activityType,
|
|
367
|
+
activity.activityName
|
|
368
|
+
)
|
|
229
369
|
|
|
230
370
|
// Create job payload
|
|
231
371
|
const job: WorkflowActivityJob = {
|
|
@@ -246,11 +386,12 @@ export async function enqueueActivity(
|
|
|
246
386
|
userId: context.userId,
|
|
247
387
|
}
|
|
248
388
|
|
|
249
|
-
// Enqueue to queue (WAIT
|
|
389
|
+
// Enqueue to queue (entries with enqueueDelayMs, e.g. WAIT, use delayMs for the actual delay)
|
|
250
390
|
const queue = getActivityQueue()
|
|
251
|
-
const
|
|
252
|
-
?
|
|
253
|
-
:
|
|
391
|
+
const registryDelayMs = registryEntry?.enqueueDelayMs
|
|
392
|
+
? registryEntry.enqueueDelayMs(interpolatedConfig)
|
|
393
|
+
: null
|
|
394
|
+
const enqueueOptions = registryDelayMs !== null ? { delayMs: registryDelayMs } : undefined
|
|
254
395
|
const jobId = await queue.enqueue(job, enqueueOptions)
|
|
255
396
|
|
|
256
397
|
// Log event
|
|
@@ -309,6 +450,112 @@ export async function enqueueTimerJob(params: {
|
|
|
309
450
|
return jobId
|
|
310
451
|
}
|
|
311
452
|
|
|
453
|
+
/**
|
|
454
|
+
* Enqueue a delayed SLA job for a USER_TASK (one reminder offset, or the
|
|
455
|
+
* deadline itself).
|
|
456
|
+
*
|
|
457
|
+
* The activity worker handles `kind: 'task_sla'` jobs by calling
|
|
458
|
+
* `taskSla.runTaskSlaJob`. `deadlineAt` is absolute and carried on the payload
|
|
459
|
+
* rather than recomputed at run time, so a queue running behind can never
|
|
460
|
+
* extend the configured deadline — the same guarantee the WAIT_FOR_CONDITION
|
|
461
|
+
* backstop gives.
|
|
462
|
+
*/
|
|
463
|
+
export async function enqueueTaskSlaJob(params: {
|
|
464
|
+
workflowInstanceId: string
|
|
465
|
+
stepInstanceId: string
|
|
466
|
+
branchInstanceId?: string | null
|
|
467
|
+
userTaskId: string
|
|
468
|
+
phase: 'reminder' | 'breach'
|
|
469
|
+
deadlineAt: string
|
|
470
|
+
fireAt: string
|
|
471
|
+
delayMs: number
|
|
472
|
+
tenantId: string
|
|
473
|
+
organizationId: string
|
|
474
|
+
userId?: string
|
|
475
|
+
}): Promise<string> {
|
|
476
|
+
const {
|
|
477
|
+
workflowInstanceId,
|
|
478
|
+
stepInstanceId,
|
|
479
|
+
branchInstanceId,
|
|
480
|
+
userTaskId,
|
|
481
|
+
phase,
|
|
482
|
+
deadlineAt,
|
|
483
|
+
fireAt,
|
|
484
|
+
delayMs,
|
|
485
|
+
tenantId,
|
|
486
|
+
organizationId,
|
|
487
|
+
userId,
|
|
488
|
+
} = params
|
|
489
|
+
|
|
490
|
+
const queue = getActivityQueue()
|
|
491
|
+
return await queue.enqueue(
|
|
492
|
+
{
|
|
493
|
+
kind: 'task_sla',
|
|
494
|
+
workflowInstanceId,
|
|
495
|
+
stepInstanceId,
|
|
496
|
+
branchInstanceId: branchInstanceId ?? undefined,
|
|
497
|
+
userTaskId,
|
|
498
|
+
phase,
|
|
499
|
+
deadlineAt,
|
|
500
|
+
fireAt,
|
|
501
|
+
tenantId,
|
|
502
|
+
organizationId,
|
|
503
|
+
userId,
|
|
504
|
+
},
|
|
505
|
+
{ delayMs: delayMs > 0 ? delayMs : undefined }
|
|
506
|
+
)
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Enqueue a delayed poll job for a WAIT_FOR_CONDITION step.
|
|
511
|
+
*
|
|
512
|
+
* The activity worker handles `kind: 'condition'` jobs by calling
|
|
513
|
+
* `conditionHandler.evaluateWaitCondition`. This job is the durability
|
|
514
|
+
* backstop behind the event-driven wake: `deadlineAt` travels unchanged across
|
|
515
|
+
* every re-enqueue so the timeout stays anchored to the original step entry.
|
|
516
|
+
*/
|
|
517
|
+
export async function enqueueConditionCheckJob(params: {
|
|
518
|
+
workflowInstanceId: string
|
|
519
|
+
stepInstanceId: string
|
|
520
|
+
branchInstanceId?: string | null
|
|
521
|
+
tenantId: string
|
|
522
|
+
organizationId: string
|
|
523
|
+
userId?: string
|
|
524
|
+
deadlineAt: string
|
|
525
|
+
attempt: number
|
|
526
|
+
delayMs: number
|
|
527
|
+
}): Promise<string> {
|
|
528
|
+
const {
|
|
529
|
+
workflowInstanceId,
|
|
530
|
+
stepInstanceId,
|
|
531
|
+
branchInstanceId,
|
|
532
|
+
tenantId,
|
|
533
|
+
organizationId,
|
|
534
|
+
userId,
|
|
535
|
+
deadlineAt,
|
|
536
|
+
attempt,
|
|
537
|
+
delayMs,
|
|
538
|
+
} = params
|
|
539
|
+
|
|
540
|
+
const queue = getActivityQueue()
|
|
541
|
+
const jobId = await queue.enqueue(
|
|
542
|
+
{
|
|
543
|
+
kind: 'condition',
|
|
544
|
+
workflowInstanceId,
|
|
545
|
+
stepInstanceId,
|
|
546
|
+
branchInstanceId: branchInstanceId ?? undefined,
|
|
547
|
+
tenantId,
|
|
548
|
+
organizationId,
|
|
549
|
+
userId,
|
|
550
|
+
deadlineAt,
|
|
551
|
+
attempt,
|
|
552
|
+
},
|
|
553
|
+
{ delayMs: delayMs > 0 ? delayMs : undefined }
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
return jobId
|
|
557
|
+
}
|
|
558
|
+
|
|
312
559
|
// ============================================================================
|
|
313
560
|
// Main Activity Execution Functions
|
|
314
561
|
// ============================================================================
|
|
@@ -368,6 +615,11 @@ export async function executeActivity(
|
|
|
368
615
|
lastError = error
|
|
369
616
|
retryCount = attempt + 1
|
|
370
617
|
|
|
618
|
+
// A dry-run refusal is not a failure — nothing was attempted — so retrying
|
|
619
|
+
// it would only re-log the same refusal N times before reaching the same
|
|
620
|
+
// answer.
|
|
621
|
+
if (isDryRunRefusal(error)) break
|
|
622
|
+
|
|
371
623
|
// Log activity retry attempt with context
|
|
372
624
|
if (attempt < retryPolicy.maxAttempts - 1) {
|
|
373
625
|
logger.error('Activity failed; will retry', {
|
|
@@ -396,6 +648,19 @@ export async function executeActivity(
|
|
|
396
648
|
|
|
397
649
|
// All retries exhausted
|
|
398
650
|
const errorMessage = lastError instanceof Error ? lastError.message : String(lastError)
|
|
651
|
+
if (isDryRunRefusal(lastError)) {
|
|
652
|
+
return {
|
|
653
|
+
activityId: activity.activityId,
|
|
654
|
+
activityName: activity.activityName,
|
|
655
|
+
activityType: activity.activityType,
|
|
656
|
+
success: false,
|
|
657
|
+
dryRunRefused: true,
|
|
658
|
+
error: `Dry run stopped: activity type ${lastError.activityType} cannot be simulated (${lastError.reason})`,
|
|
659
|
+
retryCount: 0,
|
|
660
|
+
executionTimeMs: 0,
|
|
661
|
+
async: activity.async || false,
|
|
662
|
+
}
|
|
663
|
+
}
|
|
399
664
|
logger.error('Activity failed after all attempts', {
|
|
400
665
|
activityId: activity.activityId,
|
|
401
666
|
activityType: activity.activityType,
|
|
@@ -434,11 +699,17 @@ export async function executeActivities(
|
|
|
434
699
|
): Promise<ActivityExecutionResult[]> {
|
|
435
700
|
const results: ActivityExecutionResult[] = []
|
|
436
701
|
|
|
702
|
+
// A dry run never enqueues. The queue job would carry no `isDryRun` of its
|
|
703
|
+
// own, so a worker picking it up would execute the real effector on its own
|
|
704
|
+
// connection — the isolation would leak out of the request that opted in.
|
|
705
|
+
// Mocks are pure and synchronous, so running them inline loses nothing.
|
|
706
|
+
const forceSynchronous = isDryRunInstance(context.workflowInstance)
|
|
707
|
+
|
|
437
708
|
for (let i = 0; i < activities.length; i++) {
|
|
438
709
|
const activity = activities[i]
|
|
439
710
|
|
|
440
711
|
// Check if activity should run async
|
|
441
|
-
if (activity.async) {
|
|
712
|
+
if (activity.async && !forceSynchronous) {
|
|
442
713
|
// Enqueue for background execution
|
|
443
714
|
const jobId = await enqueueActivity(em, activity, context)
|
|
444
715
|
|
|
@@ -454,7 +725,17 @@ export async function executeActivities(
|
|
|
454
725
|
})
|
|
455
726
|
} else {
|
|
456
727
|
// Execute synchronously (existing logic)
|
|
457
|
-
const
|
|
728
|
+
const executed = await executeActivity(em, container, activity, context)
|
|
729
|
+
// `executeActivity` echoes the AUTHORED `async` flag, which is what the
|
|
730
|
+
// transition handler reads to decide whether to park the token in
|
|
731
|
+
// WAITING_FOR_ACTIVITIES. A dry run that ran an authored-async activity
|
|
732
|
+
// inline must therefore correct the flag, or the run would park waiting
|
|
733
|
+
// for a queue job that was deliberately never enqueued — a deadlock, and
|
|
734
|
+
// the step handler would also misclassify a refusal as "still pending"
|
|
735
|
+
// instead of a failure.
|
|
736
|
+
const result = forceSynchronous && activity.async
|
|
737
|
+
? { ...executed, async: false }
|
|
738
|
+
: executed
|
|
458
739
|
results.push(result)
|
|
459
740
|
|
|
460
741
|
// Stop execution if activity fails (fail-fast)
|
|
@@ -462,12 +743,21 @@ export async function executeActivities(
|
|
|
462
743
|
break
|
|
463
744
|
}
|
|
464
745
|
|
|
465
|
-
// Update workflow context with activity output
|
|
746
|
+
// Update workflow context with activity output. SET_VARIABLE outputs
|
|
747
|
+
// land at their assignment paths in top-level context; every other
|
|
748
|
+
// output merges under the activity name/type key.
|
|
466
749
|
if (result.output && typeof result.output === 'object') {
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
750
|
+
if (activity.activityType === 'SET_VARIABLE' && isSetVariableOutput(result.output)) {
|
|
751
|
+
context.workflowContext = {
|
|
752
|
+
...context.workflowContext,
|
|
753
|
+
...buildSetVariableContextPatch(context.workflowContext, result.output.assignments),
|
|
754
|
+
}
|
|
755
|
+
} else {
|
|
756
|
+
const key = activity.activityName || activity.activityType
|
|
757
|
+
context.workflowContext = {
|
|
758
|
+
...context.workflowContext,
|
|
759
|
+
[key]: result.output,
|
|
760
|
+
}
|
|
471
761
|
}
|
|
472
762
|
}
|
|
473
763
|
}
|
|
@@ -491,43 +781,83 @@ async function executeActivityByType(
|
|
|
491
781
|
signal?: AbortSignal
|
|
492
782
|
): Promise<any> {
|
|
493
783
|
// Interpolate config variables from context (including workflow metadata)
|
|
494
|
-
const interpolatedConfig =
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
case 'CALL_API':
|
|
501
|
-
return await executeCallApi(em, interpolatedConfig, context, container, signal)
|
|
502
|
-
|
|
503
|
-
case 'EMIT_EVENT':
|
|
504
|
-
return await executeEmitEvent(interpolatedConfig, context, container)
|
|
505
|
-
|
|
506
|
-
case 'UPDATE_ENTITY':
|
|
507
|
-
return await executeUpdateEntity(em, interpolatedConfig, context, container)
|
|
508
|
-
|
|
509
|
-
case 'CALL_WEBHOOK':
|
|
510
|
-
return await executeCallWebhook(interpolatedConfig, context, { signal })
|
|
511
|
-
|
|
512
|
-
case 'EXECUTE_FUNCTION':
|
|
513
|
-
return await executeFunction(interpolatedConfig, context, container)
|
|
784
|
+
const interpolatedConfig = interpolateActivityConfig(
|
|
785
|
+
activity.config,
|
|
786
|
+
context,
|
|
787
|
+
activity.activityType,
|
|
788
|
+
activity.activityName
|
|
789
|
+
)
|
|
514
790
|
|
|
515
|
-
|
|
516
|
-
|
|
791
|
+
const entry = getActivityType(activity.activityType)
|
|
792
|
+
if (!entry) {
|
|
793
|
+
throw new ActivityExecutionError(
|
|
794
|
+
`Unknown activity type: ${activity.activityType}`,
|
|
795
|
+
activity.activityType,
|
|
796
|
+
activity.activityName
|
|
797
|
+
)
|
|
798
|
+
}
|
|
517
799
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
800
|
+
// Dry run (spec section 8.2): the ONE place `entry.execute` is reached, so it
|
|
801
|
+
// is the one place the swap has to happen. Everything side-effecting in the
|
|
802
|
+
// engine ends up here — the command bus, the event bus, the mailer, the
|
|
803
|
+
// webhook fetch and the agent bridge — which is what makes "no effector runs"
|
|
804
|
+
// a property of a single branch rather than a checklist.
|
|
805
|
+
if (isDryRunInstance(context.workflowInstance)) {
|
|
806
|
+
if (entry.mock === 'refuse' || entry.mock === undefined) {
|
|
807
|
+
const refusal = new WorkflowDryRunRefusalError(
|
|
521
808
|
activity.activityType,
|
|
522
|
-
|
|
809
|
+
entry.mock === 'refuse' ? 'refused' : 'noMock',
|
|
810
|
+
activity.activityName,
|
|
523
811
|
)
|
|
812
|
+
await logWorkflowEvent(em, {
|
|
813
|
+
workflowInstanceId: context.workflowInstance.id,
|
|
814
|
+
stepInstanceId: context.stepInstanceId,
|
|
815
|
+
eventType: DRY_RUN_EVENT_TYPES.activityRefused,
|
|
816
|
+
eventData: {
|
|
817
|
+
activityId: activity.activityId,
|
|
818
|
+
activityName: activity.activityName,
|
|
819
|
+
activityType: activity.activityType,
|
|
820
|
+
reason: refusal.reason,
|
|
821
|
+
},
|
|
822
|
+
tenantId: context.workflowInstance.tenantId,
|
|
823
|
+
organizationId: context.workflowInstance.organizationId,
|
|
824
|
+
})
|
|
825
|
+
throw refusal
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
const simulated = entry.mock(interpolatedConfig, context)
|
|
829
|
+
await logWorkflowEvent(em, {
|
|
830
|
+
workflowInstanceId: context.workflowInstance.id,
|
|
831
|
+
stepInstanceId: context.stepInstanceId,
|
|
832
|
+
eventType: DRY_RUN_EVENT_TYPES.activitySimulated,
|
|
833
|
+
eventData: {
|
|
834
|
+
activityId: activity.activityId,
|
|
835
|
+
activityName: activity.activityName,
|
|
836
|
+
activityType: activity.activityType,
|
|
837
|
+
output: simulated ?? null,
|
|
838
|
+
},
|
|
839
|
+
tenantId: context.workflowInstance.tenantId,
|
|
840
|
+
organizationId: context.workflowInstance.organizationId,
|
|
841
|
+
})
|
|
842
|
+
return simulated
|
|
524
843
|
}
|
|
844
|
+
|
|
845
|
+
// `signal` MUST reach the registry entry: CALL_API / CALL_WEBHOOK thread it
|
|
846
|
+
// into fetch, and without it a per-activity timeout rejects the promise while
|
|
847
|
+
// the HTTP request stays in flight — the phantom-execution bug from #4918.
|
|
848
|
+
return await entry.execute(interpolatedConfig, context, {
|
|
849
|
+
em: em as PostgreSqlEntityManager,
|
|
850
|
+
container,
|
|
851
|
+
signal,
|
|
852
|
+
})
|
|
525
853
|
}
|
|
526
854
|
|
|
527
855
|
/**
|
|
528
856
|
* SEND_EMAIL activity handler
|
|
529
857
|
*
|
|
530
|
-
*
|
|
858
|
+
* Sends via the DI-registered emailService when available; without one it
|
|
859
|
+
* reports an honest stub result ({ sent: false, simulated: true, reason: 'no-email-service' }).
|
|
860
|
+
* A real send() failure propagates so the activity retry loop handles it.
|
|
531
861
|
*/
|
|
532
862
|
export async function executeSendEmail(
|
|
533
863
|
config: any,
|
|
@@ -540,27 +870,28 @@ export async function executeSendEmail(
|
|
|
540
870
|
throw new Error('SEND_EMAIL requires "to" and "subject" fields')
|
|
541
871
|
}
|
|
542
872
|
|
|
543
|
-
// For MVP: Log the email (actual email service integration can be added later)
|
|
544
873
|
logger.info('Send email activity invoked', { component: 'SEND_EMAIL', subject })
|
|
545
874
|
|
|
546
|
-
|
|
875
|
+
let emailService: { send: (input: unknown) => Promise<unknown> | unknown } | undefined
|
|
547
876
|
try {
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
to,
|
|
552
|
-
subject,
|
|
553
|
-
template,
|
|
554
|
-
templateData,
|
|
555
|
-
body,
|
|
556
|
-
})
|
|
557
|
-
return { sent: true, to, subject, via: 'emailService' }
|
|
558
|
-
}
|
|
559
|
-
} catch (error) {
|
|
560
|
-
// Email service not available, just log
|
|
877
|
+
emailService = container.resolve<{ send: (input: unknown) => Promise<unknown> | unknown }>('emailService')
|
|
878
|
+
} catch {
|
|
879
|
+
emailService = undefined
|
|
561
880
|
}
|
|
562
881
|
|
|
563
|
-
|
|
882
|
+
if (emailService && typeof emailService.send === 'function') {
|
|
883
|
+
await emailService.send({
|
|
884
|
+
to,
|
|
885
|
+
subject,
|
|
886
|
+
template,
|
|
887
|
+
templateData,
|
|
888
|
+
body,
|
|
889
|
+
})
|
|
890
|
+
return { sent: true, to, subject, via: 'emailService' }
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
logger.warn('SEND_EMAIL has no registered email service; email was not sent', { component: 'SEND_EMAIL', subject })
|
|
894
|
+
return { sent: false, simulated: true, to, subject, via: 'console', reason: 'no-email-service' }
|
|
564
895
|
}
|
|
565
896
|
|
|
566
897
|
/**
|
|
@@ -684,11 +1015,23 @@ export async function executeUpdateEntity(
|
|
|
684
1015
|
throw new Error('UPDATE_ENTITY requires "commandId" field (e.g., "sales.documents.update")')
|
|
685
1016
|
}
|
|
686
1017
|
|
|
1018
|
+
// Gate 1 — the CODE declares this command possible.
|
|
687
1019
|
const workflowSafeCommand = getWorkflowSafeCommand(commandId)
|
|
688
1020
|
if (!workflowSafeCommand) {
|
|
689
1021
|
throw new Error('UPDATE_ENTITY command is not allowed')
|
|
690
1022
|
}
|
|
691
1023
|
|
|
1024
|
+
// Gate 2 — this TENANT switched it on. A tenant that never saved the setting
|
|
1025
|
+
// resolves to the grandfathered set, so this is byte-identical to the
|
|
1026
|
+
// pre-setting behaviour for every existing tenant.
|
|
1027
|
+
const commandPolicy = await resolveWorkflowCommandPolicyForContainer(
|
|
1028
|
+
container,
|
|
1029
|
+
context.workflowInstance.tenantId,
|
|
1030
|
+
)
|
|
1031
|
+
if (!isWorkflowCommandEnabled(workflowSafeCommand, commandPolicy)) {
|
|
1032
|
+
throw new Error('UPDATE_ENTITY command is not enabled for this tenant')
|
|
1033
|
+
}
|
|
1034
|
+
|
|
692
1035
|
if (!input || typeof input !== 'object') {
|
|
693
1036
|
throw new Error('UPDATE_ENTITY requires "input" object with entity data')
|
|
694
1037
|
}
|
|
@@ -954,27 +1297,6 @@ export async function executeFunction(
|
|
|
954
1297
|
}
|
|
955
1298
|
}
|
|
956
1299
|
|
|
957
|
-
/**
|
|
958
|
-
* Calculate delay in milliseconds from a WAIT activity config.
|
|
959
|
-
* Supports either `duration` (relative, e.g. "PT5M") or `until` (absolute ISO 8601 datetime).
|
|
960
|
-
*/
|
|
961
|
-
function calculateWaitDelayMs(config: { duration?: string; until?: string }): number {
|
|
962
|
-
if (config.until) {
|
|
963
|
-
const targetDate = new Date(config.until)
|
|
964
|
-
if (isNaN(targetDate.getTime())) {
|
|
965
|
-
throw new Error(`WAIT activity: invalid "until" datetime: ${config.until}`)
|
|
966
|
-
}
|
|
967
|
-
const delayMs = targetDate.getTime() - Date.now()
|
|
968
|
-
return Math.max(0, delayMs)
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
if (config.duration) {
|
|
972
|
-
return parseDuration(config.duration)
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
throw new Error('WAIT activity requires "duration" (e.g., "PT5M", "1h") or "until" (ISO 8601 datetime)')
|
|
976
|
-
}
|
|
977
|
-
|
|
978
1300
|
/**
|
|
979
1301
|
* WAIT activity handler
|
|
980
1302
|
*
|
|
@@ -985,7 +1307,7 @@ function calculateWaitDelayMs(config: { duration?: string; until?: string }): nu
|
|
|
985
1307
|
* - Async mode: delay is handled by the queue's delayMs option;
|
|
986
1308
|
* this handler returns immediately when called from the worker
|
|
987
1309
|
*/
|
|
988
|
-
async function executeWait(config: any): Promise<any> {
|
|
1310
|
+
export async function executeWait(config: any): Promise<any> {
|
|
989
1311
|
const durationMs = calculateWaitDelayMs(config)
|
|
990
1312
|
|
|
991
1313
|
// In sync mode, actually sleep for the duration
|
|
@@ -995,6 +1317,237 @@ async function executeWait(config: any): Promise<any> {
|
|
|
995
1317
|
return { waited: true, durationMs }
|
|
996
1318
|
}
|
|
997
1319
|
|
|
1320
|
+
/**
|
|
1321
|
+
* SET_VARIABLE activity handler
|
|
1322
|
+
*
|
|
1323
|
+
* Validates the (already interpolated) assignments and echoes them back as
|
|
1324
|
+
* `{ assignments }`. The sync merge points detect this output shape via
|
|
1325
|
+
* `isSetVariableOutput` and apply each assignment at its dot path in
|
|
1326
|
+
* top-level workflow context (see lib/set-variable.ts) instead of
|
|
1327
|
+
* namespacing the output under the activity name/type key.
|
|
1328
|
+
*/
|
|
1329
|
+
export async function executeSetVariable(
|
|
1330
|
+
config: unknown,
|
|
1331
|
+
context: ActivityContext
|
|
1332
|
+
): Promise<SetVariableOutput> {
|
|
1333
|
+
const parsed = setVariableConfigSchema.safeParse(config)
|
|
1334
|
+
if (!parsed.success) {
|
|
1335
|
+
const issues = parsed.error.issues
|
|
1336
|
+
.map((issue) => `${issue.path.join('.') || 'config'}: ${issue.message}`)
|
|
1337
|
+
.join('; ')
|
|
1338
|
+
throw new Error(`SET_VARIABLE config invalid: ${issues}`)
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
for (const assignment of parsed.data.assignments) {
|
|
1342
|
+
const segments = splitAssignmentPath(assignment.path)
|
|
1343
|
+
if (segments === null) {
|
|
1344
|
+
throw new Error(
|
|
1345
|
+
`SET_VARIABLE assignment path contains a forbidden segment (__proto__, constructor, prototype): "${assignment.path}"`
|
|
1346
|
+
)
|
|
1347
|
+
}
|
|
1348
|
+
if (segments.length === 0) {
|
|
1349
|
+
throw new Error(`SET_VARIABLE assignment path is blank: "${assignment.path}"`)
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
return { assignments: parsed.data.assignments }
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
/**
|
|
1357
|
+
* INVOKE_AGENT activity handler
|
|
1358
|
+
*
|
|
1359
|
+
* Runs a callable agent via the agent_orchestrator DI bridge (`agentWorkflowBridge`,
|
|
1360
|
+
* an optional peer) and dispositions any proposal:
|
|
1361
|
+
* - researcher → returns the agent data; the step proceeds inline (no park).
|
|
1362
|
+
* - auto_approved → returns the proposalId; the step proceeds inline (no park).
|
|
1363
|
+
* - user_task → returns a result carrying a `__park` marker so the step handler
|
|
1364
|
+
* parks the instance on `INVOKE_AGENT_SIGNAL_NAME`; agent_orchestrator's
|
|
1365
|
+
* dispose path later signals it to resume.
|
|
1366
|
+
*
|
|
1367
|
+
* `config` is the already-interpolated INVOKE_AGENT config.
|
|
1368
|
+
*/
|
|
1369
|
+
type AgentWorkflowBridgeLike = {
|
|
1370
|
+
invokeAgentForWorkflow: (args: {
|
|
1371
|
+
agentId: string
|
|
1372
|
+
input: unknown
|
|
1373
|
+
onResult: { autoApproveThreshold: number; autoApproveMargin?: number } | { alwaysAsk: true }
|
|
1374
|
+
ctx: {
|
|
1375
|
+
tenantId: string
|
|
1376
|
+
organizationId: string
|
|
1377
|
+
userId?: string
|
|
1378
|
+
workflowInstanceId: string
|
|
1379
|
+
stepId: string
|
|
1380
|
+
/**
|
|
1381
|
+
* The step-attempt id. With the instance and the step it IS this
|
|
1382
|
+
* invocation's identity, so the run it produces can be correlated by name
|
|
1383
|
+
* rather than by "the newest run for this agent since now".
|
|
1384
|
+
*/
|
|
1385
|
+
invocationId?: string
|
|
1386
|
+
// Optional interpolated business-record descriptor (invokeAgentConfigSchema.subject).
|
|
1387
|
+
subject?: unknown
|
|
1388
|
+
// Optional already-resolved Review section (spec 7.5) — who reviews the
|
|
1389
|
+
// proposal this step raises, and by when. Absent means the unassigned
|
|
1390
|
+
// task the disposition service raised before the section existed.
|
|
1391
|
+
review?: AgentDispositionReview
|
|
1392
|
+
}
|
|
1393
|
+
}) => Promise<
|
|
1394
|
+
| { kind: 'research'; data: unknown }
|
|
1395
|
+
| { kind: 'auto_approved'; proposalId: string; payload: unknown }
|
|
1396
|
+
| { kind: 'user_task'; proposalId: string }
|
|
1397
|
+
// The agent proposed nothing: terminal like `researcher`, never parked.
|
|
1398
|
+
| { kind: 'none_proposed'; proposalId: string; payload: unknown }
|
|
1399
|
+
// The agent PRODUCED files. Terminal and non-mutating, so it routes onto the
|
|
1400
|
+
// same governance handle as a research result: the five outcome handles are a
|
|
1401
|
+
// vocabulary of DECISIONS, and "it made a document" is not one of them.
|
|
1402
|
+
| { kind: 'artifact'; artifacts: unknown[]; summary?: string }
|
|
1403
|
+
>
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
function tryResolveAgentWorkflowBridge(
|
|
1407
|
+
container: AwilixContainer,
|
|
1408
|
+
): AgentWorkflowBridgeLike | undefined {
|
|
1409
|
+
try {
|
|
1410
|
+
return container.resolve<AgentWorkflowBridgeLike>('agentWorkflowBridge')
|
|
1411
|
+
} catch {
|
|
1412
|
+
return undefined
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
|
|
1416
|
+
export async function executeInvokeAgent(
|
|
1417
|
+
config: unknown,
|
|
1418
|
+
context: ActivityContext,
|
|
1419
|
+
container: AwilixContainer
|
|
1420
|
+
): Promise<any> {
|
|
1421
|
+
const parsed = invokeAgentConfigSchema.safeParse(config)
|
|
1422
|
+
if (!parsed.success) {
|
|
1423
|
+
const issues = parsed.error.issues
|
|
1424
|
+
.map((issue) => `${issue.path.join('.') || 'config'}: ${issue.message}`)
|
|
1425
|
+
.join('; ')
|
|
1426
|
+
throw new Error(`INVOKE_AGENT config invalid: ${issues}`)
|
|
1427
|
+
}
|
|
1428
|
+
const { agentId, input, onResult, outputMapping, subject, review } = parsed.data
|
|
1429
|
+
|
|
1430
|
+
// The Review section is resolved HERE, against the context the step ran with,
|
|
1431
|
+
// for the same reason a USER_TASK's assignment is resolved at creation rather
|
|
1432
|
+
// than at read time: a definition edit while the agent is running must not
|
|
1433
|
+
// retro-change who the resulting review task belongs to. `config` reaches this
|
|
1434
|
+
// function already interpolated, so a dynamic assignee is either a resolved id
|
|
1435
|
+
// or an untouched `{{…}}` token — which `resolveTaskAssignment` reads as the
|
|
1436
|
+
// fallback-to-the-role-queue case.
|
|
1437
|
+
const dispositionReview = toAgentDispositionReview(resolveAgentReview(review, (value) => value))
|
|
1438
|
+
|
|
1439
|
+
// Fail fast when the optional agent_orchestrator peer is absent — the worker
|
|
1440
|
+
// would otherwise enqueue a job that can never run.
|
|
1441
|
+
const bridge = tryResolveAgentWorkflowBridge(container)
|
|
1442
|
+
if (!bridge) {
|
|
1443
|
+
throw new Error('[internal] agent_orchestrator not installed')
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
const stepId =
|
|
1447
|
+
context.stepContext?.stepId ||
|
|
1448
|
+
context.workflowInstance.currentStepId
|
|
1449
|
+
|
|
1450
|
+
// Resolve the traceable principal this agent run executes as, from the
|
|
1451
|
+
// workflow instance (NOT the unreliable execution `context.userId`, which is
|
|
1452
|
+
// empty for event/sub-workflow paths). Same security model as CALL_API: the
|
|
1453
|
+
// run must never exceed the permissions of the human who triggered (or
|
|
1454
|
+
// authored) the workflow, and there is no anonymous "system" fallback —
|
|
1455
|
+
// passing an empty user id downstream both poisons the DB transaction
|
|
1456
|
+
// (invalid uuid `""`) and would mint a session token attributed to no one.
|
|
1457
|
+
const principalEm = container.resolve<PostgreSqlEntityManager>('em')
|
|
1458
|
+
const effectiveUserId = await resolveWorkflowPrincipalUserId(principalEm, context.workflowInstance)
|
|
1459
|
+
if (!effectiveUserId) {
|
|
1460
|
+
throw new Error(
|
|
1461
|
+
`[INVOKE_AGENT] Refusing to execute for workflow instance ${context.workflowInstance.id}: ` +
|
|
1462
|
+
`no traceable user (instance initiatedBy or definition author) could be resolved. ` +
|
|
1463
|
+
`Agent runs must execute under the identity of the user who triggered them.`
|
|
1464
|
+
)
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
// Parallel-branch agent steps keep the legacy inline path. The async fix below
|
|
1468
|
+
// parks and resumes at the INSTANCE level, and sendSignal's FORKED branch
|
|
1469
|
+
// resume only matches WAIT_FOR_SIGNAL steps — so an instance-level resume would
|
|
1470
|
+
// not reach a parked branch. The claims blueprints (and the common case) run
|
|
1471
|
+
// agents sequentially at the instance level; only rarely-used parallel branches
|
|
1472
|
+
// hit this fallback, where behavior is unchanged from before.
|
|
1473
|
+
if (context.branchInstanceId) {
|
|
1474
|
+
const outcome = await bridge.invokeAgentForWorkflow({
|
|
1475
|
+
agentId,
|
|
1476
|
+
input,
|
|
1477
|
+
onResult,
|
|
1478
|
+
ctx: {
|
|
1479
|
+
tenantId: context.workflowInstance.tenantId,
|
|
1480
|
+
organizationId: context.workflowInstance.organizationId,
|
|
1481
|
+
userId: effectiveUserId,
|
|
1482
|
+
workflowInstanceId: context.workflowInstance.id,
|
|
1483
|
+
stepId,
|
|
1484
|
+
// The step-attempt row id: a retry enters the step again and mints a new
|
|
1485
|
+
// one, so it names THIS attempt and no other.
|
|
1486
|
+
...(context.stepInstanceId ? { invocationId: context.stepInstanceId } : {}),
|
|
1487
|
+
...(subject ? { subject } : {}),
|
|
1488
|
+
...(dispositionReview ? { review: dispositionReview } : {}),
|
|
1489
|
+
},
|
|
1490
|
+
})
|
|
1491
|
+
if (outcome.kind === 'research') {
|
|
1492
|
+
return { kind: 'research', agentId, data: outcome.data }
|
|
1493
|
+
}
|
|
1494
|
+
if (outcome.kind === 'artifact') {
|
|
1495
|
+
return { kind: 'artifact', agentId, artifacts: outcome.artifacts, summary: outcome.summary }
|
|
1496
|
+
}
|
|
1497
|
+
if (outcome.kind === 'auto_approved' || outcome.kind === 'none_proposed') {
|
|
1498
|
+
return { kind: outcome.kind, agentId, proposalId: outcome.proposalId, proposalPayload: outcome.payload }
|
|
1499
|
+
}
|
|
1500
|
+
return {
|
|
1501
|
+
kind: 'user_task',
|
|
1502
|
+
agentId,
|
|
1503
|
+
proposalId: outcome.proposalId,
|
|
1504
|
+
__park: { signalName: INVOKE_AGENT_SIGNAL_NAME },
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
if (!context.stepInstanceId) {
|
|
1509
|
+
throw new Error('[internal] INVOKE_AGENT requires a step instance to park on')
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
// Run the agent OUTSIDE the workflow transaction. Previously the agent ran
|
|
1513
|
+
// inline here, on the workflow's transactional EM: a failing statement aborted
|
|
1514
|
+
// the whole workflow transaction ("current transaction is aborted, …") and,
|
|
1515
|
+
// for cross-process OpenCode agents, the per-run api_key / session rows were
|
|
1516
|
+
// written into the still-open transaction so the separate mcp:serve-http
|
|
1517
|
+
// process could not see them to authenticate submit_outcome. Instead we enqueue
|
|
1518
|
+
// a dedicated job and PARK the step on the proposal-ready signal: the
|
|
1519
|
+
// workflow-invoke-agent worker runs the agent on its own connection (committed,
|
|
1520
|
+
// cross-process visible) and resumes the parked step via sendSignal. user_task
|
|
1521
|
+
// outcomes stay parked until agent_orchestrator's human dispose fires the same
|
|
1522
|
+
// signal — identical to the prior park behavior.
|
|
1523
|
+
const queue = getInvokeAgentQueue()
|
|
1524
|
+
const job: WorkflowActivityJobInvokeAgent = {
|
|
1525
|
+
kind: 'invoke_agent',
|
|
1526
|
+
workflowInstanceId: context.workflowInstance.id,
|
|
1527
|
+
branchInstanceId: context.branchInstanceId ?? undefined,
|
|
1528
|
+
stepInstanceId: context.stepInstanceId,
|
|
1529
|
+
stepId,
|
|
1530
|
+
signalName: INVOKE_AGENT_SIGNAL_NAME,
|
|
1531
|
+
agentId,
|
|
1532
|
+
input: (input ?? {}) as Record<string, any>,
|
|
1533
|
+
onResult,
|
|
1534
|
+
...(outputMapping ? { outputMapping } : {}),
|
|
1535
|
+
...(subject ? { subject } : {}),
|
|
1536
|
+
...(dispositionReview ? { review: dispositionReview } : {}),
|
|
1537
|
+
tenantId: context.workflowInstance.tenantId,
|
|
1538
|
+
organizationId: context.workflowInstance.organizationId,
|
|
1539
|
+
userId: effectiveUserId,
|
|
1540
|
+
}
|
|
1541
|
+
const jobId = await queue.enqueue(job, { delayMs: INVOKE_AGENT_ENQUEUE_DELAY_MS })
|
|
1542
|
+
|
|
1543
|
+
return {
|
|
1544
|
+
kind: 'pending_agent',
|
|
1545
|
+
agentId,
|
|
1546
|
+
jobId,
|
|
1547
|
+
__park: { signalName: INVOKE_AGENT_SIGNAL_NAME },
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
|
|
998
1551
|
/**
|
|
999
1552
|
* CALL_API activity handler
|
|
1000
1553
|
*
|
|
@@ -1013,7 +1566,7 @@ export async function executeCallApi(
|
|
|
1013
1566
|
signal?: AbortSignal
|
|
1014
1567
|
): Promise<any> {
|
|
1015
1568
|
// 1. Interpolate variables in config (including {{workflow.*}}, {{context.*}}, allowlisted {{env.*}}, {{now}})
|
|
1016
|
-
const interpolatedConfig =
|
|
1569
|
+
const interpolatedConfig = interpolateActivityConfig(config, context, 'CALL_API')
|
|
1017
1570
|
|
|
1018
1571
|
const {
|
|
1019
1572
|
endpoint,
|
|
@@ -1207,16 +1760,40 @@ async function resolveActiveRoleIdsForUser(
|
|
|
1207
1760
|
return scopedRoles.map((r: any) => r.id as string)
|
|
1208
1761
|
}
|
|
1209
1762
|
|
|
1763
|
+
/**
|
|
1764
|
+
* Loads the instance's definition (including soft-deleted rows, so an execution
|
|
1765
|
+
* grant on a deleted definition still binds a run that is still executing).
|
|
1766
|
+
*/
|
|
1767
|
+
async function loadInstanceDefinition(em: any, instance: CallApiInstanceLike) {
|
|
1768
|
+
if (!instance.definitionId) return null
|
|
1769
|
+
const { findOneWithDecryption } = await import('@open-mercato/shared/lib/encryption/find')
|
|
1770
|
+
const { WorkflowDefinition } = await import('../data/entities')
|
|
1771
|
+
return findOneWithDecryption(
|
|
1772
|
+
em,
|
|
1773
|
+
WorkflowDefinition,
|
|
1774
|
+
{ id: instance.definitionId, tenantId: instance.tenantId },
|
|
1775
|
+
{},
|
|
1776
|
+
{ tenantId: instance.tenantId, organizationId: instance.organizationId },
|
|
1777
|
+
)
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1210
1780
|
export async function resolveCallApiRoleIds(
|
|
1211
1781
|
em: any,
|
|
1212
1782
|
instance: CallApiInstanceLike
|
|
1213
1783
|
): Promise<string[]> {
|
|
1214
1784
|
if (!instance.definitionId) return []
|
|
1215
1785
|
|
|
1216
|
-
const { findOneWithDecryption } = await import('@open-mercato/shared/lib/encryption/find')
|
|
1217
|
-
const { WorkflowDefinition } = await import('../data/entities')
|
|
1218
|
-
|
|
1219
1786
|
const scope = { tenantId: instance.tenantId, organizationId: instance.organizationId }
|
|
1787
|
+
const definition = await loadInstanceDefinition(em, instance)
|
|
1788
|
+
|
|
1789
|
+
// 0. A definition that declares its own execution grant ALWAYS acts as its
|
|
1790
|
+
// own least-privilege principal, whoever started the run — otherwise a
|
|
1791
|
+
// CALL_API activity would mint a key carrying the starting admin's roles
|
|
1792
|
+
// and route straight around the grant.
|
|
1793
|
+
if (definitionDeclaresGrant(definition)) {
|
|
1794
|
+
const principalUserId = await resolveWorkflowDefinitionExecutionUserId(em, definition, null)
|
|
1795
|
+
return principalUserId ? resolveActiveRoleIdsForUser(em, principalUserId, scope) : []
|
|
1796
|
+
}
|
|
1220
1797
|
|
|
1221
1798
|
// 1. Prefer the triggering user (whoever manually started this instance).
|
|
1222
1799
|
// WorkflowInstance.metadata.initiatedBy is the canonical record of that
|
|
@@ -1231,17 +1808,48 @@ export async function resolveCallApiRoleIds(
|
|
|
1231
1808
|
|
|
1232
1809
|
// 2. Event-triggered instance with no human initiator: fall back to the
|
|
1233
1810
|
// definition author. Soft-deleted definitions must not mint keys.
|
|
1234
|
-
const
|
|
1235
|
-
id: instance.definitionId,
|
|
1236
|
-
tenantId: instance.tenantId,
|
|
1237
|
-
deletedAt: null,
|
|
1238
|
-
}, {}, scope)
|
|
1239
|
-
const authorUserId = definition?.createdBy
|
|
1811
|
+
const authorUserId = definition?.deletedAt ? null : definition?.createdBy
|
|
1240
1812
|
if (!authorUserId) return []
|
|
1241
1813
|
|
|
1242
1814
|
return resolveActiveRoleIdsForUser(em, authorUserId, scope)
|
|
1243
1815
|
}
|
|
1244
1816
|
|
|
1817
|
+
/**
|
|
1818
|
+
* Resolve the traceable principal user id an INVOKE_AGENT run executes as.
|
|
1819
|
+
*
|
|
1820
|
+
* Mirrors `resolveCallApiRoleIds`' principal chain so workflow-originated agent
|
|
1821
|
+
* runs carry the same audited identity as CALL_API:
|
|
1822
|
+
* 1. The instance's `metadata.initiatedBy` (whoever started it; inherited by
|
|
1823
|
+
* sub-workflows from the parent instance).
|
|
1824
|
+
* 2. The definition's `createdBy` (author) for event-triggered instances with
|
|
1825
|
+
* no human initiator. Soft-deleted definitions resolve to no principal.
|
|
1826
|
+
*
|
|
1827
|
+
* Both are outranked by the definition's own `grantedFeatures` execution
|
|
1828
|
+
* principal when it declares one (see `lib/definition-grant.ts`).
|
|
1829
|
+
*
|
|
1830
|
+
* Returns `null` when no traceable principal exists — callers MUST refuse rather
|
|
1831
|
+
* than fall back to an empty/anonymous user id (which breaks uuid columns and
|
|
1832
|
+
* bypasses RBAC attribution).
|
|
1833
|
+
*/
|
|
1834
|
+
export async function resolveWorkflowPrincipalUserId(
|
|
1835
|
+
em: any,
|
|
1836
|
+
instance: CallApiInstanceLike
|
|
1837
|
+
): Promise<string | null> {
|
|
1838
|
+
const definition = await loadInstanceDefinition(em, instance)
|
|
1839
|
+
|
|
1840
|
+
// 0. A declared execution grant outranks both — the run acts as its own
|
|
1841
|
+
// principal regardless of who started it.
|
|
1842
|
+
if (definitionDeclaresGrant(definition)) {
|
|
1843
|
+
return resolveWorkflowDefinitionExecutionUserId(em, definition, null)
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
const initiatorUserId = instance.metadata?.initiatedBy ?? null
|
|
1847
|
+
if (initiatorUserId) return initiatorUserId
|
|
1848
|
+
|
|
1849
|
+
if (definition?.deletedAt) return null
|
|
1850
|
+
return definition?.createdBy ?? null
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1245
1853
|
/**
|
|
1246
1854
|
* Build full API URL from endpoint
|
|
1247
1855
|
* - Relative paths (/api/...) → prepend APP_URL
|
|
@@ -1311,6 +1919,106 @@ function classifyAndThrowError(status: number, body: any, url: string): never {
|
|
|
1311
1919
|
// Helper Functions
|
|
1312
1920
|
// ============================================================================
|
|
1313
1921
|
|
|
1922
|
+
type InterpolationBaseResolution =
|
|
1923
|
+
| { status: 'resolved'; value: unknown }
|
|
1924
|
+
| { status: 'unresolved-context'; contextPath: string }
|
|
1925
|
+
| { status: 'unknown-workflow-key'; workflowKey: string }
|
|
1926
|
+
| { status: 'env-not-allowlisted'; envKey: string }
|
|
1927
|
+
|
|
1928
|
+
function resolveInterpolationBaseValue(
|
|
1929
|
+
path: string,
|
|
1930
|
+
context: Record<string, any>,
|
|
1931
|
+
workflowInstance?: WorkflowInstance
|
|
1932
|
+
): InterpolationBaseResolution {
|
|
1933
|
+
if (path.startsWith('workflow.') && workflowInstance) {
|
|
1934
|
+
const workflowKey = path.substring('workflow.'.length)
|
|
1935
|
+
switch (workflowKey) {
|
|
1936
|
+
case 'instanceId':
|
|
1937
|
+
return { status: 'resolved', value: workflowInstance.id }
|
|
1938
|
+
case 'tenantId':
|
|
1939
|
+
return { status: 'resolved', value: workflowInstance.tenantId }
|
|
1940
|
+
case 'organizationId':
|
|
1941
|
+
return { status: 'resolved', value: workflowInstance.organizationId }
|
|
1942
|
+
case 'currentStepId':
|
|
1943
|
+
return { status: 'resolved', value: workflowInstance.currentStepId }
|
|
1944
|
+
case 'workflowId':
|
|
1945
|
+
return { status: 'resolved', value: workflowInstance.workflowId }
|
|
1946
|
+
case 'version':
|
|
1947
|
+
return { status: 'resolved', value: workflowInstance.version }
|
|
1948
|
+
default:
|
|
1949
|
+
return { status: 'unknown-workflow-key', workflowKey }
|
|
1950
|
+
}
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
if (path.startsWith('env.')) {
|
|
1954
|
+
const envKey = path.substring('env.'.length)
|
|
1955
|
+
if (!getWorkflowEnvInterpolationAllowlist().has(envKey)) {
|
|
1956
|
+
return { status: 'env-not-allowlisted', envKey }
|
|
1957
|
+
}
|
|
1958
|
+
return { status: 'resolved', value: process.env[envKey] ?? '' }
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1961
|
+
if (path === 'now') {
|
|
1962
|
+
return { status: 'resolved', value: new Date().toISOString() }
|
|
1963
|
+
}
|
|
1964
|
+
|
|
1965
|
+
const contextPath = path.startsWith('context.') ? path.substring('context.'.length) : path
|
|
1966
|
+
const value = getNestedValue(context, contextPath)
|
|
1967
|
+
if (value !== undefined) return { status: 'resolved', value }
|
|
1968
|
+
return { status: 'unresolved-context', contextPath }
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
function strictInterpolationError(rawToken: string, reason: string): WorkflowInterpolationError {
|
|
1972
|
+
return new WorkflowInterpolationError(
|
|
1973
|
+
`Cannot interpolate {{${rawToken}}}: ${reason}`,
|
|
1974
|
+
rawToken
|
|
1975
|
+
)
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
function interpolateToken(
|
|
1979
|
+
rawToken: string,
|
|
1980
|
+
context: Record<string, any>,
|
|
1981
|
+
workflowInstance: WorkflowInstance | undefined,
|
|
1982
|
+
strict: boolean
|
|
1983
|
+
): { resolved: boolean; value?: unknown } {
|
|
1984
|
+
const parsedToken = parseInterpolationToken(rawToken)
|
|
1985
|
+
if (!parsedToken.ok) {
|
|
1986
|
+
if (strict) throw strictInterpolationError(rawToken, parsedToken.error)
|
|
1987
|
+
return { resolved: false }
|
|
1988
|
+
}
|
|
1989
|
+
const resolution = resolveInterpolationBaseValue(parsedToken.path, context, workflowInstance)
|
|
1990
|
+
if (resolution.status === 'unknown-workflow-key') {
|
|
1991
|
+
if (strict) throw strictInterpolationError(rawToken, `unknown workflow key "${resolution.workflowKey}"`)
|
|
1992
|
+
return { resolved: false }
|
|
1993
|
+
}
|
|
1994
|
+
if (resolution.status === 'env-not-allowlisted') {
|
|
1995
|
+
if (strict) throw strictInterpolationError(rawToken, `env variable "${resolution.envKey}" is not allowlisted`)
|
|
1996
|
+
}
|
|
1997
|
+
const baseValue =
|
|
1998
|
+
resolution.status === 'resolved'
|
|
1999
|
+
? resolution.value
|
|
2000
|
+
: resolution.status === 'env-not-allowlisted'
|
|
2001
|
+
? ''
|
|
2002
|
+
: undefined
|
|
2003
|
+
if (parsedToken.transforms.length === 0) {
|
|
2004
|
+
if (resolution.status === 'unresolved-context') {
|
|
2005
|
+
if (strict) throw strictInterpolationError(rawToken, `context path "${resolution.contextPath}" is not defined`)
|
|
2006
|
+
return { resolved: false }
|
|
2007
|
+
}
|
|
2008
|
+
return { resolved: true, value: baseValue }
|
|
2009
|
+
}
|
|
2010
|
+
const transformed = applyTransforms(baseValue, parsedToken.transforms)
|
|
2011
|
+
if (!transformed.ok) {
|
|
2012
|
+
if (strict) throw strictInterpolationError(rawToken, transformed.error.message)
|
|
2013
|
+
return { resolved: false }
|
|
2014
|
+
}
|
|
2015
|
+
if (transformed.value === undefined) {
|
|
2016
|
+
if (strict) throw strictInterpolationError(rawToken, 'the transform pipeline produced no value')
|
|
2017
|
+
return { resolved: false }
|
|
2018
|
+
}
|
|
2019
|
+
return { resolved: true, value: transformed.value }
|
|
2020
|
+
}
|
|
2021
|
+
|
|
1314
2022
|
/**
|
|
1315
2023
|
* Interpolate variables in config from workflow context
|
|
1316
2024
|
*
|
|
@@ -1322,115 +2030,47 @@ function classifyAndThrowError(status: number, body: any, url: string): never {
|
|
|
1322
2030
|
* - {{workflow.currentStepId}} - current step ID
|
|
1323
2031
|
* - {{env.VAR_NAME}} - server-allowlisted environment variables
|
|
1324
2032
|
* - {{now}} - current ISO timestamp
|
|
2033
|
+
* - {{ path | transform(args) | ... }} - pill transform pipeline
|
|
2034
|
+
* (`lib/interpolation-pipeline.ts`): a fixed table of pure transforms folded
|
|
2035
|
+
* over the resolved base value. Lenient behavior (the default): an
|
|
2036
|
+
* unparseable token, an unresolved path without a rescuing `default`, or a
|
|
2037
|
+
* failed transform passes the original token/config through unchanged. In
|
|
2038
|
+
* strict mode (`options.mode: 'strict'`, opted in per definition) the same
|
|
2039
|
+
* situations throw `WorkflowInterpolationError` naming the offending token;
|
|
2040
|
+
* only a `default(...)` transform can rescue an unresolved context path.
|
|
1325
2041
|
*/
|
|
1326
|
-
function interpolateVariables(
|
|
2042
|
+
export function interpolateVariables(
|
|
1327
2043
|
config: any,
|
|
1328
2044
|
context: Record<string, any>,
|
|
1329
|
-
workflowInstance?: WorkflowInstance
|
|
2045
|
+
workflowInstance?: WorkflowInstance,
|
|
2046
|
+
options?: { mode?: WorkflowInterpolationMode }
|
|
1330
2047
|
): any {
|
|
2048
|
+
const strict = options?.mode === 'strict'
|
|
1331
2049
|
if (typeof config === 'string') {
|
|
1332
2050
|
// Check if this is a single variable reference (e.g., "{{context.cart.items}}")
|
|
1333
2051
|
// This preserves the original type (array, object, number, boolean)
|
|
1334
2052
|
const singleVarMatch = config.match(/^\{\{([^}]+)\}\}$/)
|
|
1335
2053
|
|
|
1336
2054
|
if (singleVarMatch) {
|
|
1337
|
-
const
|
|
1338
|
-
|
|
1339
|
-
// Handle {{workflow.*}} variables
|
|
1340
|
-
if (trimmedPath.startsWith('workflow.') && workflowInstance) {
|
|
1341
|
-
const workflowKey = trimmedPath.substring('workflow.'.length)
|
|
1342
|
-
switch (workflowKey) {
|
|
1343
|
-
case 'instanceId':
|
|
1344
|
-
return workflowInstance.id
|
|
1345
|
-
case 'tenantId':
|
|
1346
|
-
return workflowInstance.tenantId
|
|
1347
|
-
case 'organizationId':
|
|
1348
|
-
return workflowInstance.organizationId
|
|
1349
|
-
case 'currentStepId':
|
|
1350
|
-
return workflowInstance.currentStepId
|
|
1351
|
-
case 'workflowId':
|
|
1352
|
-
return workflowInstance.workflowId
|
|
1353
|
-
case 'version':
|
|
1354
|
-
return workflowInstance.version // Return as number
|
|
1355
|
-
default:
|
|
1356
|
-
return config // Return original if unknown
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
|
|
1360
|
-
// Handle {{env.*}} variables
|
|
1361
|
-
if (trimmedPath.startsWith('env.')) {
|
|
1362
|
-
const envKey = trimmedPath.substring('env.'.length)
|
|
1363
|
-
return resolveWorkflowEnvInterpolation(envKey)
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
// Handle {{now}} - current timestamp
|
|
1367
|
-
if (trimmedPath === 'now') {
|
|
1368
|
-
return new Date().toISOString()
|
|
1369
|
-
}
|
|
1370
|
-
|
|
1371
|
-
// Handle {{context.*}} variables (default behavior)
|
|
1372
|
-
const contextPath = trimmedPath.startsWith('context.')
|
|
1373
|
-
? trimmedPath.substring('context.'.length)
|
|
1374
|
-
: trimmedPath
|
|
1375
|
-
|
|
1376
|
-
const value = getNestedValue(context, contextPath)
|
|
1377
|
-
return value !== undefined ? value : config // Return raw value to preserve type
|
|
2055
|
+
const outcome = interpolateToken(singleVarMatch[1], context, workflowInstance, strict)
|
|
2056
|
+
return outcome.resolved ? outcome.value : config
|
|
1378
2057
|
}
|
|
1379
2058
|
|
|
1380
2059
|
// Multiple interpolations or mixed text - return string
|
|
1381
|
-
return config.replace(/\{\{([^}]+)\}\}/g, (match,
|
|
1382
|
-
const
|
|
1383
|
-
|
|
1384
|
-
// Handle {{workflow.*}} variables
|
|
1385
|
-
if (trimmedPath.startsWith('workflow.') && workflowInstance) {
|
|
1386
|
-
const workflowKey = trimmedPath.substring('workflow.'.length)
|
|
1387
|
-
switch (workflowKey) {
|
|
1388
|
-
case 'instanceId':
|
|
1389
|
-
return workflowInstance.id
|
|
1390
|
-
case 'tenantId':
|
|
1391
|
-
return workflowInstance.tenantId
|
|
1392
|
-
case 'organizationId':
|
|
1393
|
-
return workflowInstance.organizationId
|
|
1394
|
-
case 'currentStepId':
|
|
1395
|
-
return workflowInstance.currentStepId
|
|
1396
|
-
case 'workflowId':
|
|
1397
|
-
return workflowInstance.workflowId
|
|
1398
|
-
case 'version':
|
|
1399
|
-
return String(workflowInstance.version)
|
|
1400
|
-
default:
|
|
1401
|
-
return match // Unknown workflow key
|
|
1402
|
-
}
|
|
1403
|
-
}
|
|
1404
|
-
|
|
1405
|
-
// Handle {{env.*}} variables
|
|
1406
|
-
if (trimmedPath.startsWith('env.')) {
|
|
1407
|
-
const envKey = trimmedPath.substring('env.'.length)
|
|
1408
|
-
return resolveWorkflowEnvInterpolation(envKey)
|
|
1409
|
-
}
|
|
1410
|
-
|
|
1411
|
-
// Handle {{now}} - current timestamp
|
|
1412
|
-
if (trimmedPath === 'now') {
|
|
1413
|
-
return new Date().toISOString()
|
|
1414
|
-
}
|
|
1415
|
-
|
|
1416
|
-
// Handle {{context.*}} variables (default behavior)
|
|
1417
|
-
const contextPath = trimmedPath.startsWith('context.')
|
|
1418
|
-
? trimmedPath.substring('context.'.length)
|
|
1419
|
-
: trimmedPath
|
|
1420
|
-
|
|
1421
|
-
const value = getNestedValue(context, contextPath)
|
|
1422
|
-
return value !== undefined ? String(value) : match
|
|
2060
|
+
return config.replace(/\{\{([^}]+)\}\}/g, (match, token) => {
|
|
2061
|
+
const outcome = interpolateToken(token, context, workflowInstance, strict)
|
|
2062
|
+
return outcome.resolved ? String(outcome.value) : match
|
|
1423
2063
|
})
|
|
1424
2064
|
}
|
|
1425
2065
|
|
|
1426
2066
|
if (Array.isArray(config)) {
|
|
1427
|
-
return config.map((item) => interpolateVariables(item, context, workflowInstance))
|
|
2067
|
+
return config.map((item) => interpolateVariables(item, context, workflowInstance, options))
|
|
1428
2068
|
}
|
|
1429
2069
|
|
|
1430
2070
|
if (config && typeof config === 'object') {
|
|
1431
2071
|
const result: Record<string, any> = {}
|
|
1432
2072
|
for (const [key, value] of Object.entries(config)) {
|
|
1433
|
-
result[key] = interpolateVariables(value, context, workflowInstance)
|
|
2073
|
+
result[key] = interpolateVariables(value, context, workflowInstance, options)
|
|
1434
2074
|
}
|
|
1435
2075
|
return result
|
|
1436
2076
|
}
|
|
@@ -1438,6 +2078,24 @@ function interpolateVariables(
|
|
|
1438
2078
|
return config
|
|
1439
2079
|
}
|
|
1440
2080
|
|
|
2081
|
+
function interpolateActivityConfig(
|
|
2082
|
+
config: any,
|
|
2083
|
+
context: ActivityContext,
|
|
2084
|
+
activityType: ActivityType,
|
|
2085
|
+
activityName?: string
|
|
2086
|
+
): any {
|
|
2087
|
+
try {
|
|
2088
|
+
return interpolateVariables(config, context.workflowContext, context.workflowInstance, {
|
|
2089
|
+
mode: context.interpolationMode,
|
|
2090
|
+
})
|
|
2091
|
+
} catch (error) {
|
|
2092
|
+
if (error instanceof WorkflowInterpolationError) {
|
|
2093
|
+
throw new ActivityExecutionError(error.message, activityType, activityName, { token: error.token })
|
|
2094
|
+
}
|
|
2095
|
+
throw error
|
|
2096
|
+
}
|
|
2097
|
+
}
|
|
2098
|
+
|
|
1441
2099
|
/**
|
|
1442
2100
|
* Get nested value from object by path (e.g., "user.email")
|
|
1443
2101
|
*/
|
|
@@ -1504,3 +2162,14 @@ async function executeWithTimeout<T>(
|
|
|
1504
2162
|
clearTimeout(timeoutId!)
|
|
1505
2163
|
}
|
|
1506
2164
|
}
|
|
2165
|
+
|
|
2166
|
+
bindActivityExecutor({
|
|
2167
|
+
executeSendEmail,
|
|
2168
|
+
executeEmitEvent,
|
|
2169
|
+
executeUpdateEntity,
|
|
2170
|
+
executeCallWebhook,
|
|
2171
|
+
executeFunction,
|
|
2172
|
+
executeCallApi,
|
|
2173
|
+
executeSetVariable,
|
|
2174
|
+
executeInvokeAgent,
|
|
2175
|
+
})
|