@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
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
import type { Node, Edge } from '@xyflow/react'
|
|
2
|
+
import dagre from '@dagrejs/dagre'
|
|
2
3
|
import type { WorkflowDefinition } from '../data/entities'
|
|
4
|
+
import type { WorkflowIoContract } from '../data/validators'
|
|
5
|
+
import { isCompensationGhostEdge } from './compensation-ghosts'
|
|
6
|
+
import { isDataMappingEdge } from './data-edge-mapping'
|
|
7
|
+
import { isAnnotationNode } from './editor-annotations'
|
|
8
|
+
import { isTriggerEdge, isTriggerNode } from './trigger-node'
|
|
9
|
+
import { buildWorkflowRouteEdge } from './route-edge'
|
|
10
|
+
import {
|
|
11
|
+
findRouteKindDescriptor,
|
|
12
|
+
resolveEdgeRouteKind,
|
|
13
|
+
type RouteKindTransitionLike,
|
|
14
|
+
} from './route-kinds'
|
|
15
|
+
import {
|
|
16
|
+
NODE_DESCRIPTION_HEIGHT,
|
|
17
|
+
NODE_HEIGHT,
|
|
18
|
+
NODE_OUTCOME_FOOTER_CHROME_HEIGHT,
|
|
19
|
+
NODE_OUTCOME_ROW_HEIGHT,
|
|
20
|
+
NODE_MAX_WIDTH,
|
|
21
|
+
NODE_MIN_WIDTH,
|
|
22
|
+
TERMINAL_NODE_HEIGHT,
|
|
23
|
+
TERMINAL_NODE_MIN_WIDTH,
|
|
24
|
+
} from './node-geometry'
|
|
3
25
|
|
|
4
26
|
/**
|
|
5
27
|
* Graph Utilities for Visual Workflow Editor
|
|
@@ -11,19 +33,72 @@ export interface GraphToDefinitionOptions {
|
|
|
11
33
|
includePositions?: boolean
|
|
12
34
|
}
|
|
13
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Task inspector keys (spec §6.1) that round-trip verbatim between the node and
|
|
38
|
+
* the definition's `userTaskConfig`.
|
|
39
|
+
*
|
|
40
|
+
* They are listed rather than spread so an editor-only key on `node.data` can
|
|
41
|
+
* never leak into a persisted definition, and so the set is one obvious place
|
|
42
|
+
* to extend. The engine reads them through `userTaskConfig`; the inspector
|
|
43
|
+
* reads them off `node.data`, which is why both directions copy.
|
|
44
|
+
*/
|
|
45
|
+
const USER_TASK_INSPECTOR_KEYS = [
|
|
46
|
+
'instructions',
|
|
47
|
+
'entityBindings',
|
|
48
|
+
'priority',
|
|
49
|
+
'deadline',
|
|
50
|
+
'reminders',
|
|
51
|
+
'onBreach',
|
|
52
|
+
'decisions',
|
|
53
|
+
'editablePrefilled',
|
|
54
|
+
// The §7.1 portal discriminator. Listing it here is what makes it survive a
|
|
55
|
+
// Studio save at all: before, a definition carrying `assigneeKind: 'customer'`
|
|
56
|
+
// (authorable only through the Code view) was rebuilt from the fixed keys
|
|
57
|
+
// above and the portal addressing was silently downgraded to backoffice.
|
|
58
|
+
'assigneeKind',
|
|
59
|
+
] as const
|
|
60
|
+
|
|
14
61
|
export interface DefinitionToGraphOptions {
|
|
15
62
|
autoLayout?: boolean
|
|
16
63
|
layoutSpacing?: { vertical: number; horizontal: number }
|
|
64
|
+
/**
|
|
65
|
+
* Declared IO port contracts of referenced sub-workflows, keyed by
|
|
66
|
+
* `subWorkflowId`. When provided, a SUB_WORKFLOW node renders the child's
|
|
67
|
+
* IN/OUT ports. Absent → the node renders without ports (backward compatible).
|
|
68
|
+
*/
|
|
69
|
+
childContracts?: Map<string, WorkflowIoContract>
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface LayoutWithDagreOptions {
|
|
73
|
+
/** Flow direction. Default `'LR'` (left→right). */
|
|
74
|
+
direction?: 'LR' | 'TB'
|
|
75
|
+
nodeWidth?: number
|
|
76
|
+
nodeHeight?: number
|
|
17
77
|
}
|
|
18
78
|
|
|
19
79
|
/**
|
|
20
80
|
* Convert ReactFlow graph (nodes + edges) to workflow definition JSON
|
|
21
81
|
*/
|
|
22
82
|
export function graphToDefinition(
|
|
23
|
-
|
|
83
|
+
allNodes: Node[],
|
|
24
84
|
edges: Edge[],
|
|
25
85
|
options: GraphToDefinitionOptions = {}
|
|
26
86
|
): WorkflowDefinition['definition'] {
|
|
87
|
+
// Sticky notes and groups are editor annotations (spec 4.5): they live only in
|
|
88
|
+
// `metadata.editor.annotations` and MUST NOT reach `steps` or `transitions`,
|
|
89
|
+
// so a definition carrying them serializes byte-identically to one that does
|
|
90
|
+
// not and the engine can never see them.
|
|
91
|
+
// The canvas trigger pill (fidelity gap #5) is filtered on the same terms:
|
|
92
|
+
// it is a render-time overlay derived from `definition.triggers` and has no
|
|
93
|
+
// step form at all, so a definition declaring triggers must serialize
|
|
94
|
+
// byte-identically to one that does not. It can only reach here through a
|
|
95
|
+
// caller mistake — it never enters the editor's node state — which is exactly
|
|
96
|
+
// why the guarantee is enforced rather than assumed.
|
|
97
|
+
const nodes = allNodes.filter((node) => !isAnnotationNode(node) && !isTriggerNode(node))
|
|
98
|
+
const annotationIds = new Set(
|
|
99
|
+
allNodes.filter((node) => isAnnotationNode(node) || isTriggerNode(node)).map((node) => node.id),
|
|
100
|
+
)
|
|
101
|
+
|
|
27
102
|
// Extract steps from nodes
|
|
28
103
|
const steps = nodes.map((node) => {
|
|
29
104
|
const step: any = {
|
|
@@ -78,6 +153,11 @@ export function graphToDefinition(
|
|
|
78
153
|
if ((node.data as any).escalationRules || (node.data as any).userTaskConfig?.escalationRules) {
|
|
79
154
|
step.userTaskConfig.escalationRules = (node.data as any).escalationRules || (node.data as any).userTaskConfig.escalationRules
|
|
80
155
|
}
|
|
156
|
+
|
|
157
|
+
for (const key of USER_TASK_INSPECTOR_KEYS) {
|
|
158
|
+
const authored = (node.data as any)[key] ?? (node.data as any).userTaskConfig?.[key]
|
|
159
|
+
if (authored !== undefined) step.userTaskConfig[key] = authored
|
|
160
|
+
}
|
|
81
161
|
}
|
|
82
162
|
|
|
83
163
|
// Wait for signal configuration
|
|
@@ -90,11 +170,47 @@ export function graphToDefinition(
|
|
|
90
170
|
step.activities = node.data.activities
|
|
91
171
|
}
|
|
92
172
|
|
|
173
|
+
// Invoke-agent step → AUTOMATED step carrying the INVOKE_AGENT activity plus
|
|
174
|
+
// a signalConfig so the engine can park-and-resume the human path. The
|
|
175
|
+
// stepType is already AUTOMATED via mapNodeTypeToStepType.
|
|
176
|
+
if (node.type === 'invokeAgent') {
|
|
177
|
+
if (node.data.activities) {
|
|
178
|
+
step.activities = node.data.activities
|
|
179
|
+
}
|
|
180
|
+
if (node.data.signalConfig) {
|
|
181
|
+
step.signalConfig = node.data.signalConfig
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
93
185
|
// Pre-conditions (for START steps)
|
|
94
186
|
if (node.type === 'start' && (node.data as any).preConditions && (node.data as any).preConditions.length > 0) {
|
|
95
187
|
step.preConditions = (node.data as any).preConditions
|
|
96
188
|
}
|
|
97
189
|
|
|
190
|
+
// Error directive (spec 5.9). Absent stays absent so definitions that never
|
|
191
|
+
// opened the picker save byte-identically.
|
|
192
|
+
if ((node.data as any).errorDirective) {
|
|
193
|
+
step.errorDirective = (node.data as any).errorDirective
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Editor-owned step metadata. `unmappedConfig` is config a step-type
|
|
197
|
+
// conversion could not map onto the new type (spec 4.5) — it is carried
|
|
198
|
+
// through save/load verbatim so nothing an author configured is ever lost.
|
|
199
|
+
const stepMetadata: Record<string, unknown> = {
|
|
200
|
+
...((node.data as any).stepMetadata && typeof (node.data as any).stepMetadata === 'object'
|
|
201
|
+
? (node.data as any).stepMetadata as Record<string, unknown>
|
|
202
|
+
: {}),
|
|
203
|
+
}
|
|
204
|
+
const unmappedConfig = (node.data as any).unmappedConfig
|
|
205
|
+
if (unmappedConfig && typeof unmappedConfig === 'object' && Object.keys(unmappedConfig).length > 0) {
|
|
206
|
+
stepMetadata.unmappedConfig = unmappedConfig
|
|
207
|
+
} else {
|
|
208
|
+
delete stepMetadata.unmappedConfig
|
|
209
|
+
}
|
|
210
|
+
if (Object.keys(stepMetadata).length > 0) {
|
|
211
|
+
step.metadata = stepMetadata
|
|
212
|
+
}
|
|
213
|
+
|
|
98
214
|
// Store position for visual editor
|
|
99
215
|
if (options.includePositions && node.position) {
|
|
100
216
|
step._editorPosition = {
|
|
@@ -106,8 +222,17 @@ export function graphToDefinition(
|
|
|
106
222
|
return step
|
|
107
223
|
})
|
|
108
224
|
|
|
109
|
-
// Extract transitions from edges
|
|
110
|
-
|
|
225
|
+
// Extract transitions from edges. Drag-authored data-mapping edges are NOT
|
|
226
|
+
// transitions — their binding lives in the target step's config.inputMapping —
|
|
227
|
+
// and compensation ghosts (spec 4.4) are a rendering of existing routes, not
|
|
228
|
+
// routes of their own, so both are excluded here.
|
|
229
|
+
const transitions = edges
|
|
230
|
+
.filter((edge) => !isDataMappingEdge(edge)
|
|
231
|
+
&& !isCompensationGhostEdge(edge)
|
|
232
|
+
&& !isTriggerEdge(edge)
|
|
233
|
+
&& !annotationIds.has(edge.source)
|
|
234
|
+
&& !annotationIds.has(edge.target))
|
|
235
|
+
.map((edge) => {
|
|
111
236
|
const edgeData = edge.data as any
|
|
112
237
|
const transition: any = {
|
|
113
238
|
transitionId: edge.id,
|
|
@@ -126,6 +251,15 @@ export function graphToDefinition(
|
|
|
126
251
|
transition.priority = edgeData.priority
|
|
127
252
|
}
|
|
128
253
|
|
|
254
|
+
// Route kind marker (spec 5.9 error routes, and every kind registered
|
|
255
|
+
// beside them in lib/route-kinds.ts). Only non-normal kinds are persisted;
|
|
256
|
+
// normal routes stay exactly as they were serialized before.
|
|
257
|
+
const routeKind = resolveEdgeRouteKind(edgeData?.kind, edge.sourceHandle)
|
|
258
|
+
if (routeKind) {
|
|
259
|
+
transition.kind = routeKind.kind
|
|
260
|
+
Object.assign(transition, routeKind.discriminatorFields(edge))
|
|
261
|
+
}
|
|
262
|
+
|
|
129
263
|
// Add continueOnActivityFailure if present (default false)
|
|
130
264
|
if (edgeData?.continueOnActivityFailure !== undefined) {
|
|
131
265
|
transition.continueOnActivityFailure = edgeData.continueOnActivityFailure
|
|
@@ -140,6 +274,12 @@ export function graphToDefinition(
|
|
|
140
274
|
transition.postConditions = edgeData.postConditions
|
|
141
275
|
}
|
|
142
276
|
|
|
277
|
+
// Inline condition expression (business_rules language). Branching routes
|
|
278
|
+
// authored on IF_ELSE / SWITCH nodes are plain conditioned transitions.
|
|
279
|
+
if (edgeData?.condition !== undefined && edgeData.condition !== null) {
|
|
280
|
+
transition.condition = edgeData.condition
|
|
281
|
+
}
|
|
282
|
+
|
|
143
283
|
// Add activities if present in edge data
|
|
144
284
|
if (edgeData?.activities && edgeData.activities.length > 0) {
|
|
145
285
|
transition.activities = edgeData.activities.map((activity: any) => ({
|
|
@@ -152,10 +292,17 @@ export function graphToDefinition(
|
|
|
152
292
|
...(activity.timeout && { timeout: activity.timeout }),
|
|
153
293
|
...(activity.retryPolicy && { retryPolicy: activity.retryPolicy }),
|
|
154
294
|
...(activity.compensate !== undefined && { compensate: activity.compensate }),
|
|
295
|
+
// Saga compensation (`compensation.activityId`) is what the canvas'
|
|
296
|
+
// compensation ghosts render and what `lib/compensation-handler.ts`
|
|
297
|
+
// executes on failure — it MUST survive the editor round trip.
|
|
298
|
+
...(activity.compensation && { compensation: activity.compensation }),
|
|
155
299
|
}))
|
|
156
|
-
} else {
|
|
300
|
+
} else if (!transition.kind) {
|
|
157
301
|
// Check if source node is automated and has activity data
|
|
158
|
-
// If so, place the activity in this transition
|
|
302
|
+
// If so, place the activity in this transition. A non-normal route never
|
|
303
|
+
// inherits the source step's activity — it is the recovery path, and
|
|
304
|
+
// re-running the activity that just failed (or that the run never got
|
|
305
|
+
// past) is exactly wrong.
|
|
159
306
|
const sourceNode = nodes.find(n => n.id === edge.source)
|
|
160
307
|
if (sourceNode && sourceNode.type === 'automated' && sourceNode.data) {
|
|
161
308
|
if (sourceNode.data.activityType || sourceNode.data.activityId) {
|
|
@@ -205,28 +352,52 @@ export function definitionToGraph(
|
|
|
205
352
|
definition: WorkflowDefinition['definition'],
|
|
206
353
|
options: DefinitionToGraphOptions = {}
|
|
207
354
|
): { nodes: Node[]; edges: Edge[] } {
|
|
208
|
-
const { autoLayout = true, layoutSpacing = { vertical: 200, horizontal: 300 } } = options
|
|
355
|
+
const { autoLayout = true, layoutSpacing = { vertical: 200, horizontal: 300 }, childContracts } = options
|
|
209
356
|
|
|
210
357
|
// Build step map for quick lookup
|
|
211
358
|
const stepMap = new Map(definition.steps.map(step => [step.stepId, step]))
|
|
212
359
|
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
|
|
360
|
+
// Collect author-arranged positions persisted in the definition. A stored
|
|
361
|
+
// position always wins over an auto-computed one, so a saved graph re-opens
|
|
362
|
+
// exactly as the author left it.
|
|
363
|
+
const storedPositions = new Map<string, { x: number; y: number }>()
|
|
364
|
+
for (const step of definition.steps) {
|
|
365
|
+
const stored = (step as any)._editorPosition
|
|
366
|
+
if (stored && typeof stored.x === 'number' && typeof stored.y === 'number') {
|
|
367
|
+
storedPositions.set(step.stepId, { x: stored.x, y: stored.y })
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Auto-arrange only the steps that lack a stored position (e.g. freshly added
|
|
372
|
+
// nodes, or legacy/code graphs with no stored coordinates at all). When the
|
|
373
|
+
// caller explicitly disables autoLayout, skip dagre entirely.
|
|
374
|
+
const needsDagre = autoLayout && definition.steps.some((step) => !storedPositions.has(step.stepId))
|
|
375
|
+
const dagrePositions = needsDagre
|
|
376
|
+
? layoutWithDagre(definition.steps, definition.transitions, {
|
|
377
|
+
direction: 'LR',
|
|
378
|
+
nodeWidth: NODE_MIN_WIDTH,
|
|
379
|
+
nodeHeight: NODE_HEIGHT,
|
|
380
|
+
})
|
|
216
381
|
: null
|
|
217
382
|
|
|
218
383
|
// Convert steps to nodes
|
|
219
384
|
const nodes: Node[] = definition.steps.map((step, index) => {
|
|
220
|
-
// Determine position
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
385
|
+
// Determine position: stored (author-arranged) → dagre (auto) → fallback.
|
|
386
|
+
const position = storedPositions.get(step.stepId)
|
|
387
|
+
|| dagrePositions?.get(step.stepId)
|
|
388
|
+
|| { x: 250, y: 50 + index * layoutSpacing.vertical }
|
|
389
|
+
|
|
390
|
+
// Map step type to node type. An AUTOMATED step whose activities contain a
|
|
391
|
+
// single INVOKE_AGENT marker is the compiled form of an invoke-agent node —
|
|
392
|
+
// round-trip it back to that node type so the dedicated editor/UI is used.
|
|
393
|
+
const invokeAgentActivity = (step.stepType === 'AUTOMATED'
|
|
394
|
+
? ((step as any).activities as any[] | undefined)?.find(
|
|
395
|
+
(activity) => activity?.activityType === 'INVOKE_AGENT',
|
|
396
|
+
)
|
|
397
|
+
: undefined)
|
|
398
|
+
const nodeType = invokeAgentActivity
|
|
399
|
+
? 'invokeAgent'
|
|
400
|
+
: mapStepTypeToNodeType(step.stepType)
|
|
230
401
|
|
|
231
402
|
// Build node data
|
|
232
403
|
const nodeData: any = {
|
|
@@ -250,6 +421,17 @@ export function definitionToGraph(
|
|
|
250
421
|
nodeData.config = (step as any).config
|
|
251
422
|
}
|
|
252
423
|
|
|
424
|
+
// Editor-owned step metadata round-trips as-is; the quarantined config a
|
|
425
|
+
// step-type conversion produced is lifted out so the inspector can show it.
|
|
426
|
+
const stepMetadata = (step as any).metadata
|
|
427
|
+
if (stepMetadata && typeof stepMetadata === 'object') {
|
|
428
|
+
nodeData.stepMetadata = stepMetadata
|
|
429
|
+
const unmappedConfig = (stepMetadata as Record<string, unknown>).unmappedConfig
|
|
430
|
+
if (unmappedConfig && typeof unmappedConfig === 'object') {
|
|
431
|
+
nodeData.unmappedConfig = unmappedConfig
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
253
435
|
// Add user task data
|
|
254
436
|
if (step.stepType === 'USER_TASK' && step.userTaskConfig) {
|
|
255
437
|
nodeData.assignedTo = step.userTaskConfig.assignedTo
|
|
@@ -277,6 +459,11 @@ export function definitionToGraph(
|
|
|
277
459
|
if (step.userTaskConfig.escalationRules) {
|
|
278
460
|
nodeData.escalationRules = step.userTaskConfig.escalationRules
|
|
279
461
|
}
|
|
462
|
+
|
|
463
|
+
for (const key of USER_TASK_INSPECTOR_KEYS) {
|
|
464
|
+
const persisted = (step.userTaskConfig as Record<string, unknown>)[key]
|
|
465
|
+
if (persisted !== undefined) nodeData[key] = persisted
|
|
466
|
+
}
|
|
280
467
|
}
|
|
281
468
|
|
|
282
469
|
// Add wait for signal data
|
|
@@ -284,16 +471,48 @@ export function definitionToGraph(
|
|
|
284
471
|
nodeData.signalConfig = (step as any).signalConfig
|
|
285
472
|
}
|
|
286
473
|
|
|
474
|
+
// Add sub-workflow port contract so the node renders the child's IN/OUT
|
|
475
|
+
// ports without opening it. Resolved from the supplied childContracts map.
|
|
476
|
+
if (step.stepType === 'SUB_WORKFLOW') {
|
|
477
|
+
const subWorkflowId = (step as any).config?.subWorkflowId
|
|
478
|
+
const contract = subWorkflowId ? childContracts?.get(subWorkflowId) : undefined
|
|
479
|
+
if (contract?.inputs?.length) nodeData.inputs = contract.inputs
|
|
480
|
+
if (contract?.outputs?.length) nodeData.outputs = contract.outputs
|
|
481
|
+
// Display-only mirror of config.subWorkflowId/version, so the node renders
|
|
482
|
+
// "Invokes: <id>" without re-reading config. The runtime + editor dialog
|
|
483
|
+
// keep config.subWorkflowId/version as the source of truth.
|
|
484
|
+
if ((step as any).config) {
|
|
485
|
+
nodeData.subWorkflowId = (step as any).config.subWorkflowId
|
|
486
|
+
if ((step as any).config.version != null) {
|
|
487
|
+
nodeData.version = (step as any).config.version
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
287
492
|
// Add step activities data (for AUTOMATED steps)
|
|
288
493
|
if (step.stepType === 'AUTOMATED' && (step as any).activities) {
|
|
289
494
|
nodeData.activities = (step as any).activities
|
|
290
495
|
}
|
|
291
496
|
|
|
497
|
+
// Add invoke-agent data (compiled AUTOMATED step). Carry the signalConfig and
|
|
498
|
+
// a display-only agentId so the node renders without re-parsing activities.
|
|
499
|
+
if (invokeAgentActivity) {
|
|
500
|
+
if ((step as any).signalConfig) {
|
|
501
|
+
nodeData.signalConfig = (step as any).signalConfig
|
|
502
|
+
}
|
|
503
|
+
nodeData.agentId = invokeAgentActivity.config?.agentId
|
|
504
|
+
}
|
|
505
|
+
|
|
292
506
|
// Add pre-conditions data (for START steps)
|
|
293
507
|
if (step.stepType === 'START' && (step as any).preConditions) {
|
|
294
508
|
nodeData.preConditions = (step as any).preConditions
|
|
295
509
|
}
|
|
296
510
|
|
|
511
|
+
// Error directive (spec 5.9)
|
|
512
|
+
if ((step as any).errorDirective) {
|
|
513
|
+
nodeData.errorDirective = (step as any).errorDirective
|
|
514
|
+
}
|
|
515
|
+
|
|
297
516
|
// Set badge based on type
|
|
298
517
|
nodeData.badge = getBadgeForNodeType(nodeType)
|
|
299
518
|
|
|
@@ -308,15 +527,42 @@ export function definitionToGraph(
|
|
|
308
527
|
}
|
|
309
528
|
})
|
|
310
529
|
|
|
530
|
+
const decisionTransitionIdsByStep = new Map<string, Set<string>>()
|
|
531
|
+
for (const step of definition.steps) {
|
|
532
|
+
if (step.stepType !== 'USER_TASK') continue
|
|
533
|
+
const transitionIds = (step.userTaskConfig?.decisions ?? [])
|
|
534
|
+
.map((decision: { transitionId?: unknown }) => decision.transitionId)
|
|
535
|
+
.filter(
|
|
536
|
+
(transitionId: unknown): transitionId is string =>
|
|
537
|
+
typeof transitionId === 'string',
|
|
538
|
+
)
|
|
539
|
+
if (transitionIds.length > 0) {
|
|
540
|
+
decisionTransitionIdsByStep.set(step.stepId, new Set(transitionIds))
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
311
544
|
// Convert transitions to edges
|
|
312
545
|
const edges: Edge[] = definition.transitions.map((transition) => {
|
|
313
|
-
|
|
546
|
+
const routeTransition: RouteKindTransitionLike = transition
|
|
547
|
+
const routeKind = findRouteKindDescriptor(routeTransition.kind)
|
|
548
|
+
const decisionSourceHandle = decisionTransitionIdsByStep
|
|
549
|
+
.get(transition.fromStepId)
|
|
550
|
+
?.has(transition.transitionId)
|
|
551
|
+
? transition.transitionId
|
|
552
|
+
: undefined
|
|
553
|
+
return buildWorkflowRouteEdge({
|
|
314
554
|
id: transition.transitionId,
|
|
315
555
|
source: transition.fromStepId,
|
|
316
556
|
target: transition.toStepId,
|
|
317
|
-
|
|
557
|
+
// A kinded route re-attaches to its own output handle so the canvas
|
|
558
|
+
// renders it leaving the same port the author drew it from.
|
|
559
|
+
sourceHandle: routeKind
|
|
560
|
+
? routeKind.resolveSourceHandle(routeTransition)
|
|
561
|
+
: decisionSourceHandle,
|
|
318
562
|
data: {
|
|
319
563
|
trigger: transition.trigger,
|
|
564
|
+
...(routeKind ? { kind: routeKind.kind } : {}),
|
|
565
|
+
...(routeTransition.outcomeKind ? { outcomeKind: routeTransition.outcomeKind } : {}),
|
|
320
566
|
transitionName: (transition as any).transitionName,
|
|
321
567
|
priority: (transition as any).priority !== undefined ? (transition as any).priority : 0,
|
|
322
568
|
continueOnActivityFailure: (transition as any).continueOnActivityFailure !== undefined
|
|
@@ -324,126 +570,338 @@ export function definitionToGraph(
|
|
|
324
570
|
: false,
|
|
325
571
|
preConditions: transition.preConditions || [],
|
|
326
572
|
postConditions: transition.postConditions || [],
|
|
573
|
+
condition: (transition as any).condition,
|
|
327
574
|
activities: transition.activities || [],
|
|
328
575
|
label: (transition as any).transitionName || (transition as any).label, // Backward compat
|
|
329
576
|
state: (transition as any).state || 'pending', // Default edge state
|
|
330
577
|
},
|
|
331
|
-
}
|
|
578
|
+
})
|
|
332
579
|
})
|
|
333
580
|
|
|
334
581
|
return { nodes, edges }
|
|
335
582
|
}
|
|
336
583
|
|
|
337
584
|
/**
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
585
|
+
* Compute overlap-free, node-size-aware layout positions using `@dagrejs/dagre`.
|
|
586
|
+
*
|
|
587
|
+
* Builds a layered graph (default `rankdir: 'LR'` → left→right flow), runs dagre
|
|
588
|
+
* to rank nodes and minimize edge crossings, then converts dagre's center-origin
|
|
589
|
+
* coordinates to React Flow's top-left origin. Returns a `Map` of `stepId` →
|
|
590
|
+
* top-left `{ x, y }`, the same shape the previous custom layout produced.
|
|
591
|
+
*
|
|
592
|
+
* Only control-flow transitions are passed here — drag-authored data mappings
|
|
593
|
+
* are not transitions (they live in the target step's `config.inputMapping`).
|
|
343
594
|
*/
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
595
|
+
/**
|
|
596
|
+
* Approximate a node card's rendered footprint when its true measured size is
|
|
597
|
+
* not yet known (initial open, before React Flow measures the DOM). Cards are
|
|
598
|
+
* `w-fit` between `NODE_MIN_WIDTH` and `NODE_MAX_WIDTH` (see lib/node-geometry); their
|
|
599
|
+
* width is driven mostly by the two-line `line-clamp-2` description, which pushes
|
|
600
|
+
* almost any described node to the max width. So a node WITH a description is
|
|
601
|
+
* estimated at the cap (and taller for the extra line); a bare-title node sizes
|
|
602
|
+
* to its title. Underestimating here is what makes ranks overlap, so this errs
|
|
603
|
+
* toward the real (larger) footprint. The Auto-arrange path uses exact measured
|
|
604
|
+
* sizes instead and does not rely on this.
|
|
605
|
+
*/
|
|
606
|
+
function estimateNodeSize(
|
|
607
|
+
label: unknown,
|
|
608
|
+
hasDescription: boolean,
|
|
609
|
+
isTerminal: boolean,
|
|
610
|
+
outcomeRowCount = 0,
|
|
611
|
+
): { width: number; height: number } {
|
|
612
|
+
const text = typeof label === 'string' ? label.trim() : ''
|
|
613
|
+
const titleWidth = Math.round(text.length * 7) + 64
|
|
614
|
+
// Terminals are auto-width pills carrying only an icon and a name: no
|
|
615
|
+
// description row, no minimum card width.
|
|
616
|
+
if (isTerminal) {
|
|
617
|
+
return {
|
|
618
|
+
width: Math.min(Math.max(TERMINAL_NODE_MIN_WIDTH, titleWidth), NODE_MAX_WIDTH),
|
|
619
|
+
height: TERMINAL_NODE_HEIGHT,
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
const width = hasDescription
|
|
623
|
+
? NODE_MAX_WIDTH
|
|
624
|
+
: Math.min(Math.max(NODE_MIN_WIDTH, titleWidth), NODE_MAX_WIDTH)
|
|
625
|
+
const bodyHeight = hasDescription ? NODE_HEIGHT + NODE_DESCRIPTION_HEIGHT : NODE_HEIGHT
|
|
626
|
+
const footerHeight =
|
|
627
|
+
outcomeRowCount > 0
|
|
628
|
+
? NODE_OUTCOME_FOOTER_CHROME_HEIGHT + outcomeRowCount * NODE_OUTCOME_ROW_HEIGHT
|
|
629
|
+
: 0
|
|
630
|
+
return { width, height: bodyHeight + footerHeight }
|
|
631
|
+
}
|
|
350
632
|
|
|
351
|
-
|
|
633
|
+
/**
|
|
634
|
+
* START / END, in either vocabulary: `definitionToGraph` lays out definition
|
|
635
|
+
* steps (which carry `stepType`), `applyAutoLayout` lays out React Flow nodes
|
|
636
|
+
* (which carry the editor `nodeType`).
|
|
637
|
+
*/
|
|
638
|
+
interface NodeFootprintLike {
|
|
639
|
+
width?: unknown
|
|
640
|
+
height?: unknown
|
|
641
|
+
description?: unknown
|
|
642
|
+
stepName?: unknown
|
|
643
|
+
label?: unknown
|
|
644
|
+
stepType?: unknown
|
|
645
|
+
nodeType?: unknown
|
|
646
|
+
stepId?: unknown
|
|
647
|
+
userTaskConfig?: { decisions?: unknown }
|
|
648
|
+
decisions?: unknown
|
|
649
|
+
activities?: unknown
|
|
650
|
+
}
|
|
352
651
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
652
|
+
interface OutcomeLayoutTransitionLike {
|
|
653
|
+
fromStepId?: unknown
|
|
654
|
+
kind?: unknown
|
|
655
|
+
outcomeKind?: unknown
|
|
656
|
+
}
|
|
356
657
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
658
|
+
function isTerminalStep(step: NodeFootprintLike): boolean {
|
|
659
|
+
return step.stepType === 'START'
|
|
660
|
+
|| step.stepType === 'END'
|
|
661
|
+
|| step.nodeType === 'start'
|
|
662
|
+
|| step.nodeType === 'end'
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* Footprint dagre reserves for a node: its exact measured size when React Flow
|
|
667
|
+
* has already laid it out (the Auto-arrange path passes `node.measured`),
|
|
668
|
+
* otherwise the description-aware estimate above. Exported so a layout test can
|
|
669
|
+
* assert that the boxes dagre reserved actually do not overlap.
|
|
670
|
+
*/
|
|
671
|
+
export function nodeFootprint(
|
|
672
|
+
step: NodeFootprintLike,
|
|
673
|
+
outcomeRowCount = 0,
|
|
674
|
+
): { width: number; height: number } {
|
|
675
|
+
if (typeof step.width === 'number' && typeof step.height === 'number') {
|
|
676
|
+
return { width: step.width, height: step.height }
|
|
360
677
|
}
|
|
678
|
+
const description = step.description
|
|
679
|
+
const hasDescription = typeof description === 'string' && description.trim().length > 0
|
|
680
|
+
return estimateNodeSize(
|
|
681
|
+
step.stepName ?? step.label,
|
|
682
|
+
hasDescription,
|
|
683
|
+
isTerminalStep(step),
|
|
684
|
+
outcomeRowCount,
|
|
685
|
+
)
|
|
686
|
+
}
|
|
361
687
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
688
|
+
/**
|
|
689
|
+
* How many outcome rows a step's footer renders (fidelity gap #4). An agent step
|
|
690
|
+
* shows its WIRED outcomes plus `approved`; a user task shows one row per
|
|
691
|
+
* authored decision. Both are derived here rather than measured, because dagre
|
|
692
|
+
* runs before React Flow has laid a single card out.
|
|
693
|
+
*
|
|
694
|
+
* A footer that renders at all also carries the step's DEFAULT route as its last
|
|
695
|
+
* row, which is why a non-empty count gets one more: under-estimating here is
|
|
696
|
+
* exactly what makes dagre pack ranks into each other.
|
|
697
|
+
*/
|
|
698
|
+
function countOutcomeRows(
|
|
699
|
+
step: NodeFootprintLike,
|
|
700
|
+
transitions: OutcomeLayoutTransitionLike[],
|
|
701
|
+
): number {
|
|
702
|
+
const rows = countAuthoredOutcomeRows(step, transitions)
|
|
703
|
+
return rows > 0 ? rows + 1 : 0
|
|
704
|
+
}
|
|
366
705
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
706
|
+
function countAuthoredOutcomeRows(
|
|
707
|
+
step: NodeFootprintLike,
|
|
708
|
+
transitions: OutcomeLayoutTransitionLike[],
|
|
709
|
+
): number {
|
|
710
|
+
const decisions = step?.userTaskConfig?.decisions ?? step?.decisions
|
|
711
|
+
if (Array.isArray(decisions)) {
|
|
712
|
+
return decisions.filter(
|
|
713
|
+
(decision) =>
|
|
714
|
+
typeof decision === 'object'
|
|
715
|
+
&& decision !== null
|
|
716
|
+
&& typeof (decision as { transitionId?: unknown }).transitionId === 'string',
|
|
717
|
+
).length
|
|
370
718
|
}
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
719
|
+
if (!isInvokeAgentStep(step)) return 0
|
|
720
|
+
const wired = new Set<string>()
|
|
721
|
+
for (const transition of transitions) {
|
|
722
|
+
if (transition?.fromStepId !== step.stepId) continue
|
|
723
|
+
if (transition?.kind !== 'outcome') continue
|
|
724
|
+
if (typeof transition.outcomeKind === 'string') wired.add(transition.outcomeKind)
|
|
377
725
|
}
|
|
726
|
+
wired.add('approved')
|
|
727
|
+
return wired.size
|
|
728
|
+
}
|
|
378
729
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
const
|
|
730
|
+
function isInvokeAgentStep(step: NodeFootprintLike): boolean {
|
|
731
|
+
if (step?.nodeType === 'invokeAgent') return true
|
|
732
|
+
const activities = step?.activities
|
|
733
|
+
return Array.isArray(activities)
|
|
734
|
+
&& activities.some(
|
|
735
|
+
(activity) =>
|
|
736
|
+
typeof activity === 'object'
|
|
737
|
+
&& activity !== null
|
|
738
|
+
&& (activity as { activityType?: unknown }).activityType === 'INVOKE_AGENT',
|
|
739
|
+
)
|
|
740
|
+
}
|
|
382
741
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
742
|
+
function layoutWithDagre(
|
|
743
|
+
steps: any[],
|
|
744
|
+
transitions: any[],
|
|
745
|
+
options: LayoutWithDagreOptions = {}
|
|
746
|
+
): Map<string, { x: number; y: number }> {
|
|
747
|
+
const positions = new Map<string, { x: number; y: number }>()
|
|
386
748
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
749
|
+
if (steps.length === 0) return positions
|
|
750
|
+
|
|
751
|
+
const rankdir = options.direction ?? 'LR'
|
|
390
752
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
if (currentLevel !== undefined && level <= currentLevel) continue
|
|
395
|
-
levels.set(id, level)
|
|
753
|
+
const graph = new dagre.graphlib.Graph()
|
|
754
|
+
graph.setDefaultEdgeLabel(() => ({}))
|
|
755
|
+
graph.setGraph({ rankdir, nodesep: 60, ranksep: 80 })
|
|
396
756
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
757
|
+
// Reserve each node's real footprint (measured when available, else a
|
|
758
|
+
// description-aware estimate). `ranksep`/`nodesep` then become the actual
|
|
759
|
+
// visible gap between cards, so the spacing is neither cramped nor blown apart.
|
|
760
|
+
for (const step of steps) {
|
|
761
|
+
graph.setNode(step.stepId, nodeFootprint(step, countOutcomeRows(step, transitions)))
|
|
762
|
+
}
|
|
400
763
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
764
|
+
// Transition labels are hover-only (WorkflowTransitionEdge), so they occupy no
|
|
765
|
+
// persistent canvas space — the layout no longer reserves a label pill between
|
|
766
|
+
// ranks, keeping nodes tight against `ranksep` instead of pushing them apart by
|
|
767
|
+
// the (previously up to 220px wide) label footprint.
|
|
768
|
+
for (const transition of transitions) {
|
|
769
|
+
if (graph.hasNode(transition.fromStepId) && graph.hasNode(transition.toStepId)) {
|
|
770
|
+
graph.setEdge(transition.fromStepId, transition.toStepId, {})
|
|
404
771
|
}
|
|
405
772
|
}
|
|
406
773
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
for (const
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
774
|
+
dagre.layout(graph)
|
|
775
|
+
|
|
776
|
+
for (const step of steps) {
|
|
777
|
+
const node = graph.node(step.stepId)
|
|
778
|
+
if (!node || typeof node.x !== 'number' || typeof node.y !== 'number') continue
|
|
779
|
+
// dagre returns the node center; React Flow positions use the top-left corner.
|
|
780
|
+
// Offset by this node's own footprint (set above), not a shared constant.
|
|
781
|
+
positions.set(step.stepId, {
|
|
782
|
+
x: node.x - node.width / 2,
|
|
783
|
+
y: node.y - node.height / 2,
|
|
784
|
+
})
|
|
413
785
|
}
|
|
414
786
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
const startY = 50
|
|
787
|
+
return positions
|
|
788
|
+
}
|
|
418
789
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
const y = startY + level * spacing.vertical
|
|
790
|
+
/** Gap between the main flow and the return lane a loop node is dropped into. */
|
|
791
|
+
export const RETURN_LANE_GAP = 64
|
|
422
792
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
793
|
+
/**
|
|
794
|
+
* Drop dedicated return nodes into a lane BELOW the main flow (issue: loop route
|
|
795
|
+
* lines cross-cutting the cards).
|
|
796
|
+
*
|
|
797
|
+
* dagre lays out LR and ranks a loop node (e.g. a retry `WAIT_FOR_TIMER`) to the
|
|
798
|
+
* RIGHT of the step it routes back to, so its back-edge curves across the row and
|
|
799
|
+
* reads as spaghetti. This post-pass finds a node whose ONLY outgoing edge is a
|
|
800
|
+
* back-edge (its target sits left of it) — i.e. a node that exists purely to
|
|
801
|
+
* route back — and lowers it beneath every card its return arc spans, keeping its
|
|
802
|
+
* x. The forward edge then drops down to it and the return edge rises back up as
|
|
803
|
+
* one clean arc under the row.
|
|
804
|
+
*
|
|
805
|
+
* Guards keep it conservative: only single-out-edge return nodes move, so a
|
|
806
|
+
* genuine business loop through a multi-branch step is left to dagre. PURE.
|
|
807
|
+
*/
|
|
808
|
+
export function liftReturnNodesBelow(
|
|
809
|
+
positions: Map<string, { x: number; y: number }>,
|
|
810
|
+
sizeById: Map<string, { width: number; height: number }>,
|
|
811
|
+
transitions: { fromStepId: string; toStepId: string }[],
|
|
812
|
+
gap: number = RETURN_LANE_GAP,
|
|
813
|
+
): Map<string, { x: number; y: number }> {
|
|
814
|
+
const outDegree = new Map<string, number>()
|
|
815
|
+
for (const transition of transitions) {
|
|
816
|
+
outDegree.set(transition.fromStepId, (outDegree.get(transition.fromStepId) ?? 0) + 1)
|
|
817
|
+
}
|
|
439
818
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
819
|
+
const widthOf = (id: string) => sizeById.get(id)?.width ?? NODE_MIN_WIDTH
|
|
820
|
+
const heightOf = (id: string) => sizeById.get(id)?.height ?? NODE_HEIGHT
|
|
821
|
+
|
|
822
|
+
const result = new Map(positions)
|
|
823
|
+
for (const transition of transitions) {
|
|
824
|
+
const from = result.get(transition.fromStepId)
|
|
825
|
+
const to = result.get(transition.toStepId)
|
|
826
|
+
if (!from || !to) continue
|
|
827
|
+
// A back-edge in an LR layout: the target sits left of the source.
|
|
828
|
+
if (to.x >= from.x) continue
|
|
829
|
+
// Only a DEDICATED return node moves — one whose sole job is to route back.
|
|
830
|
+
if ((outDegree.get(transition.fromStepId) ?? 0) !== 1) continue
|
|
831
|
+
|
|
832
|
+
const spanLeft = to.x
|
|
833
|
+
const spanRight = from.x + widthOf(transition.fromStepId)
|
|
834
|
+
let laneTop = Number.NEGATIVE_INFINITY
|
|
835
|
+
for (const [id, pos] of result) {
|
|
836
|
+
if (id === transition.fromStepId) continue
|
|
837
|
+
const nodeRight = pos.x + widthOf(id)
|
|
838
|
+
if (nodeRight < spanLeft || pos.x > spanRight) continue // no horizontal overlap
|
|
839
|
+
laneTop = Math.max(laneTop, pos.y + heightOf(id))
|
|
443
840
|
}
|
|
841
|
+
if (laneTop === Number.NEGATIVE_INFINITY) continue
|
|
842
|
+
result.set(transition.fromStepId, { x: from.x, y: Math.round(laneTop + gap) })
|
|
444
843
|
}
|
|
844
|
+
return result
|
|
845
|
+
}
|
|
445
846
|
|
|
446
|
-
|
|
847
|
+
/**
|
|
848
|
+
* Re-run the dagre layered layout (`rankdir: 'LR'`) directly over React Flow
|
|
849
|
+
* nodes + edges and return a NEW node array with refreshed `position` values.
|
|
850
|
+
*
|
|
851
|
+
* This is the single intentional full re-layout entry point (the "Auto-arrange"
|
|
852
|
+
* toolbar action): it deliberately IGNORES any stored `_editorPosition` and
|
|
853
|
+
* re-tidies the whole graph. Every other node field (`data`, `type`, handle
|
|
854
|
+
* config, …) is preserved — only `position` is replaced. Data-mapping edges are
|
|
855
|
+
* excluded from the rank graph since they are not control-flow transitions.
|
|
856
|
+
*/
|
|
857
|
+
export function applyAutoLayout(nodes: Node[], edges: Edge[]): Node[] {
|
|
858
|
+
// Use each node's exact measured footprint so dagre reserves the real on-screen
|
|
859
|
+
// size; React Flow has already measured the cards by the time the user clicks
|
|
860
|
+
// Auto-arrange. Fall back to the estimate only for any not-yet-measured node.
|
|
861
|
+
// Annotations are not ranked: dagre only knows about the control-flow graph,
|
|
862
|
+
// so a note or group placed deliberately beside a step keeps the position its
|
|
863
|
+
// author gave it while Tidy re-lays the steps around it.
|
|
864
|
+
// The trigger pill is excluded for the same reason a note is, only harder: it
|
|
865
|
+
// has no rank at all. It is positioned relative to the START terminal it
|
|
866
|
+
// annotates, so ranking it would move it out from under its own anchor.
|
|
867
|
+
const steps = nodes
|
|
868
|
+
.filter((node) => !isAnnotationNode(node) && !isTriggerNode(node))
|
|
869
|
+
.map((node) => ({
|
|
870
|
+
stepId: node.id,
|
|
871
|
+
stepName: (node.data as any)?.label,
|
|
872
|
+
nodeType: node.type,
|
|
873
|
+
description: (node.data as any)?.description,
|
|
874
|
+
width: node.measured?.width,
|
|
875
|
+
height: node.measured?.height,
|
|
876
|
+
}))
|
|
877
|
+
const transitions = edges
|
|
878
|
+
.filter((edge) => !isDataMappingEdge(edge))
|
|
879
|
+
.map((edge) => ({
|
|
880
|
+
fromStepId: edge.source,
|
|
881
|
+
toStepId: edge.target,
|
|
882
|
+
}))
|
|
883
|
+
|
|
884
|
+
const positions = layoutWithDagre(steps, transitions, {
|
|
885
|
+
direction: 'LR',
|
|
886
|
+
nodeWidth: NODE_MIN_WIDTH,
|
|
887
|
+
nodeHeight: NODE_HEIGHT,
|
|
888
|
+
})
|
|
889
|
+
|
|
890
|
+
// Post-pass: lower dedicated return nodes (retry timers, loop-back waits) into
|
|
891
|
+
// a lane below the row so their return arc reads cleanly instead of cutting
|
|
892
|
+
// across the cards.
|
|
893
|
+
const sizeById = new Map<string, { width: number; height: number }>(
|
|
894
|
+
steps.map((step) => [
|
|
895
|
+
step.stepId as string,
|
|
896
|
+
{ width: step.width ?? NODE_MIN_WIDTH, height: step.height ?? NODE_HEIGHT },
|
|
897
|
+
]),
|
|
898
|
+
)
|
|
899
|
+
const laidOut = liftReturnNodesBelow(positions, sizeById, transitions)
|
|
900
|
+
|
|
901
|
+
return nodes.map((node) => {
|
|
902
|
+
const next = laidOut.get(node.id)
|
|
903
|
+
return next ? { ...node, position: { x: next.x, y: next.y } } : node
|
|
904
|
+
})
|
|
447
905
|
}
|
|
448
906
|
|
|
449
907
|
/**
|
|
@@ -455,9 +913,17 @@ function mapNodeTypeToStepType(nodeType: string): string {
|
|
|
455
913
|
end: 'END',
|
|
456
914
|
userTask: 'USER_TASK',
|
|
457
915
|
automated: 'AUTOMATED',
|
|
916
|
+
subWorkflow: 'SUB_WORKFLOW',
|
|
458
917
|
decision: 'DECISION',
|
|
459
918
|
waitForSignal: 'WAIT_FOR_SIGNAL',
|
|
460
919
|
waitForTimer: 'WAIT_FOR_TIMER',
|
|
920
|
+
waitForCondition: 'WAIT_FOR_CONDITION',
|
|
921
|
+
parallelFork: 'PARALLEL_FORK',
|
|
922
|
+
parallelJoin: 'PARALLEL_JOIN',
|
|
923
|
+
// The invoke-agent node is a specialization of an AUTOMATED step.
|
|
924
|
+
invokeAgent: 'AUTOMATED',
|
|
925
|
+
ifElse: 'IF_ELSE',
|
|
926
|
+
switch: 'SWITCH',
|
|
461
927
|
}
|
|
462
928
|
return mapping[nodeType] || 'AUTOMATED'
|
|
463
929
|
}
|
|
@@ -471,9 +937,15 @@ function mapStepTypeToNodeType(stepType: string): string {
|
|
|
471
937
|
END: 'end',
|
|
472
938
|
USER_TASK: 'userTask',
|
|
473
939
|
AUTOMATED: 'automated',
|
|
940
|
+
SUB_WORKFLOW: 'subWorkflow',
|
|
474
941
|
DECISION: 'decision',
|
|
475
942
|
WAIT_FOR_SIGNAL: 'waitForSignal',
|
|
476
943
|
WAIT_FOR_TIMER: 'waitForTimer',
|
|
944
|
+
WAIT_FOR_CONDITION: 'waitForCondition',
|
|
945
|
+
PARALLEL_FORK: 'parallelFork',
|
|
946
|
+
PARALLEL_JOIN: 'parallelJoin',
|
|
947
|
+
IF_ELSE: 'ifElse',
|
|
948
|
+
SWITCH: 'switch',
|
|
477
949
|
}
|
|
478
950
|
return mapping[stepType] || 'automated'
|
|
479
951
|
}
|
|
@@ -481,15 +953,22 @@ function mapStepTypeToNodeType(stepType: string): string {
|
|
|
481
953
|
/**
|
|
482
954
|
* Get badge text for node type
|
|
483
955
|
*/
|
|
484
|
-
function getBadgeForNodeType(nodeType: string): string {
|
|
956
|
+
export function getBadgeForNodeType(nodeType: string): string {
|
|
485
957
|
const badges: Record<string, string> = {
|
|
486
958
|
start: 'Start',
|
|
487
959
|
end: 'End',
|
|
488
960
|
userTask: 'User Task',
|
|
489
961
|
automated: 'Automated',
|
|
490
962
|
decision: 'Decision',
|
|
963
|
+
subWorkflow: 'Sub-Workflow',
|
|
491
964
|
waitForSignal: 'Wait for Signal',
|
|
492
965
|
waitForTimer: 'Wait for Timer',
|
|
966
|
+
waitForCondition: 'Wait for Condition',
|
|
967
|
+
parallelFork: 'Parallel Fork',
|
|
968
|
+
parallelJoin: 'Parallel Join',
|
|
969
|
+
invokeAgent: 'Invoke Agent',
|
|
970
|
+
ifElse: 'If / Else',
|
|
971
|
+
switch: 'Switch',
|
|
493
972
|
}
|
|
494
973
|
return badges[nodeType] || 'Task'
|
|
495
974
|
}
|
|
@@ -504,9 +983,16 @@ export interface ValidationError {
|
|
|
504
983
|
edgeId?: string
|
|
505
984
|
}
|
|
506
985
|
|
|
507
|
-
export function validateWorkflowGraph(
|
|
986
|
+
export function validateWorkflowGraph(allNodes: Node[], edges: Edge[]): ValidationError[] {
|
|
508
987
|
const errors: ValidationError[] = []
|
|
509
988
|
|
|
989
|
+
// Annotations are documentation, not steps: a sticky note has no routes by
|
|
990
|
+
// design and must never be reported as a disconnected node. The trigger pill
|
|
991
|
+
// is skipped for a stronger reason: it is not a step, so counting it would
|
|
992
|
+
// corrupt the exactly-one-START / at-least-one-END invariants this function
|
|
993
|
+
// exists to enforce.
|
|
994
|
+
const nodes = allNodes.filter((node) => !isAnnotationNode(node) && !isTriggerNode(node))
|
|
995
|
+
|
|
510
996
|
// Check for at least one start node
|
|
511
997
|
const startNodes = nodes.filter((n) => n.type === 'start')
|
|
512
998
|
if (startNodes.length === 0) {
|
|
@@ -657,14 +1143,38 @@ export function generateStepId(prefix: string = 'step'): string {
|
|
|
657
1143
|
return sanitizeId(id)
|
|
658
1144
|
}
|
|
659
1145
|
|
|
1146
|
+
/** Prefix marking a durable, opaque transition id. */
|
|
1147
|
+
export const DURABLE_TRANSITION_ID_PREFIX = 't_'
|
|
1148
|
+
|
|
1149
|
+
const LEGACY_TRANSITION_ID_PATTERN = /^e_/
|
|
1150
|
+
|
|
660
1151
|
/**
|
|
661
|
-
* Generate
|
|
1152
|
+
* Generate a durable, opaque transition ID.
|
|
1153
|
+
*
|
|
1154
|
+
* Endpoint-derived ids (`e_<from>_<to>`) tie a route's identity to the pair of
|
|
1155
|
+
* steps it happens to connect today, so re-pointing an edge would silently
|
|
1156
|
+
* change the id that mid-flight state resolves against
|
|
1157
|
+
* (`instance.pendingTransition`, `WorkflowBranchInstance.branchKey`). Opaque ids
|
|
1158
|
+
* keep route identity stable across reattachment and let two routes share the
|
|
1159
|
+
* same endpoints (a normal route and an error route, for example).
|
|
1160
|
+
*
|
|
1161
|
+
* Legacy endpoint-derived ids stay fully valid: stored definitions, seeded
|
|
1162
|
+
* examples and gallery templates keep their ids on load and save, and the
|
|
1163
|
+
* engine treats every transition id as an opaque string.
|
|
1164
|
+
*
|
|
1165
|
+
* The endpoint parameters are accepted for signature compatibility with callers
|
|
1166
|
+
* written against the endpoint-derived form; they no longer affect the result.
|
|
662
1167
|
*/
|
|
663
|
-
export function generateTransitionId(
|
|
664
|
-
const id =
|
|
1168
|
+
export function generateTransitionId(_fromStepId?: string, _toStepId?: string): string {
|
|
1169
|
+
const id = `${DURABLE_TRANSITION_ID_PREFIX}${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 11)}`
|
|
665
1170
|
return sanitizeId(id)
|
|
666
1171
|
}
|
|
667
1172
|
|
|
1173
|
+
/** True when the id uses the legacy endpoint-derived (`e_<from>_<to>`) shape. */
|
|
1174
|
+
export function isLegacyTransitionId(transitionId: string): boolean {
|
|
1175
|
+
return LEGACY_TRANSITION_ID_PATTERN.test(transitionId)
|
|
1176
|
+
}
|
|
1177
|
+
|
|
668
1178
|
/**
|
|
669
1179
|
* Append a new edge to the list, skipping duplicate connections.
|
|
670
1180
|
*
|