@open-mercato/core 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7195.1.b5efd1d51a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -2
- package/AGENTS.md +4 -3
- package/agentic/standalone-guide.md +1 -1
- package/build.mjs +16 -0
- package/dist/bootstrap.js +7 -3
- package/dist/bootstrap.js.map +2 -2
- package/dist/generated/entities/action_log/index.js +2 -0
- package/dist/generated/entities/action_log/index.js.map +2 -2
- package/dist/generated/entities/user/index.js +2 -0
- package/dist/generated/entities/user/index.js.map +2 -2
- package/dist/generated/entities/user_task/index.js +14 -0
- package/dist/generated/entities/user_task/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition/index.js +6 -0
- package/dist/generated/entities/workflow_definition/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition_draft/index.js +25 -0
- package/dist/generated/entities/workflow_definition_draft/index.js.map +7 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js +23 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js.map +7 -0
- package/dist/generated/entities/workflow_instance/index.js +4 -0
- package/dist/generated/entities/workflow_instance/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +4 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +39 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/workflowsFixtures.js +477 -2
- package/dist/helpers/integration/workflowsFixtures.js.map +2 -2
- package/dist/helpers/integration/workflowsUi.js +148 -0
- package/dist/helpers/integration/workflowsUi.js.map +7 -0
- package/dist/modules/attachments/lib/createFromBuffer.js +79 -0
- package/dist/modules/attachments/lib/createFromBuffer.js.map +7 -0
- package/dist/modules/audit_logs/data/entities.js +5 -0
- package/dist/modules/audit_logs/data/entities.js.map +2 -2
- package/dist/modules/audit_logs/data/validators.js +1 -0
- package/dist/modules/audit_logs/data/validators.js.map +2 -2
- package/dist/modules/audit_logs/lib/projections.js +2 -1
- package/dist/modules/audit_logs/lib/projections.js.map +2 -2
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js +15 -0
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js.map +7 -0
- package/dist/modules/audit_logs/services/actionLogService.js +3 -0
- package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
- package/dist/modules/auth/data/entities.js +6 -0
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/lib/executionPrincipal.js +140 -0
- package/dist/modules/auth/lib/executionPrincipal.js.map +7 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js +13 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js.map +7 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js +154 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js.map +7 -0
- package/dist/modules/business_rules/data/validators.js +6 -0
- package/dist/modules/business_rules/data/validators.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-engine.js +5 -3
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +5 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/workflows.js +19 -0
- package/dist/modules/catalog/workflows.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/cli.js +80 -0
- package/dist/modules/customer_accounts/cli.js.map +7 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js +59 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js.map +7 -0
- package/dist/modules/customer_accounts/setup.js +4 -2
- package/dist/modules/customer_accounts/setup.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +4 -0
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js +1 -1
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +2 -0
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/events.js +13 -2
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/link-workflow-task-handler.js +64 -0
- package/dist/modules/customers/lib/link-workflow-task-handler.js.map +7 -0
- package/dist/modules/customers/lib/todoCompatibility.js +1 -1
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/customers/lib/workflowTaskLink.js +9 -0
- package/dist/modules/customers/lib/workflowTaskLink.js.map +7 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js +12 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js.map +7 -0
- package/dist/modules/customers/workflows.js +29 -0
- package/dist/modules/customers/workflows.js.map +7 -0
- package/dist/modules/entities/api/records.js +13 -33
- package/dist/modules/entities/api/records.js.map +3 -3
- package/dist/modules/entities/lib/entityClassification.js +60 -0
- package/dist/modules/entities/lib/entityClassification.js.map +7 -0
- package/dist/modules/sales/commands/documents.js +31 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/events.js +12 -1
- package/dist/modules/sales/events.js.map +2 -2
- package/dist/modules/sales/workflows.js +12 -1
- package/dist/modules/sales/workflows.js.map +2 -2
- package/dist/modules/seeds/cli.js +199 -0
- package/dist/modules/seeds/cli.js.map +7 -0
- package/dist/modules/seeds/examples/sample-seed.json +26 -0
- package/dist/modules/seeds/index.js +12 -0
- package/dist/modules/seeds/index.js.map +7 -0
- package/dist/modules/workflows/acl.js +96 -0
- package/dist/modules/workflows/acl.js.map +2 -2
- package/dist/modules/workflows/ai-agents.js +50 -0
- package/dist/modules/workflows/ai-agents.js.map +7 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js +582 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js.map +7 -0
- package/dist/modules/workflows/ai-tools/types.js +43 -0
- package/dist/modules/workflows/ai-tools/types.js.map +7 -0
- package/dist/modules/workflows/ai-tools.js +10 -0
- package/dist/modules/workflows/ai-tools.js.map +7 -0
- package/dist/modules/workflows/api/command-settings/route.js +137 -0
- package/dist/modules/workflows/api/command-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/commands/route.js +72 -0
- package/dist/modules/workflows/api/commands/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js +76 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js +134 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js +5 -1
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js +286 -0
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js +207 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +5 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js +93 -9
- package/dist/modules/workflows/api/definitions/[id]/route.js.map +3 -3
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js +210 -0
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/generate/route.js +233 -0
- package/dist/modules/workflows/api/definitions/generate/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/route.js +61 -113
- package/dist/modules/workflows/api/definitions/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/serialize.js +9 -0
- package/dist/modules/workflows/api/definitions/serialize.js.map +2 -2
- package/dist/modules/workflows/api/endpoints/route.js +69 -0
- package/dist/modules/workflows/api/endpoints/route.js.map +7 -0
- package/dist/modules/workflows/api/functions/route.js +73 -0
- package/dist/modules/workflows/api/functions/route.js.map +7 -0
- package/dist/modules/workflows/api/grantable-features/route.js +75 -0
- package/dist/modules/workflows/api/grantable-features/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js +180 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js +184 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/retry/route.js +12 -2
- package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js +148 -0
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js +123 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js +172 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js +117 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js +165 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/route.js +94 -3
- package/dist/modules/workflows/api/instances/route.js.map +2 -2
- package/dist/modules/workflows/api/metrics/definitions/route.js +188 -0
- package/dist/modules/workflows/api/metrics/definitions/route.js.map +7 -0
- package/dist/modules/workflows/api/openapi.js +415 -4
- package/dist/modules/workflows/api/openapi.js.map +2 -2
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js +132 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js +97 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/route.js +126 -0
- package/dist/modules/workflows/api/portal/tasks/route.js.map +7 -0
- package/dist/modules/workflows/api/rule-usage/route.js +80 -0
- package/dist/modules/workflows/api/rule-usage/route.js.map +7 -0
- package/dist/modules/workflows/api/task-settings/route.js +107 -0
- package/dist/modules/workflows/api/task-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js +27 -16
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js +40 -16
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js +150 -0
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/route.js +39 -6
- package/dist/modules/workflows/api/tasks/[id]/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js +100 -0
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/route.js +37 -6
- package/dist/modules/workflows/api/tasks/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/serialize.js +83 -0
- package/dist/modules/workflows/api/tasks/serialize.js.map +7 -0
- package/dist/modules/workflows/api/templates/route.js +69 -0
- package/dist/modules/workflows/api/templates/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js +129 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/route.js +119 -0
- package/dist/modules/workflows/api/work-inbox/route.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.js +10 -0
- package/dist/modules/workflows/backend/config/workflows/page.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js +35 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/[id]/page.js +6 -271
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/definitions/create/page.js +7 -56
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +131 -51
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2606 -677
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +3 -3
- package/dist/modules/workflows/backend/instances/[id]/page.js +532 -421
- package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/instances/failure-queue/page.js +211 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.js.map +7 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js +20 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/instances/page.js +159 -22
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/tasks/[id]/page.js +553 -392
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/page.js +8 -250
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.meta.js +1 -0
- package/dist/modules/workflows/backend/tasks/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/work-inbox/page.js +399 -0
- package/dist/modules/workflows/backend/work-inbox/page.js.map +7 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js +19 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js.map +7 -0
- package/dist/modules/workflows/cli.js +1 -1
- package/dist/modules/workflows/cli.js.map +2 -2
- package/dist/modules/workflows/commands/tasks.js +81 -0
- package/dist/modules/workflows/commands/tasks.js.map +7 -0
- package/dist/modules/workflows/components/ActivitiesEditor.js +281 -287
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
- package/dist/modules/workflows/components/ActivityEditDialog.js +220 -0
- package/dist/modules/workflows/components/ActivityEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/AgentSelector.js +115 -0
- package/dist/modules/workflows/components/AgentSelector.js.map +7 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js +110 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js +71 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRulesSelector.js +151 -93
- package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
- package/dist/modules/workflows/components/ConfigJsonTextarea.js +85 -0
- package/dist/modules/workflows/components/ConfigJsonTextarea.js.map +7 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js +150 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js +102 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js +377 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js +132 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +307 -216
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialog.js +11 -18
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +112 -72
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/InputDataPanel.js +128 -0
- package/dist/modules/workflows/components/InputDataPanel.js.map +7 -0
- package/dist/modules/workflows/components/InspectorPanel.js +161 -0
- package/dist/modules/workflows/components/InspectorPanel.js.map +7 -0
- package/dist/modules/workflows/components/NodeEditDialog.js +363 -41
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +714 -159
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TemplateGalleryDialog.js +148 -0
- package/dist/modules/workflows/components/TemplateGalleryDialog.js.map +7 -0
- package/dist/modules/workflows/components/TransitionsEditor.js +80 -74
- package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TriggersDialog.js +53 -0
- package/dist/modules/workflows/components/TriggersDialog.js.map +7 -0
- package/dist/modules/workflows/components/TriggersEditor.js +331 -0
- package/dist/modules/workflows/components/TriggersEditor.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js +278 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js +173 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js +62 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js +70 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js +36 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowGraph.js +4 -2
- package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +324 -86
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +3 -3
- package/dist/modules/workflows/components/WorkflowIconPicker.js +109 -0
- package/dist/modules/workflows/components/WorkflowIconPicker.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowLegend.js +45 -29
- package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowNodeCard.js +221 -22
- package/dist/modules/workflows/components/WorkflowNodeCard.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowRouteChips.js +111 -0
- package/dist/modules/workflows/components/WorkflowRouteChips.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowSelector.js +108 -88
- package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js +61 -11
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js +15 -5
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +88 -21
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js +615 -0
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js +191 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js +488 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js +61 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js.map +7 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js +227 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +37 -4
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/CommandPicker.js +111 -0
- package/dist/modules/workflows/components/fields/CommandPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js +235 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FunctionPicker.js +55 -0
- package/dist/modules/workflows/components/fields/FunctionPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js +38 -15
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js +206 -0
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js +53 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js.map +7 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js +130 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js +104 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js.map +7 -0
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +2 -2
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js +210 -0
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js +126 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js +218 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js +114 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js +64 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js.map +7 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js +121 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js.map +7 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js +35 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js.map +7 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js +16 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js.map +7 -0
- package/dist/modules/workflows/components/formConfig.js +39 -10
- package/dist/modules/workflows/components/formConfig.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileMetadataSheet.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +29 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +64 -65
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +2 -2
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js +64 -0
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/AutomatedNode.js +24 -16
- package/dist/modules/workflows/components/nodes/AutomatedNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/EndNode.js +13 -12
- package/dist/modules/workflows/components/nodes/EndNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js +29 -0
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js.map +7 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js +51 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js +122 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js +100 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js.map +7 -0
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StartNode.js +66 -15
- package/dist/modules/workflows/components/nodes/StartNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js +54 -0
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js +107 -41
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/SwitchNode.js +51 -0
- package/dist/modules/workflows/components/nodes/SwitchNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js +65 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js +111 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/UserTaskNode.js +43 -17
- package/dist/modules/workflows/components/nodes/UserTaskNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js +53 -0
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/index.js +14 -0
- package/dist/modules/workflows/components/nodes/index.js.map +2 -2
- package/dist/modules/workflows/components/portal/PortalTaskForm.js +196 -0
- package/dist/modules/workflows/components/portal/PortalTaskForm.js.map +7 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js +22 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js.map +7 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js +106 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js.map +7 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js +30 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunGantt.js +130 -0
- package/dist/modules/workflows/components/run/RunGantt.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js +82 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js +116 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js.map +7 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js +52 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js.map +7 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js +28 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js.map +7 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js +89 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js +41 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js +57 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js.map +7 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js +156 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js +72 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js +156 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js +46 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js +53 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js +261 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js +27 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-schemas.js +191 -0
- package/dist/modules/workflows/data/activity-config-schemas.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-warnings.js +42 -0
- package/dist/modules/workflows/data/activity-config-warnings.js.map +7 -0
- package/dist/modules/workflows/data/branching-route-warnings.js +65 -0
- package/dist/modules/workflows/data/branching-route-warnings.js.map +7 -0
- package/dist/modules/workflows/data/entities.js +144 -4
- package/dist/modules/workflows/data/entities.js.map +2 -2
- package/dist/modules/workflows/data/metrics-validators.js +35 -0
- package/dist/modules/workflows/data/metrics-validators.js.map +7 -0
- package/dist/modules/workflows/data/task-primitives.js +14 -0
- package/dist/modules/workflows/data/task-primitives.js.map +7 -0
- package/dist/modules/workflows/data/validators.js +504 -61
- package/dist/modules/workflows/data/validators.js.map +3 -3
- package/dist/modules/workflows/di.js +16 -1
- package/dist/modules/workflows/di.js.map +2 -2
- package/dist/modules/workflows/events.js +66 -8
- package/dist/modules/workflows/events.js.map +2 -2
- package/dist/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/dist/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/dist/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/dist/modules/workflows/examples/templates/order-approval.json +230 -0
- package/dist/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/dist/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/dist/modules/workflows/extension-points.js +1 -1
- package/dist/modules/workflows/extension-points.js.map +2 -2
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js +144 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js +12 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js +114 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js +18 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js.map +7 -0
- package/dist/modules/workflows/lib/activity-executor.js +505 -137
- package/dist/modules/workflows/lib/activity-executor.js.map +3 -3
- package/dist/modules/workflows/lib/activity-queue-types.js +3 -1
- package/dist/modules/workflows/lib/activity-queue-types.js.map +2 -2
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js +2 -0
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js.map +7 -0
- package/dist/modules/workflows/lib/activity-registry.js +27 -0
- package/dist/modules/workflows/lib/activity-registry.js.map +7 -0
- package/dist/modules/workflows/lib/activity-types.js +291 -0
- package/dist/modules/workflows/lib/activity-types.js.map +7 -0
- package/dist/modules/workflows/lib/activity-worker-handler.js +456 -32
- package/dist/modules/workflows/lib/activity-worker-handler.js.map +3 -3
- package/dist/modules/workflows/lib/advanced-config.js +31 -0
- package/dist/modules/workflows/lib/advanced-config.js.map +7 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js +198 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js.map +7 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js +82 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js.map +7 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js +54 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js +61 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review.js +66 -0
- package/dist/modules/workflows/lib/agent-review.js.map +7 -0
- package/dist/modules/workflows/lib/ai-authoring.js +155 -0
- package/dist/modules/workflows/lib/ai-authoring.js.map +7 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js +43 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js.map +7 -0
- package/dist/modules/workflows/lib/annotation-events.js +10 -0
- package/dist/modules/workflows/lib/annotation-events.js.map +7 -0
- package/dist/modules/workflows/lib/branching-routes.js +182 -0
- package/dist/modules/workflows/lib/branching-routes.js.map +7 -0
- package/dist/modules/workflows/lib/breach-routing.js +50 -0
- package/dist/modules/workflows/lib/breach-routing.js.map +7 -0
- package/dist/modules/workflows/lib/bulk-replay.js +101 -0
- package/dist/modules/workflows/lib/bulk-replay.js.map +7 -0
- package/dist/modules/workflows/lib/business-rule-usage.js +91 -0
- package/dist/modules/workflows/lib/business-rule-usage.js.map +7 -0
- package/dist/modules/workflows/lib/caller-graph.js +53 -0
- package/dist/modules/workflows/lib/caller-graph.js.map +7 -0
- package/dist/modules/workflows/lib/code-view-apply.js +86 -0
- package/dist/modules/workflows/lib/code-view-apply.js.map +7 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js +164 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js.map +7 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js +72 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js.map +7 -0
- package/dist/modules/workflows/lib/component-guard.js +7 -0
- package/dist/modules/workflows/lib/component-guard.js.map +7 -0
- package/dist/modules/workflows/lib/condition-handler.js +443 -0
- package/dist/modules/workflows/lib/condition-handler.js.map +7 -0
- package/dist/modules/workflows/lib/context-ledger.js +448 -0
- package/dist/modules/workflows/lib/context-ledger.js.map +7 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js +8 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js.map +7 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js +63 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/definition-context-schema.js +56 -0
- package/dist/modules/workflows/lib/definition-context-schema.js.map +7 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js +123 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js.map +7 -0
- package/dist/modules/workflows/lib/definition-error-body.js +33 -0
- package/dist/modules/workflows/lib/definition-error-body.js.map +7 -0
- package/dist/modules/workflows/lib/definition-evaluation.js +79 -0
- package/dist/modules/workflows/lib/definition-evaluation.js.map +7 -0
- package/dist/modules/workflows/lib/definition-grant.js +90 -0
- package/dist/modules/workflows/lib/definition-grant.js.map +7 -0
- package/dist/modules/workflows/lib/definition-json-locations.js +139 -0
- package/dist/modules/workflows/lib/definition-json-locations.js.map +7 -0
- package/dist/modules/workflows/lib/definition-payload.js +31 -0
- package/dist/modules/workflows/lib/definition-payload.js.map +7 -0
- package/dist/modules/workflows/lib/draft-restore.js +49 -0
- package/dist/modules/workflows/lib/draft-restore.js.map +7 -0
- package/dist/modules/workflows/lib/dry-run.js +106 -0
- package/dist/modules/workflows/lib/dry-run.js.map +7 -0
- package/dist/modules/workflows/lib/duration.js +66 -17
- package/dist/modules/workflows/lib/duration.js.map +2 -2
- package/dist/modules/workflows/lib/edge-reattachment.js +79 -0
- package/dist/modules/workflows/lib/edge-reattachment.js.map +7 -0
- package/dist/modules/workflows/lib/edgeFormTransforms.js +7 -11
- package/dist/modules/workflows/lib/edgeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/editor-annotations.js +195 -0
- package/dist/modules/workflows/lib/editor-annotations.js.map +7 -0
- package/dist/modules/workflows/lib/editor-commands.js +103 -0
- package/dist/modules/workflows/lib/editor-commands.js.map +7 -0
- package/dist/modules/workflows/lib/editor-history.js +51 -0
- package/dist/modules/workflows/lib/editor-history.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js +181 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-path.js +90 -0
- package/dist/modules/workflows/lib/endpoint-path.js.map +7 -0
- package/dist/modules/workflows/lib/engine-version.js +42 -0
- package/dist/modules/workflows/lib/engine-version.js.map +7 -0
- package/dist/modules/workflows/lib/error-handler.js +132 -0
- package/dist/modules/workflows/lib/error-handler.js.map +7 -0
- package/dist/modules/workflows/lib/error-routing.js +104 -0
- package/dist/modules/workflows/lib/error-routing.js.map +7 -0
- package/dist/modules/workflows/lib/event-logger.js +23 -0
- package/dist/modules/workflows/lib/event-logger.js.map +2 -2
- package/dist/modules/workflows/lib/expression-refs.js +168 -0
- package/dist/modules/workflows/lib/expression-refs.js.map +7 -0
- package/dist/modules/workflows/lib/failure-grouping.js +62 -0
- package/dist/modules/workflows/lib/failure-grouping.js.map +7 -0
- package/dist/modules/workflows/lib/find-definition.js +1 -0
- package/dist/modules/workflows/lib/find-definition.js.map +2 -2
- package/dist/modules/workflows/lib/flow-logic-warnings.js +338 -0
- package/dist/modules/workflows/lib/flow-logic-warnings.js.map +7 -0
- package/dist/modules/workflows/lib/graph-utils.js +328 -77
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/dist/modules/workflows/lib/icon-search.js +32 -0
- package/dist/modules/workflows/lib/icon-search.js.map +7 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js +26 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js.map +7 -0
- package/dist/modules/workflows/lib/instance-date-filter.js +28 -0
- package/dist/modules/workflows/lib/instance-date-filter.js.map +7 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js +271 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-drag.js +28 -0
- package/dist/modules/workflows/lib/ledger-drag.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js +66 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js +82 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js +110 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js +26 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js +160 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js.map +7 -0
- package/dist/modules/workflows/lib/node-config-summary.js +128 -0
- package/dist/modules/workflows/lib/node-config-summary.js.map +7 -0
- package/dist/modules/workflows/lib/node-geometry.js +53 -0
- package/dist/modules/workflows/lib/node-geometry.js.map +7 -0
- package/dist/modules/workflows/lib/node-nudge.js +44 -0
- package/dist/modules/workflows/lib/node-nudge.js.map +7 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js +88 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js.map +7 -0
- package/dist/modules/workflows/lib/node-placement.js +55 -0
- package/dist/modules/workflows/lib/node-placement.js.map +7 -0
- package/dist/modules/workflows/lib/node-type-icons.js +54 -13
- package/dist/modules/workflows/lib/node-type-icons.js.map +2 -2
- package/dist/modules/workflows/lib/nodeFormTransforms.js +329 -19
- package/dist/modules/workflows/lib/nodeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/outcome-routing.js +158 -0
- package/dist/modules/workflows/lib/outcome-routing.js.map +7 -0
- package/dist/modules/workflows/lib/owned-definition.js +107 -0
- package/dist/modules/workflows/lib/owned-definition.js.map +7 -0
- package/dist/modules/workflows/lib/owned-node-changes.js +10 -0
- package/dist/modules/workflows/lib/owned-node-changes.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drag.js +36 -0
- package/dist/modules/workflows/lib/palette-drag.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drop.js +45 -0
- package/dist/modules/workflows/lib/palette-drop.js.map +7 -0
- package/dist/modules/workflows/lib/parallel-handler.js +57 -2
- package/dist/modules/workflows/lib/parallel-handler.js.map +2 -2
- package/dist/modules/workflows/lib/port-contract.js +54 -0
- package/dist/modules/workflows/lib/port-contract.js.map +7 -0
- package/dist/modules/workflows/lib/portal-task-access.js +89 -0
- package/dist/modules/workflows/lib/portal-task-access.js.map +7 -0
- package/dist/modules/workflows/lib/rerun-from-step.js +65 -0
- package/dist/modules/workflows/lib/rerun-from-step.js.map +7 -0
- package/dist/modules/workflows/lib/route-chip-events.js +23 -0
- package/dist/modules/workflows/lib/route-chip-events.js.map +7 -0
- package/dist/modules/workflows/lib/route-chips.js +91 -0
- package/dist/modules/workflows/lib/route-chips.js.map +7 -0
- package/dist/modules/workflows/lib/route-edge.js +17 -0
- package/dist/modules/workflows/lib/route-edge.js.map +7 -0
- package/dist/modules/workflows/lib/route-kinds.js +67 -0
- package/dist/modules/workflows/lib/route-kinds.js.map +7 -0
- package/dist/modules/workflows/lib/route-priority.js +104 -0
- package/dist/modules/workflows/lib/route-priority.js.map +7 -0
- package/dist/modules/workflows/lib/run-duration.js +44 -0
- package/dist/modules/workflows/lib/run-duration.js.map +7 -0
- package/dist/modules/workflows/lib/run-event-tone.js +25 -0
- package/dist/modules/workflows/lib/run-event-tone.js.map +7 -0
- package/dist/modules/workflows/lib/run-execution.js +305 -0
- package/dist/modules/workflows/lib/run-execution.js.map +7 -0
- package/dist/modules/workflows/lib/run-gantt.js +180 -0
- package/dist/modules/workflows/lib/run-gantt.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js +33 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome.js +48 -0
- package/dist/modules/workflows/lib/run-outcome.js.map +7 -0
- package/dist/modules/workflows/lib/sample-resolver.js +71 -0
- package/dist/modules/workflows/lib/sample-resolver.js.map +7 -0
- package/dist/modules/workflows/lib/seeds.js +1 -1
- package/dist/modules/workflows/lib/seeds.js.map +2 -2
- package/dist/modules/workflows/lib/server-output-contract.js +65 -0
- package/dist/modules/workflows/lib/server-output-contract.js.map +7 -0
- package/dist/modules/workflows/lib/set-variable.js +47 -0
- package/dist/modules/workflows/lib/set-variable.js.map +7 -0
- package/dist/modules/workflows/lib/signal-handler.js +63 -4
- package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
- package/dist/modules/workflows/lib/start-fixtures.js +42 -0
- package/dist/modules/workflows/lib/start-fixtures.js.map +7 -0
- package/dist/modules/workflows/lib/status-colors.js +153 -22
- package/dist/modules/workflows/lib/status-colors.js.map +2 -2
- package/dist/modules/workflows/lib/step-handler.js +529 -53
- package/dist/modules/workflows/lib/step-handler.js.map +3 -3
- package/dist/modules/workflows/lib/step-presentation.js +147 -0
- package/dist/modules/workflows/lib/step-presentation.js.map +7 -0
- package/dist/modules/workflows/lib/step-through.js +26 -0
- package/dist/modules/workflows/lib/step-through.js.map +7 -0
- package/dist/modules/workflows/lib/step-type-conversion.js +167 -0
- package/dist/modules/workflows/lib/step-type-conversion.js.map +7 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js +114 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js.map +7 -0
- package/dist/modules/workflows/lib/task-decision-context.js +38 -0
- package/dist/modules/workflows/lib/task-decision-context.js.map +7 -0
- package/dist/modules/workflows/lib/task-decisions.js +49 -0
- package/dist/modules/workflows/lib/task-decisions.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-access.js +62 -0
- package/dist/modules/workflows/lib/task-entity-access.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js +39 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-types.js +36 -0
- package/dist/modules/workflows/lib/task-entity-types.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-registry.js +33 -0
- package/dist/modules/workflows/lib/task-form-registry.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-schema.js +75 -0
- package/dist/modules/workflows/lib/task-form-schema.js.map +7 -0
- package/dist/modules/workflows/lib/task-handler.js +251 -32
- package/dist/modules/workflows/lib/task-handler.js.map +2 -2
- package/dist/modules/workflows/lib/task-inspector-config.js +182 -0
- package/dist/modules/workflows/lib/task-inspector-config.js.map +7 -0
- package/dist/modules/workflows/lib/task-list-query.js +19 -0
- package/dist/modules/workflows/lib/task-list-query.js.map +7 -0
- package/dist/modules/workflows/lib/task-notifications.js +119 -0
- package/dist/modules/workflows/lib/task-notifications.js.map +7 -0
- package/dist/modules/workflows/lib/task-permission-settings.js +43 -0
- package/dist/modules/workflows/lib/task-permission-settings.js.map +7 -0
- package/dist/modules/workflows/lib/task-presets.js +35 -0
- package/dist/modules/workflows/lib/task-presets.js.map +7 -0
- package/dist/modules/workflows/lib/task-quick-action.js +45 -0
- package/dist/modules/workflows/lib/task-quick-action.js.map +7 -0
- package/dist/modules/workflows/lib/task-resolution.js +120 -0
- package/dist/modules/workflows/lib/task-resolution.js.map +7 -0
- package/dist/modules/workflows/lib/task-sla.js +357 -0
- package/dist/modules/workflows/lib/task-sla.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility-request.js +266 -0
- package/dist/modules/workflows/lib/task-visibility-request.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility.js +194 -0
- package/dist/modules/workflows/lib/task-visibility.js.map +7 -0
- package/dist/modules/workflows/lib/timer-handler.js +3 -1
- package/dist/modules/workflows/lib/timer-handler.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +148 -20
- package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
- package/dist/modules/workflows/lib/trigger-node.js +121 -0
- package/dist/modules/workflows/lib/trigger-node.js.map +7 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js +14 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js +52 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js +63 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js +11 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js +90 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js +118 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/query.js +70 -0
- package/dist/modules/workflows/lib/work-inbox/query.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/service.js +56 -0
- package/dist/modules/workflows/lib/work-inbox/service.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js +149 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js +57 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js +54 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-executor.js +658 -6
- package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-function-registry.js +40 -0
- package/dist/modules/workflows/lib/workflow-function-registry.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-safe-commands.js +11 -1
- package/dist/modules/workflows/lib/workflow-safe-commands.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-templates.js +69 -0
- package/dist/modules/workflows/lib/workflow-templates.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js +17 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js +12 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js.map +7 -0
- package/dist/modules/workflows/notifications.js +38 -10
- package/dist/modules/workflows/notifications.js.map +2 -2
- package/dist/modules/workflows/setup.js +81 -1
- package/dist/modules/workflows/setup.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-assigned-notification.js +19 -27
- package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js.map +7 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js +73 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js +17 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js.map +7 -0
- package/dist/modules/workflows/widgets/injection-table.js +26 -0
- package/dist/modules/workflows/widgets/injection-table.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-activities.worker.js +61 -39
- package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js +40 -0
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js +43 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js +30 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js.map +7 -0
- package/generated/entities/action_log/index.ts +1 -0
- package/generated/entities/user/index.ts +1 -0
- package/generated/entities/user_task/index.ts +7 -0
- package/generated/entities/workflow_definition/index.ts +3 -0
- package/generated/entities/workflow_definition_draft/index.ts +11 -0
- package/generated/entities/workflow_definition_metric_rollup/index.ts +10 -0
- package/generated/entities/workflow_instance/index.ts +2 -0
- package/generated/entities.ids.generated.ts +4 -1
- package/generated/entity-fields-registry.ts +39 -0
- package/jest.setup.ts +13 -0
- package/package.json +8 -7
- package/src/bootstrap.ts +13 -3
- package/src/helpers/integration/workflowsFixtures.ts +765 -5
- package/src/helpers/integration/workflowsUi.ts +318 -0
- package/src/modules/attachments/lib/createFromBuffer.ts +120 -0
- package/src/modules/audit_logs/data/entities.ts +12 -0
- package/src/modules/audit_logs/data/validators.ts +1 -0
- package/src/modules/audit_logs/lib/projections.ts +5 -1
- package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +26 -0
- package/src/modules/audit_logs/migrations/Migration20260625120000.ts +15 -0
- package/src/modules/audit_logs/services/actionLogService.ts +3 -0
- package/src/modules/auth/data/entities.ts +21 -0
- package/src/modules/auth/i18n/de.json +31 -0
- package/src/modules/auth/i18n/en.json +31 -0
- package/src/modules/auth/i18n/es.json +31 -0
- package/src/modules/auth/i18n/ko.json +31 -0
- package/src/modules/auth/i18n/pl.json +31 -0
- package/src/modules/auth/lib/executionPrincipal.ts +235 -0
- package/src/modules/auth/migrations/.snapshot-open-mercato.json +16 -0
- package/src/modules/auth/migrations/Migration20260625050000.ts +21 -0
- package/src/modules/business_rules/components/InlineRuleEditor.tsx +231 -0
- package/src/modules/business_rules/data/validators.ts +6 -0
- package/src/modules/business_rules/i18n/de.json +4 -0
- package/src/modules/business_rules/i18n/en.json +4 -0
- package/src/modules/business_rules/i18n/es.json +4 -0
- package/src/modules/business_rules/i18n/ko.json +4 -0
- package/src/modules/business_rules/i18n/pl.json +4 -0
- package/src/modules/business_rules/lib/rule-engine.ts +15 -1
- package/src/modules/catalog/commands/products.ts +12 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/workflows.ts +35 -0
- package/src/modules/customer_accounts/AGENTS.md +11 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +2 -0
- package/src/modules/customer_accounts/cli.ts +96 -0
- package/src/modules/customer_accounts/i18n/de.json +5 -0
- package/src/modules/customer_accounts/i18n/en.json +5 -0
- package/src/modules/customer_accounts/i18n/es.json +5 -0
- package/src/modules/customer_accounts/i18n/ko.json +5 -0
- package/src/modules/customer_accounts/i18n/pl.json +5 -0
- package/src/modules/customer_accounts/lib/customerRoleAclSync.ts +92 -0
- package/src/modules/customer_accounts/setup.ts +15 -3
- package/src/modules/customers/commands/deals.ts +5 -0
- package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +4 -2
- package/src/modules/customers/components/detail/utils.ts +2 -0
- package/src/modules/customers/events.ts +21 -3
- package/src/modules/customers/i18n/de.json +4 -0
- package/src/modules/customers/i18n/en.json +4 -0
- package/src/modules/customers/i18n/es.json +4 -0
- package/src/modules/customers/i18n/ko.json +4 -0
- package/src/modules/customers/i18n/pl.json +4 -0
- package/src/modules/customers/lib/link-workflow-task-handler.ts +136 -0
- package/src/modules/customers/lib/todoCompatibility.ts +4 -1
- package/src/modules/customers/lib/workflowTaskLink.ts +23 -0
- package/src/modules/customers/subscribers/link-workflow-task.ts +19 -0
- package/src/modules/customers/workflows.ts +57 -0
- package/src/modules/entities/api/records.ts +18 -62
- package/src/modules/entities/lib/entityClassification.ts +102 -0
- package/src/modules/sales/commands/documents.ts +46 -0
- package/src/modules/sales/events.ts +20 -2
- package/src/modules/sales/i18n/de.json +2 -1
- package/src/modules/sales/i18n/en.json +2 -1
- package/src/modules/sales/i18n/es.json +2 -1
- package/src/modules/sales/i18n/ko.json +2 -1
- package/src/modules/sales/i18n/pl.json +2 -1
- package/src/modules/sales/workflows.ts +12 -1
- package/src/modules/seeds/README.md +86 -0
- package/src/modules/seeds/cli.ts +220 -0
- package/src/modules/seeds/examples/sample-seed.json +26 -0
- package/src/modules/seeds/index.ts +11 -0
- package/src/modules/workflows/AGENTS.md +851 -10
- package/src/modules/workflows/acl.ts +96 -0
- package/src/modules/workflows/ai-agents.ts +80 -0
- package/src/modules/workflows/ai-tools/authoring-pack.ts +798 -0
- package/src/modules/workflows/ai-tools/types.ts +117 -0
- package/src/modules/workflows/ai-tools.ts +20 -0
- package/src/modules/workflows/api/command-settings/route.ts +171 -0
- package/src/modules/workflows/api/commands/route.ts +109 -0
- package/src/modules/workflows/api/definitions/[id]/callers/route.ts +95 -0
- package/src/modules/workflows/api/definitions/[id]/context-schema/route.ts +187 -0
- package/src/modules/workflows/api/definitions/[id]/customize/route.ts +6 -1
- package/src/modules/workflows/api/definitions/[id]/draft/route.ts +395 -0
- package/src/modules/workflows/api/definitions/[id]/publish/route.ts +250 -0
- package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +5 -0
- package/src/modules/workflows/api/definitions/[id]/route.ts +107 -7
- package/src/modules/workflows/api/definitions/[id]/test-step/route.ts +288 -0
- package/src/modules/workflows/api/definitions/generate/route.ts +335 -0
- package/src/modules/workflows/api/definitions/route.ts +88 -113
- package/src/modules/workflows/api/definitions/serialize.ts +9 -0
- package/src/modules/workflows/api/endpoints/route.ts +88 -0
- package/src/modules/workflows/api/functions/route.ts +91 -0
- package/src/modules/workflows/api/grantable-features/route.ts +102 -0
- package/src/modules/workflows/api/instances/[id]/context/route.ts +214 -0
- package/src/modules/workflows/api/instances/[id]/rerun-step/route.ts +226 -0
- package/src/modules/workflows/api/instances/[id]/retry/route.ts +18 -2
- package/src/modules/workflows/api/instances/[id]/step-through/route.ts +195 -0
- package/src/modules/workflows/api/instances/[id]/steps/route.ts +160 -0
- package/src/modules/workflows/api/instances/[id]/would-do/route.ts +216 -0
- package/src/modules/workflows/api/instances/bulk-replay/route.ts +141 -0
- package/src/modules/workflows/api/instances/failure-queue/route.ts +197 -0
- package/src/modules/workflows/api/instances/route.ts +135 -3
- package/src/modules/workflows/api/metrics/definitions/route.ts +262 -0
- package/src/modules/workflows/api/openapi.ts +549 -2
- package/src/modules/workflows/api/portal/tasks/[id]/complete/route.ts +160 -0
- package/src/modules/workflows/api/portal/tasks/[id]/route.ts +124 -0
- package/src/modules/workflows/api/portal/tasks/route.ts +157 -0
- package/src/modules/workflows/api/rule-usage/route.ts +94 -0
- package/src/modules/workflows/api/task-settings/route.ts +138 -0
- package/src/modules/workflows/api/tasks/[id]/claim/route.ts +42 -17
- package/src/modules/workflows/api/tasks/[id]/complete/route.ts +47 -15
- package/src/modules/workflows/api/tasks/[id]/reassign/route.ts +197 -0
- package/src/modules/workflows/api/tasks/[id]/route.ts +57 -6
- package/src/modules/workflows/api/tasks/[id]/unclaim/route.ts +132 -0
- package/src/modules/workflows/api/tasks/route.ts +60 -5
- package/src/modules/workflows/api/tasks/serialize.ts +119 -0
- package/src/modules/workflows/api/templates/route.ts +87 -0
- package/src/modules/workflows/api/work-inbox/next/route.ts +170 -0
- package/src/modules/workflows/api/work-inbox/route.ts +153 -0
- package/src/modules/workflows/backend/config/workflows/page.meta.ts +33 -0
- package/src/modules/workflows/backend/config/workflows/page.tsx +12 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +19 -343
- package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/create/page.tsx +19 -59
- package/src/modules/workflows/backend/definitions/page.tsx +156 -76
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +3129 -584
- package/src/modules/workflows/backend/instances/[id]/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/[id]/page.tsx +711 -539
- package/src/modules/workflows/backend/instances/failure-queue/page.meta.ts +16 -0
- package/src/modules/workflows/backend/instances/failure-queue/page.tsx +311 -0
- package/src/modules/workflows/backend/instances/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/page.tsx +218 -38
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +639 -400
- package/src/modules/workflows/backend/tasks/page.meta.ts +7 -0
- package/src/modules/workflows/backend/tasks/page.tsx +20 -333
- package/src/modules/workflows/backend/work-inbox/page.meta.ts +15 -0
- package/src/modules/workflows/backend/work-inbox/page.tsx +506 -0
- package/src/modules/workflows/cli.ts +1 -1
- package/src/modules/workflows/commands/tasks.ts +146 -0
- package/src/modules/workflows/components/ActivitiesEditor.tsx +91 -114
- package/src/modules/workflows/components/ActivityEditDialog.tsx +244 -0
- package/src/modules/workflows/components/AgentSelector.tsx +200 -0
- package/src/modules/workflows/components/AnnotationEditDialog.tsx +157 -0
- package/src/modules/workflows/components/BusinessRuleUsagePanel.tsx +106 -0
- package/src/modules/workflows/components/BusinessRulesSelector.tsx +71 -17
- package/src/modules/workflows/components/ConfigJsonTextarea.tsx +111 -0
- package/src/modules/workflows/components/ContextSchemaEditor.tsx +165 -0
- package/src/modules/workflows/components/DefinitionErrorHandlerField.tsx +133 -0
- package/src/modules/workflows/components/DefinitionMetadataDrawer.tsx +456 -0
- package/src/modules/workflows/components/DefinitionMetricsCells.tsx +212 -0
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +196 -95
- package/src/modules/workflows/components/EdgeEditDialog.tsx +15 -16
- package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +130 -80
- package/src/modules/workflows/components/InputDataPanel.tsx +177 -0
- package/src/modules/workflows/components/InspectorPanel.tsx +250 -0
- package/src/modules/workflows/components/NodeEditDialog.tsx +444 -38
- package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +848 -178
- package/src/modules/workflows/components/StepsEditor.tsx +9 -2
- package/src/modules/workflows/components/TemplateGalleryDialog.tsx +205 -0
- package/src/modules/workflows/components/TransitionsEditor.tsx +98 -89
- package/src/modules/workflows/components/TriggersDialog.tsx +83 -0
- package/src/modules/workflows/components/TriggersEditor.tsx +363 -0
- package/src/modules/workflows/components/WorkflowAiDraftDialog.tsx +383 -0
- package/src/modules/workflows/components/WorkflowCodeView.tsx +257 -0
- package/src/modules/workflows/components/WorkflowCommandPalette.tsx +82 -0
- package/src/modules/workflows/components/WorkflowCompensationGhostEdge.tsx +78 -0
- package/src/modules/workflows/components/WorkflowDataMappingEdge.tsx +46 -0
- package/src/modules/workflows/components/WorkflowGraph.tsx +54 -1
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +463 -37
- package/src/modules/workflows/components/WorkflowIconPicker.tsx +144 -0
- package/src/modules/workflows/components/WorkflowLegend.tsx +59 -33
- package/src/modules/workflows/components/WorkflowNodeCard.tsx +355 -28
- package/src/modules/workflows/components/WorkflowRouteChips.tsx +145 -0
- package/src/modules/workflows/components/WorkflowSelector.tsx +33 -14
- package/src/modules/workflows/components/WorkflowTransitionEdge.tsx +83 -10
- package/src/modules/workflows/components/WorkflowTransitionLabel.tsx +13 -2
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +120 -30
- package/src/modules/workflows/components/fields/ActivityConfigFields.tsx +675 -0
- package/src/modules/workflows/components/fields/ActivityTestPanel.tsx +250 -0
- package/src/modules/workflows/components/fields/AgentInvokeConfigField.tsx +580 -0
- package/src/modules/workflows/components/fields/AgentReviewOnBreachField.tsx +88 -0
- package/src/modules/workflows/components/fields/BranchingRoutesEditor.tsx +323 -0
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +36 -4
- package/src/modules/workflows/components/fields/CommandPicker.tsx +158 -0
- package/src/modules/workflows/components/fields/EndpointPicker.tsx +330 -0
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/FunctionPicker.tsx +68 -0
- package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +46 -12
- package/src/modules/workflows/components/fields/PortFieldArrayEditor.tsx +255 -0
- package/src/modules/workflows/components/fields/RolesMultiSelect.tsx +68 -0
- package/src/modules/workflows/components/fields/RouteOrderEditor.tsx +169 -0
- package/src/modules/workflows/components/fields/SchemaBuilderDialog.tsx +139 -0
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/TaskAssignmentField.tsx +355 -0
- package/src/modules/workflows/components/fields/TaskDeadlineFields.tsx +172 -0
- package/src/modules/workflows/components/fields/TaskDecisionsField.tsx +294 -0
- package/src/modules/workflows/components/fields/TaskEntityBindingsField.tsx +156 -0
- package/src/modules/workflows/components/fields/TemplateTextControl.tsx +85 -0
- package/src/modules/workflows/components/fields/VariablePickerButton.tsx +177 -0
- package/src/modules/workflows/components/fields/ledgerDropTarget.ts +55 -0
- package/src/modules/workflows/components/fields/useActivityTypeOptions.ts +19 -0
- package/src/modules/workflows/components/formConfig.tsx +84 -10
- package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +5 -0
- package/src/modules/workflows/components/mobile/MobileMetadataSheet.tsx +10 -0
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +55 -19
- package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +49 -40
- package/src/modules/workflows/components/nodes/AnnotationGroupNode.tsx +81 -0
- package/src/modules/workflows/components/nodes/AutomatedNode.tsx +34 -17
- package/src/modules/workflows/components/nodes/EndNode.tsx +15 -14
- package/src/modules/workflows/components/nodes/ErrorOutputHandle.tsx +32 -0
- package/src/modules/workflows/components/nodes/IfElseNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/InvokeAgentNode.tsx +180 -0
- package/src/modules/workflows/components/nodes/NodeOutcomeRows.tsx +143 -0
- package/src/modules/workflows/components/nodes/ParallelForkNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/ParallelJoinNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/StartNode.tsx +78 -18
- package/src/modules/workflows/components/nodes/StickyNoteNode.tsx +65 -0
- package/src/modules/workflows/components/nodes/SubWorkflowNode.tsx +124 -23
- package/src/modules/workflows/components/nodes/SwitchNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/TriggerCap.tsx +103 -0
- package/src/modules/workflows/components/nodes/TriggerNode.tsx +151 -0
- package/src/modules/workflows/components/nodes/UserTaskNode.tsx +67 -22
- package/src/modules/workflows/components/nodes/WaitForConditionNode.tsx +74 -0
- package/src/modules/workflows/components/nodes/WaitForSignalNode.tsx +31 -17
- package/src/modules/workflows/components/nodes/WaitForTimerNode.tsx +31 -16
- package/src/modules/workflows/components/nodes/index.ts +17 -0
- package/src/modules/workflows/components/portal/PortalTaskForm.tsx +280 -0
- package/src/modules/workflows/components/run/AgentActivityPanel.tsx +48 -0
- package/src/modules/workflows/components/run/RerunStepDialog.tsx +133 -0
- package/src/modules/workflows/components/run/RunEventBadge.tsx +37 -0
- package/src/modules/workflows/components/run/RunGantt.tsx +180 -0
- package/src/modules/workflows/components/run/RunStatusBadge.tsx +112 -0
- package/src/modules/workflows/components/run/RunStepInspector.tsx +176 -0
- package/src/modules/workflows/components/run/WouldDoReport.tsx +93 -0
- package/src/modules/workflows/components/run/useAgentLabels.ts +42 -0
- package/src/modules/workflows/components/run/useLastRunOverlay.ts +150 -0
- package/src/modules/workflows/components/run/useLiveAgentActions.ts +70 -0
- package/src/modules/workflows/components/run/useLiveRunUpdates.ts +89 -0
- package/src/modules/workflows/components/settings/CommandSettingsPageClient.tsx +228 -0
- package/src/modules/workflows/components/work-inbox/EntityContextPanel.tsx +179 -0
- package/src/modules/workflows/components/work-inbox/ReassignTaskDialog.tsx +203 -0
- package/src/modules/workflows/components/work-inbox/StatusChip.tsx +61 -0
- package/src/modules/workflows/components/work-inbox/TaskActionNotice.tsx +77 -0
- package/src/modules/workflows/components/work-inbox/TaskFormFields.tsx +322 -0
- package/src/modules/workflows/components/work-inbox/WorkInboxEmptyState.tsx +43 -0
- package/src/modules/workflows/data/activity-config-schemas.ts +249 -0
- package/src/modules/workflows/data/activity-config-warnings.ts +71 -0
- package/src/modules/workflows/data/branching-route-warnings.ts +129 -0
- package/src/modules/workflows/data/entities.ts +397 -4
- package/src/modules/workflows/data/metrics-validators.ts +51 -0
- package/src/modules/workflows/data/task-primitives.ts +36 -0
- package/src/modules/workflows/data/types.ts +81 -2
- package/src/modules/workflows/data/validators.ts +729 -60
- package/src/modules/workflows/di.ts +22 -0
- package/src/modules/workflows/events.ts +68 -8
- package/src/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/src/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/src/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/src/modules/workflows/examples/templates/order-approval.json +230 -0
- package/src/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/src/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/src/modules/workflows/extension-points.ts +1 -1
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.ts +21 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.tsx +212 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.ts +25 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.tsx +185 -0
- package/src/modules/workflows/i18n/de.json +1083 -24
- package/src/modules/workflows/i18n/en.json +1081 -22
- package/src/modules/workflows/i18n/es.json +1083 -24
- package/src/modules/workflows/i18n/ko.json +1072 -13
- package/src/modules/workflows/i18n/pl.json +1082 -23
- package/src/modules/workflows/lib/activity-executor.ts +855 -186
- package/src/modules/workflows/lib/activity-queue-types.ts +120 -1
- package/src/modules/workflows/lib/activity-registry-bootstrap.ts +7 -0
- package/src/modules/workflows/lib/activity-registry.ts +89 -0
- package/src/modules/workflows/lib/activity-types.ts +415 -0
- package/src/modules/workflows/lib/activity-worker-handler.ts +744 -35
- package/src/modules/workflows/lib/advanced-config.ts +41 -0
- package/src/modules/workflows/lib/agent-disposition-task.ts +343 -0
- package/src/modules/workflows/lib/agent-outcome-paths.ts +153 -0
- package/src/modules/workflows/lib/agent-result-mapping.ts +88 -0
- package/src/modules/workflows/lib/agent-review-inspector.ts +125 -0
- package/src/modules/workflows/lib/agent-review.ts +171 -0
- package/src/modules/workflows/lib/ai-authoring.ts +402 -0
- package/src/modules/workflows/lib/ai-draft-runner.ts +105 -0
- package/src/modules/workflows/lib/annotation-events.ts +15 -0
- package/src/modules/workflows/lib/branching-routes.ts +280 -0
- package/src/modules/workflows/lib/breach-routing.ts +142 -0
- package/src/modules/workflows/lib/bulk-replay.ts +185 -0
- package/src/modules/workflows/lib/business-rule-usage.ts +154 -0
- package/src/modules/workflows/lib/caller-graph.ts +104 -0
- package/src/modules/workflows/lib/code-view-apply.ts +178 -0
- package/src/modules/workflows/lib/collect-validation-issues.ts +239 -0
- package/src/modules/workflows/lib/compensation-ghosts.ts +134 -0
- package/src/modules/workflows/lib/component-guard.ts +13 -0
- package/src/modules/workflows/lib/condition-handler.ts +658 -0
- package/src/modules/workflows/lib/context-ledger.ts +814 -0
- package/src/modules/workflows/lib/crud-form-dialogs-flag.ts +5 -0
- package/src/modules/workflows/lib/data-edge-mapping.ts +112 -0
- package/src/modules/workflows/lib/definition-context-schema.ts +103 -0
- package/src/modules/workflows/lib/definition-edit-safety.ts +228 -0
- package/src/modules/workflows/lib/definition-error-body.ts +43 -0
- package/src/modules/workflows/lib/definition-evaluation.ts +156 -0
- package/src/modules/workflows/lib/definition-grant.ts +211 -0
- package/src/modules/workflows/lib/definition-json-locations.ts +226 -0
- package/src/modules/workflows/lib/definition-payload.ts +81 -0
- package/src/modules/workflows/lib/draft-restore.ts +72 -0
- package/src/modules/workflows/lib/dry-run.ts +203 -0
- package/src/modules/workflows/lib/duration.ts +138 -24
- package/src/modules/workflows/lib/edge-reattachment.ts +186 -0
- package/src/modules/workflows/lib/edgeFormTransforms.ts +15 -14
- package/src/modules/workflows/lib/editor-annotations.ts +301 -0
- package/src/modules/workflows/lib/editor-commands.ts +205 -0
- package/src/modules/workflows/lib/editor-history.ts +151 -0
- package/src/modules/workflows/lib/endpoint-catalog.ts +283 -0
- package/src/modules/workflows/lib/endpoint-path.ts +134 -0
- package/src/modules/workflows/lib/engine-version.ts +67 -0
- package/src/modules/workflows/lib/error-handler.ts +192 -0
- package/src/modules/workflows/lib/error-routing.ts +236 -0
- package/src/modules/workflows/lib/event-logger.ts +27 -0
- package/src/modules/workflows/lib/expression-refs.ts +291 -0
- package/src/modules/workflows/lib/failure-grouping.ts +134 -0
- package/src/modules/workflows/lib/find-definition.ts +4 -0
- package/src/modules/workflows/lib/flow-logic-warnings.ts +591 -0
- package/src/modules/workflows/lib/graph-utils.ts +620 -110
- package/src/modules/workflows/lib/icon-search.ts +65 -0
- package/src/modules/workflows/lib/insert-at-cursor.ts +53 -0
- package/src/modules/workflows/lib/instance-date-filter.ts +56 -0
- package/src/modules/workflows/lib/interpolation-pipeline.ts +351 -0
- package/src/modules/workflows/lib/ledger-drag.ts +61 -0
- package/src/modules/workflows/lib/ledger-entry-display.ts +89 -0
- package/src/modules/workflows/lib/ledger-schema-flatten.ts +137 -0
- package/src/modules/workflows/lib/metrics/definition-metrics.ts +268 -0
- package/src/modules/workflows/lib/metrics/metrics-display.ts +57 -0
- package/src/modules/workflows/lib/metrics/rollup-schedule.ts +26 -0
- package/src/modules/workflows/lib/metrics/rollup-service.ts +292 -0
- package/src/modules/workflows/lib/node-config-summary.ts +235 -0
- package/src/modules/workflows/lib/node-geometry.ts +168 -0
- package/src/modules/workflows/lib/node-nudge.ts +63 -0
- package/src/modules/workflows/lib/node-outcome-rows.ts +195 -0
- package/src/modules/workflows/lib/node-placement.ts +104 -0
- package/src/modules/workflows/lib/node-type-icons.ts +71 -10
- package/src/modules/workflows/lib/nodeFormTransforms.ts +519 -28
- package/src/modules/workflows/lib/outcome-routing.ts +346 -0
- package/src/modules/workflows/lib/owned-definition.ts +188 -0
- package/src/modules/workflows/lib/owned-node-changes.ts +29 -0
- package/src/modules/workflows/lib/palette-drag.ts +68 -0
- package/src/modules/workflows/lib/palette-drop.ts +114 -0
- package/src/modules/workflows/lib/parallel-handler.ts +79 -2
- package/src/modules/workflows/lib/port-contract.ts +107 -0
- package/src/modules/workflows/lib/portal-task-access.ts +220 -0
- package/src/modules/workflows/lib/rerun-from-step.ts +140 -0
- package/src/modules/workflows/lib/route-chip-events.ts +45 -0
- package/src/modules/workflows/lib/route-chips.ts +177 -0
- package/src/modules/workflows/lib/route-edge.ts +57 -0
- package/src/modules/workflows/lib/route-kinds.ts +166 -0
- package/src/modules/workflows/lib/route-priority.ts +197 -0
- package/src/modules/workflows/lib/run-duration.ts +70 -0
- package/src/modules/workflows/lib/run-event-tone.ts +46 -0
- package/src/modules/workflows/lib/run-execution.ts +598 -0
- package/src/modules/workflows/lib/run-gantt.ts +311 -0
- package/src/modules/workflows/lib/run-outcome-evidence.ts +60 -0
- package/src/modules/workflows/lib/run-outcome.ts +142 -0
- package/src/modules/workflows/lib/sample-resolver.ts +113 -0
- package/src/modules/workflows/lib/seeds.ts +3 -1
- package/src/modules/workflows/lib/server-output-contract.ts +120 -0
- package/src/modules/workflows/lib/set-variable.ts +94 -0
- package/src/modules/workflows/lib/signal-handler.ts +134 -4
- package/src/modules/workflows/lib/start-fixtures.ts +93 -0
- package/src/modules/workflows/lib/status-colors.ts +220 -21
- package/src/modules/workflows/lib/step-handler.ts +744 -68
- package/src/modules/workflows/lib/step-presentation.ts +295 -0
- package/src/modules/workflows/lib/step-through.ts +71 -0
- package/src/modules/workflows/lib/step-type-conversion.ts +263 -0
- package/src/modules/workflows/lib/subgraph-clipboard.ts +214 -0
- package/src/modules/workflows/lib/task-decision-context.ts +76 -0
- package/src/modules/workflows/lib/task-decisions.ts +117 -0
- package/src/modules/workflows/lib/task-entity-access.ts +181 -0
- package/src/modules/workflows/lib/task-entity-aliases.ts +77 -0
- package/src/modules/workflows/lib/task-entity-types.ts +66 -0
- package/src/modules/workflows/lib/task-form-registry.ts +123 -0
- package/src/modules/workflows/lib/task-form-schema.ts +129 -0
- package/src/modules/workflows/lib/task-handler.ts +492 -51
- package/src/modules/workflows/lib/task-inspector-config.ts +348 -0
- package/src/modules/workflows/lib/task-list-query.ts +46 -0
- package/src/modules/workflows/lib/task-notifications.ts +218 -0
- package/src/modules/workflows/lib/task-permission-settings.ts +117 -0
- package/src/modules/workflows/lib/task-presets.ts +95 -0
- package/src/modules/workflows/lib/task-quick-action.ts +111 -0
- package/src/modules/workflows/lib/task-resolution.ts +270 -0
- package/src/modules/workflows/lib/task-sla.ts +628 -0
- package/src/modules/workflows/lib/task-visibility-request.ts +668 -0
- package/src/modules/workflows/lib/task-visibility.ts +627 -0
- package/src/modules/workflows/lib/timer-handler.ts +8 -1
- package/src/modules/workflows/lib/transition-handler.ts +228 -20
- package/src/modules/workflows/lib/trigger-node.ts +272 -0
- package/src/modules/workflows/lib/visual-editor-navigation.ts +29 -0
- package/src/modules/workflows/lib/work-inbox/empty-state.ts +150 -0
- package/src/modules/workflows/lib/work-inbox/entity-links.ts +99 -0
- package/src/modules/workflows/lib/work-inbox/navigation.ts +28 -0
- package/src/modules/workflows/lib/work-inbox/presentation.ts +163 -0
- package/src/modules/workflows/lib/work-inbox/provider.ts +390 -0
- package/src/modules/workflows/lib/work-inbox/query.ts +103 -0
- package/src/modules/workflows/lib/work-inbox/service.ts +122 -0
- package/src/modules/workflows/lib/work-inbox/user-task-source.ts +240 -0
- package/src/modules/workflows/lib/workflow-command-enablement.ts +188 -0
- package/src/modules/workflows/lib/workflow-command-settings.ts +124 -0
- package/src/modules/workflows/lib/workflow-executor.ts +1036 -10
- package/src/modules/workflows/lib/workflow-function-registry.ts +44 -0
- package/src/modules/workflows/lib/workflow-safe-commands.ts +42 -1
- package/src/modules/workflows/lib/workflow-templates.ts +91 -0
- package/src/modules/workflows/migrations/.snapshot-open-mercato.json +2321 -698
- package/src/modules/workflows/migrations/Migration20260626214855_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260626222424_workflows.ts +17 -0
- package/src/modules/workflows/migrations/Migration20260727074335_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260728104038_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260728163001_workflows.ts +36 -0
- package/src/modules/workflows/migrations/Migration20260729061736_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260729192652_workflows.ts +11 -0
- package/src/modules/workflows/migrations/Migration20260730085000_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260730092706_workflows.ts +13 -0
- package/src/modules/workflows/notifications.ts +40 -10
- package/src/modules/workflows/setup.ts +128 -0
- package/src/modules/workflows/subscribers/task-assigned-notification.ts +36 -45
- package/src/modules/workflows/subscribers/task-deadline-breached-notification.ts +31 -0
- package/src/modules/workflows/subscribers/task-reminder-notification.ts +31 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.client.tsx +119 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.ts +27 -0
- package/src/modules/workflows/widgets/injection-table.ts +52 -2
- package/src/modules/workflows/workers/workflow-activities.worker.ts +95 -42
- package/src/modules/workflows/workers/workflow-definition-metric-rollup.worker.ts +71 -0
- package/src/modules/workflows/workers/workflow-instance-bulk-replay.ts +51 -0
- package/src/modules/workflows/workers/workflow-invoke-agent.worker.ts +72 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createModuleQueue } from "@open-mercato/queue";
|
|
2
|
+
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
3
|
+
import { WorkflowInstance } from "../data/entities.js";
|
|
4
|
+
import * as workflowExecutor from "./workflow-executor.js";
|
|
5
|
+
import { isRetryableRunOutcome } from "./run-outcome.js";
|
|
6
|
+
const logger = createLogger("workflows");
|
|
7
|
+
const WORKFLOW_INSTANCE_BULK_REPLAY_QUEUE = "workflow-instance-bulk-replay";
|
|
8
|
+
const BULK_REPLAY_MAX_IDS = 1e3;
|
|
9
|
+
let queueInstance = null;
|
|
10
|
+
function getBulkReplayQueue() {
|
|
11
|
+
if (!queueInstance) {
|
|
12
|
+
queueInstance = createModuleQueue(WORKFLOW_INSTANCE_BULK_REPLAY_QUEUE, {
|
|
13
|
+
// Replay re-executes real workflows; one at a time keeps a bulk retry
|
|
14
|
+
// from becoming its own load spike.
|
|
15
|
+
concurrency: 1
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return queueInstance;
|
|
19
|
+
}
|
|
20
|
+
const RETRYABLE_STATUSES = /* @__PURE__ */ new Set(["FAILED", "PAUSED"]);
|
|
21
|
+
const CANCELLABLE_STATUSES = /* @__PURE__ */ new Set(["RUNNING", "PAUSED", "WAITING_FOR_ACTIVITIES", "FORKED"]);
|
|
22
|
+
function canApplyBulkReplay(action, status, outcome) {
|
|
23
|
+
if (action === "cancel") return CANCELLABLE_STATUSES.has(status);
|
|
24
|
+
if (!RETRYABLE_STATUSES.has(status)) return false;
|
|
25
|
+
if (outcome != null && !isRetryableRunOutcome(outcome)) return false;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
async function retryInstance(em, container, instance) {
|
|
29
|
+
if (instance.metadata?.attention) {
|
|
30
|
+
instance.metadata = { ...instance.metadata, attention: null };
|
|
31
|
+
}
|
|
32
|
+
instance.status = "RUNNING";
|
|
33
|
+
instance.retryCount = (instance.retryCount || 0) + 1;
|
|
34
|
+
instance.errorMessage = null;
|
|
35
|
+
instance.errorDetails = null;
|
|
36
|
+
instance.updatedAt = /* @__PURE__ */ new Date();
|
|
37
|
+
await em.flush();
|
|
38
|
+
await workflowExecutor.executeWorkflow(em, container, instance.id);
|
|
39
|
+
}
|
|
40
|
+
async function runBulkReplay(params) {
|
|
41
|
+
const { container, progressJobId, action, ids, scope } = params;
|
|
42
|
+
const em = container.resolve("em");
|
|
43
|
+
const progressService = container.resolve("progressService");
|
|
44
|
+
const progressContext = {
|
|
45
|
+
tenantId: scope.tenantId,
|
|
46
|
+
organizationId: scope.organizationId,
|
|
47
|
+
userId: scope.userId ?? null
|
|
48
|
+
};
|
|
49
|
+
await progressService.startJob(progressJobId, progressContext);
|
|
50
|
+
await progressService.updateProgress(
|
|
51
|
+
progressJobId,
|
|
52
|
+
{ totalCount: ids.length, processedCount: 0 },
|
|
53
|
+
progressContext
|
|
54
|
+
);
|
|
55
|
+
let affectedCount = 0;
|
|
56
|
+
let skippedCount = 0;
|
|
57
|
+
let failedCount = 0;
|
|
58
|
+
for (const [index, instanceId] of ids.entries()) {
|
|
59
|
+
try {
|
|
60
|
+
const instance = await em.findOne(WorkflowInstance, {
|
|
61
|
+
id: instanceId,
|
|
62
|
+
tenantId: scope.tenantId,
|
|
63
|
+
organizationId: scope.organizationId
|
|
64
|
+
});
|
|
65
|
+
if (!instance || !canApplyBulkReplay(action, instance.status, instance.outcome ?? null)) {
|
|
66
|
+
skippedCount += 1;
|
|
67
|
+
} else if (action === "retry") {
|
|
68
|
+
await retryInstance(em, container, instance);
|
|
69
|
+
affectedCount += 1;
|
|
70
|
+
} else {
|
|
71
|
+
await workflowExecutor.completeWorkflow(em, container, instance.id, "CANCELLED");
|
|
72
|
+
affectedCount += 1;
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
failedCount += 1;
|
|
76
|
+
logger.error("Bulk replay failed for instance", { instanceId, action, err: error });
|
|
77
|
+
}
|
|
78
|
+
await progressService.updateProgress(
|
|
79
|
+
progressJobId,
|
|
80
|
+
{ totalCount: ids.length, processedCount: index + 1 },
|
|
81
|
+
progressContext
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
const summary = {
|
|
85
|
+
action,
|
|
86
|
+
requestedCount: ids.length,
|
|
87
|
+
affectedCount,
|
|
88
|
+
skippedCount,
|
|
89
|
+
failedCount
|
|
90
|
+
};
|
|
91
|
+
await progressService.completeJob(progressJobId, { resultSummary: summary }, progressContext);
|
|
92
|
+
return summary;
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
BULK_REPLAY_MAX_IDS,
|
|
96
|
+
WORKFLOW_INSTANCE_BULK_REPLAY_QUEUE,
|
|
97
|
+
canApplyBulkReplay,
|
|
98
|
+
getBulkReplayQueue,
|
|
99
|
+
runBulkReplay
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=bulk-replay.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/bulk-replay.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Failure-queue bulk replay (spec \u00A78.4) \u2014 \"bulk retry/cancel runs through the\n * progress module\".\n *\n * The work runs in a queue worker rather than in the request, per\n * `progress/AGENTS.md` MUST rules: replaying 500 parked instances re-executes\n * 500 workflows, which cannot happen inside an HTTP handler and must survive\n * the operator navigating away.\n *\n * One instance failing must NEVER abort the batch \u2014 that is the whole point of\n * a triage surface. Every outcome is counted and the summary reports how many\n * were replayed, skipped and errored.\n */\n\nimport type { AwilixContainer } from 'awilix'\nimport type { EntityManager } from '@mikro-orm/core'\nimport { createModuleQueue, type Queue } from '@open-mercato/queue'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { WorkflowInstance } from '../data/entities'\nimport * as workflowExecutor from './workflow-executor'\nimport { isRetryableRunOutcome, type WorkflowRunOutcome } from './run-outcome'\nimport type { ProgressService, ProgressServiceContext } from '../../progress/lib/progressService'\n\nconst logger = createLogger('workflows')\n\nexport const WORKFLOW_INSTANCE_BULK_REPLAY_QUEUE = 'workflow-instance-bulk-replay'\n\n/** Bound on one batch. Larger sets are triaged by narrowing the error group. */\nexport const BULK_REPLAY_MAX_IDS = 1000\n\nexport type BulkReplayAction = 'retry' | 'cancel'\n\nexport type BulkReplayScope = {\n tenantId: string\n organizationId: string\n userId?: string | null\n}\n\nexport type BulkReplayJobPayload = {\n progressJobId: string\n action: BulkReplayAction\n ids: string[]\n scope: BulkReplayScope\n}\n\nexport type BulkReplaySummary = {\n action: BulkReplayAction\n requestedCount: number\n affectedCount: number\n skippedCount: number\n failedCount: number\n}\n\nlet queueInstance: Queue<Record<string, unknown>> | null = null\n\nexport function getBulkReplayQueue(): Queue<Record<string, unknown>> {\n if (!queueInstance) {\n queueInstance = createModuleQueue<Record<string, unknown>>(WORKFLOW_INSTANCE_BULK_REPLAY_QUEUE, {\n // Replay re-executes real workflows; one at a time keeps a bulk retry\n // from becoming its own load spike.\n concurrency: 1,\n })\n }\n return queueInstance\n}\n\n/** Statuses each action is allowed to act on, mirroring the single-instance routes. */\nconst RETRYABLE_STATUSES = new Set(['FAILED', 'PAUSED'])\nconst CANCELLABLE_STATUSES = new Set(['RUNNING', 'PAUSED', 'WAITING_FOR_ACTIVITIES', 'FORKED'])\n\n/**\n * `outcome` is optional so every existing caller keeps compiling; passing it is\n * what makes the \"a `partial_failure` is not retryable as a whole run\" decision\n * (maintainer, 2026-07-30) EXPLICIT here rather than incidental. A\n * `partial_failure` is COMPLETED, so the status gate already refuses it \u2014 but a\n * later widening of `RETRYABLE_STATUSES` must not silently start replaying a\n * run whose successful half the replay would duplicate. Recovery is\n * rerun-from-step on the specific failed step.\n *\n * A null outcome (still running, or a row written before outcomes existed) is\n * never read as a refusal \u2014 only the status decides for those.\n */\nexport function canApplyBulkReplay(\n action: BulkReplayAction,\n status: string,\n outcome?: WorkflowRunOutcome | null\n): boolean {\n if (action === 'cancel') return CANCELLABLE_STATUSES.has(status)\n if (!RETRYABLE_STATUSES.has(status)) return false\n if (outcome != null && !isRetryableRunOutcome(outcome)) return false\n return true\n}\n\nasync function retryInstance(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance\n): Promise<void> {\n // A parked instance carries an engine-owned attention marker; clearing it is\n // what takes it out of the failure queue. It is deliberately cleared BEFORE\n // execution so a replay that parks again re-marks it honestly.\n if (instance.metadata?.attention) {\n instance.metadata = { ...instance.metadata, attention: null }\n }\n instance.status = 'RUNNING'\n instance.retryCount = (instance.retryCount || 0) + 1\n instance.errorMessage = null\n instance.errorDetails = null\n instance.updatedAt = new Date()\n await em.flush()\n\n await workflowExecutor.executeWorkflow(em, container, instance.id)\n}\n\nexport async function runBulkReplay(params: {\n container: AwilixContainer\n progressJobId: string\n action: BulkReplayAction\n ids: readonly string[]\n scope: BulkReplayScope\n}): Promise<BulkReplaySummary> {\n const { container, progressJobId, action, ids, scope } = params\n const em = container.resolve('em') as EntityManager\n const progressService = container.resolve('progressService') as ProgressService\n const progressContext: ProgressServiceContext = {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n userId: scope.userId ?? null,\n }\n\n await progressService.startJob(progressJobId, progressContext)\n await progressService.updateProgress(\n progressJobId,\n { totalCount: ids.length, processedCount: 0 },\n progressContext\n )\n\n let affectedCount = 0\n let skippedCount = 0\n let failedCount = 0\n\n for (const [index, instanceId] of ids.entries()) {\n try {\n // Re-read under the caller's tenant + organization on every iteration:\n // an id that belongs to another tenant resolves to nothing and is\n // skipped, never acted on.\n const instance = await em.findOne(WorkflowInstance, {\n id: instanceId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n\n if (!instance || !canApplyBulkReplay(action, instance.status, instance.outcome ?? null)) {\n skippedCount += 1\n } else if (action === 'retry') {\n await retryInstance(em, container, instance)\n affectedCount += 1\n } else {\n await workflowExecutor.completeWorkflow(em, container, instance.id, 'CANCELLED')\n affectedCount += 1\n }\n } catch (error) {\n // One bad instance must not abort a triage batch.\n failedCount += 1\n logger.error('Bulk replay failed for instance', { instanceId, action, err: error })\n }\n\n await progressService.updateProgress(\n progressJobId,\n { totalCount: ids.length, processedCount: index + 1 },\n progressContext\n )\n }\n\n const summary: BulkReplaySummary = {\n action,\n requestedCount: ids.length,\n affectedCount,\n skippedCount,\n failedCount,\n }\n\n await progressService.completeJob(progressJobId, { resultSummary: summary }, progressContext)\n return summary\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
function readConditionRuleIds(raw) {
|
|
2
|
+
if (!Array.isArray(raw)) return [];
|
|
3
|
+
const ids = [];
|
|
4
|
+
for (const entry of raw) {
|
|
5
|
+
if (typeof entry === "string") {
|
|
6
|
+
ids.push(entry);
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
if (entry && typeof entry === "object") {
|
|
10
|
+
const ruleId = entry.ruleId;
|
|
11
|
+
if (typeof ruleId === "string" && ruleId.length > 0) ids.push(ruleId);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return ids;
|
|
15
|
+
}
|
|
16
|
+
function collectBusinessRuleUsage(definitions, ruleId) {
|
|
17
|
+
if (!ruleId) return [];
|
|
18
|
+
const references = [];
|
|
19
|
+
for (const candidate of definitions) {
|
|
20
|
+
const data = candidate.definition ?? {};
|
|
21
|
+
const steps = Array.isArray(data.steps) ? data.steps : [];
|
|
22
|
+
const transitions = Array.isArray(data.transitions) ? data.transitions : [];
|
|
23
|
+
for (const step of steps) {
|
|
24
|
+
const stepId = step?.stepId;
|
|
25
|
+
if (typeof stepId !== "string") continue;
|
|
26
|
+
if (readConditionRuleIds(step.preConditions).includes(ruleId)) {
|
|
27
|
+
references.push({
|
|
28
|
+
workflowId: candidate.workflowId,
|
|
29
|
+
version: candidate.version,
|
|
30
|
+
...candidate.name ? { workflowName: candidate.name } : {},
|
|
31
|
+
kind: "startPreCondition",
|
|
32
|
+
locationId: stepId
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const transition of transitions) {
|
|
37
|
+
const transitionId = transition?.transitionId;
|
|
38
|
+
if (typeof transitionId !== "string") continue;
|
|
39
|
+
if (readConditionRuleIds(transition.preConditions).includes(ruleId)) {
|
|
40
|
+
references.push({
|
|
41
|
+
workflowId: candidate.workflowId,
|
|
42
|
+
version: candidate.version,
|
|
43
|
+
...candidate.name ? { workflowName: candidate.name } : {},
|
|
44
|
+
kind: "transitionPreCondition",
|
|
45
|
+
locationId: transitionId
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (readConditionRuleIds(transition.postConditions).includes(ruleId)) {
|
|
49
|
+
references.push({
|
|
50
|
+
workflowId: candidate.workflowId,
|
|
51
|
+
version: candidate.version,
|
|
52
|
+
...candidate.name ? { workflowName: candidate.name } : {},
|
|
53
|
+
kind: "transitionPostCondition",
|
|
54
|
+
locationId: transitionId
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return references;
|
|
60
|
+
}
|
|
61
|
+
function countReferencingWorkflows(references) {
|
|
62
|
+
return new Set(references.map((reference) => reference.workflowId)).size;
|
|
63
|
+
}
|
|
64
|
+
async function findBusinessRuleUsage(em, options) {
|
|
65
|
+
const { ruleId, tenantId, organizationId } = options;
|
|
66
|
+
if (!ruleId) return [];
|
|
67
|
+
const containments = [
|
|
68
|
+
JSON.stringify({ steps: [{ preConditions: [{ ruleId }] }] }),
|
|
69
|
+
JSON.stringify({ transitions: [{ preConditions: [{ ruleId }] }] }),
|
|
70
|
+
JSON.stringify({ transitions: [{ postConditions: [{ ruleId }] }] })
|
|
71
|
+
];
|
|
72
|
+
const rows = await em.getConnection().execute(
|
|
73
|
+
`select workflow_id, version, workflow_name, definition from workflow_definitions
|
|
74
|
+
where tenant_id = ? and organization_id = ? and deleted_at is null
|
|
75
|
+
and (definition @> ?::jsonb or definition @> ?::jsonb or definition @> ?::jsonb)`,
|
|
76
|
+
[tenantId, organizationId, ...containments]
|
|
77
|
+
);
|
|
78
|
+
const definitions = rows.map((row) => ({
|
|
79
|
+
workflowId: row.workflow_id,
|
|
80
|
+
version: row.version,
|
|
81
|
+
...row.workflow_name ? { name: row.workflow_name } : {},
|
|
82
|
+
definition: typeof row.definition === "string" ? JSON.parse(row.definition) : row.definition
|
|
83
|
+
}));
|
|
84
|
+
return collectBusinessRuleUsage(definitions, ruleId);
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
collectBusinessRuleUsage,
|
|
88
|
+
countReferencingWorkflows,
|
|
89
|
+
findBusinessRuleUsage
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=business-rule-usage.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/business-rule-usage.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Workflows Module - Business Rule Usage Lookup\n *\n * Answers \"which workflows reference this business rule?\" for the dependency\n * visibility panel that ships with the inline BR editor (spec\n * 2026-07-26-workflows-ux-redesign.md team decision #5, issue #4236).\n *\n * The direction matters: `business_rules` owns the editor and exposes a slot,\n * and every consuming module resolves its OWN usage. So this lookup lives here,\n * scans workflow definitions, and never asks business_rules for anything \u2014\n * business_rules stays free of a workflows import (core AGENTS.md \u00A7\n * Cross-Module Coupling).\n *\n * `collectBusinessRuleUsage` is PURE (plain definition JSON in, references out)\n * so it is unit-testable without a database; `findBusinessRuleUsage` is the\n * tenant-scoped query wrapper, modelled on `caller-graph.ts`.\n */\n\nimport type { EntityManager } from '@mikro-orm/core'\n\nexport type BusinessRuleUsageKind = 'startPreCondition' | 'transitionPreCondition' | 'transitionPostCondition'\n\nexport interface BusinessRuleUsageReference {\n workflowId: string\n version: number\n workflowName?: string\n kind: BusinessRuleUsageKind\n /** Step id for START pre-conditions, transition id for transition conditions. */\n locationId: string\n}\n\nexport interface BusinessRuleUsageDefinition {\n workflowId: string\n version: number\n name?: string\n definition: unknown\n}\n\nfunction readConditionRuleIds(raw: unknown): string[] {\n if (!Array.isArray(raw)) return []\n const ids: string[] = []\n for (const entry of raw) {\n if (typeof entry === 'string') {\n ids.push(entry)\n continue\n }\n if (entry && typeof entry === 'object') {\n const ruleId = (entry as { ruleId?: unknown }).ruleId\n if (typeof ruleId === 'string' && ruleId.length > 0) ids.push(ruleId)\n }\n }\n return ids\n}\n\n/**\n * Every place a definition can name a business rule: START step pre-conditions\n * and transition pre/post-conditions (`data/validators.ts`\n * `startPreConditionSchema` / `transitionConditionSchema`). Inline\n * `transition.condition` expressions are NOT rule references \u2014 they are\n * embedded expressions with no rule identity \u2014 so they are deliberately absent.\n */\nexport function collectBusinessRuleUsage(\n definitions: BusinessRuleUsageDefinition[],\n ruleId: string,\n): BusinessRuleUsageReference[] {\n if (!ruleId) return []\n const references: BusinessRuleUsageReference[] = []\n\n for (const candidate of definitions) {\n const data = (candidate.definition ?? {}) as { steps?: unknown; transitions?: unknown }\n const steps = Array.isArray(data.steps) ? data.steps : []\n const transitions = Array.isArray(data.transitions) ? data.transitions : []\n\n for (const step of steps) {\n const stepId = (step as { stepId?: unknown })?.stepId\n if (typeof stepId !== 'string') continue\n if (readConditionRuleIds((step as { preConditions?: unknown }).preConditions).includes(ruleId)) {\n references.push({\n workflowId: candidate.workflowId,\n version: candidate.version,\n ...(candidate.name ? { workflowName: candidate.name } : {}),\n kind: 'startPreCondition',\n locationId: stepId,\n })\n }\n }\n\n for (const transition of transitions) {\n const transitionId = (transition as { transitionId?: unknown })?.transitionId\n if (typeof transitionId !== 'string') continue\n if (readConditionRuleIds((transition as { preConditions?: unknown }).preConditions).includes(ruleId)) {\n references.push({\n workflowId: candidate.workflowId,\n version: candidate.version,\n ...(candidate.name ? { workflowName: candidate.name } : {}),\n kind: 'transitionPreCondition',\n locationId: transitionId,\n })\n }\n if (readConditionRuleIds((transition as { postConditions?: unknown }).postConditions).includes(ruleId)) {\n references.push({\n workflowId: candidate.workflowId,\n version: candidate.version,\n ...(candidate.name ? { workflowName: candidate.name } : {}),\n kind: 'transitionPostCondition',\n locationId: transitionId,\n })\n }\n }\n }\n\n return references\n}\n\n/** Distinct workflows (by `workflowId`) touched by the supplied references. */\nexport function countReferencingWorkflows(references: BusinessRuleUsageReference[]): number {\n return new Set(references.map((reference) => reference.workflowId)).size\n}\n\n/**\n * Tenant/org-scoped scan of workflow definitions for `ruleId`. Uses jsonb `@>`\n * containment (GIN-indexed on `workflow_definitions.definition`) so only rows\n * that actually name the rule are materialised, then re-checks them with the\n * pure collector to attach exact locations.\n */\nexport async function findBusinessRuleUsage(\n em: EntityManager,\n options: { ruleId: string; tenantId: string; organizationId: string },\n): Promise<BusinessRuleUsageReference[]> {\n const { ruleId, tenantId, organizationId } = options\n if (!ruleId) return []\n\n const containments = [\n JSON.stringify({ steps: [{ preConditions: [{ ruleId }] }] }),\n JSON.stringify({ transitions: [{ preConditions: [{ ruleId }] }] }),\n JSON.stringify({ transitions: [{ postConditions: [{ ruleId }] }] }),\n ]\n\n const rows = (await em.getConnection().execute(\n `select workflow_id, version, workflow_name, definition from workflow_definitions\n where tenant_id = ? and organization_id = ? and deleted_at is null\n and (definition @> ?::jsonb or definition @> ?::jsonb or definition @> ?::jsonb)`,\n [tenantId, organizationId, ...containments],\n )) as Array<{ workflow_id: string; version: number; workflow_name: string | null; definition: unknown }>\n\n const definitions: BusinessRuleUsageDefinition[] = rows.map((row) => ({\n workflowId: row.workflow_id,\n version: row.version,\n ...(row.workflow_name ? { name: row.workflow_name } : {}),\n definition: typeof row.definition === 'string' ? JSON.parse(row.definition) : row.definition,\n }))\n\n return collectBusinessRuleUsage(definitions, ruleId)\n}\n"],
|
|
5
|
+
"mappings": "AAsCA,SAAS,qBAAqB,KAAwB;AACpD,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,KAAK;AACvB,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,KAAK,KAAK;AACd;AAAA,IACF;AACA,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,SAAU,MAA+B;AAC/C,UAAI,OAAO,WAAW,YAAY,OAAO,SAAS,EAAG,KAAI,KAAK,MAAM;AAAA,IACtE;AAAA,EACF;AACA,SAAO;AACT;AASO,SAAS,yBACd,aACA,QAC8B;AAC9B,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,aAA2C,CAAC;AAElD,aAAW,aAAa,aAAa;AACnC,UAAM,OAAQ,UAAU,cAAc,CAAC;AACvC,UAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,UAAM,cAAc,MAAM,QAAQ,KAAK,WAAW,IAAI,KAAK,cAAc,CAAC;AAE1E,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAU,MAA+B;AAC/C,UAAI,OAAO,WAAW,SAAU;AAChC,UAAI,qBAAsB,KAAqC,aAAa,EAAE,SAAS,MAAM,GAAG;AAC9F,mBAAW,KAAK;AAAA,UACd,YAAY,UAAU;AAAA,UACtB,SAAS,UAAU;AAAA,UACnB,GAAI,UAAU,OAAO,EAAE,cAAc,UAAU,KAAK,IAAI,CAAC;AAAA,UACzD,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW,cAAc,aAAa;AACpC,YAAM,eAAgB,YAA2C;AACjE,UAAI,OAAO,iBAAiB,SAAU;AACtC,UAAI,qBAAsB,WAA2C,aAAa,EAAE,SAAS,MAAM,GAAG;AACpG,mBAAW,KAAK;AAAA,UACd,YAAY,UAAU;AAAA,UACtB,SAAS,UAAU;AAAA,UACnB,GAAI,UAAU,OAAO,EAAE,cAAc,UAAU,KAAK,IAAI,CAAC;AAAA,UACzD,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AACA,UAAI,qBAAsB,WAA4C,cAAc,EAAE,SAAS,MAAM,GAAG;AACtG,mBAAW,KAAK;AAAA,UACd,YAAY,UAAU;AAAA,UACtB,SAAS,UAAU;AAAA,UACnB,GAAI,UAAU,OAAO,EAAE,cAAc,UAAU,KAAK,IAAI,CAAC;AAAA,UACzD,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,0BAA0B,YAAkD;AAC1F,SAAO,IAAI,IAAI,WAAW,IAAI,CAAC,cAAc,UAAU,UAAU,CAAC,EAAE;AACtE;AAQA,eAAsB,sBACpB,IACA,SACuC;AACvC,QAAM,EAAE,QAAQ,UAAU,eAAe,IAAI;AAC7C,MAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,QAAM,eAAe;AAAA,IACnB,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,IAC3D,KAAK,UAAU,EAAE,aAAa,CAAC,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,IACjE,KAAK,UAAU,EAAE,aAAa,CAAC,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,EACpE;AAEA,QAAM,OAAQ,MAAM,GAAG,cAAc,EAAE;AAAA,IACrC;AAAA;AAAA;AAAA,IAGA,CAAC,UAAU,gBAAgB,GAAG,YAAY;AAAA,EAC5C;AAEA,QAAM,cAA6C,KAAK,IAAI,CAAC,SAAS;AAAA,IACpE,YAAY,IAAI;AAAA,IAChB,SAAS,IAAI;AAAA,IACb,GAAI,IAAI,gBAAgB,EAAE,MAAM,IAAI,cAAc,IAAI,CAAC;AAAA,IACvD,YAAY,OAAO,IAAI,eAAe,WAAW,KAAK,MAAM,IAAI,UAAU,IAAI,IAAI;AAAA,EACpF,EAAE;AAEF,SAAO,yBAAyB,aAAa,MAAM;AACrD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
function computeCallerImpacts(callers, subWorkflowId, ports) {
|
|
2
|
+
const inputNames = new Set((ports.inputs || []).map((port) => port.name));
|
|
3
|
+
const outputNames = new Set((ports.outputs || []).map((port) => port.name));
|
|
4
|
+
const impacts = [];
|
|
5
|
+
for (const caller of callers) {
|
|
6
|
+
const steps = Array.isArray(caller.definition?.steps) ? caller.definition.steps : [];
|
|
7
|
+
for (const step of steps) {
|
|
8
|
+
if (step?.stepType !== "SUB_WORKFLOW") continue;
|
|
9
|
+
if (step?.config?.subWorkflowId !== subWorkflowId) continue;
|
|
10
|
+
const broken = [];
|
|
11
|
+
const inputMapping = step.config?.inputMapping || {};
|
|
12
|
+
for (const childPortKey of Object.keys(inputMapping)) {
|
|
13
|
+
if (!inputNames.has(childPortKey)) broken.push(`input:${childPortKey}`);
|
|
14
|
+
}
|
|
15
|
+
const outputMapping = step.config?.outputMapping || {};
|
|
16
|
+
for (const childPath of Object.values(outputMapping)) {
|
|
17
|
+
const portName = String(childPath).split(".")[0];
|
|
18
|
+
if (!outputNames.has(portName)) broken.push(`output:${childPath}`);
|
|
19
|
+
}
|
|
20
|
+
if (broken.length > 0) {
|
|
21
|
+
impacts.push({
|
|
22
|
+
workflowId: caller.workflowId,
|
|
23
|
+
version: caller.version,
|
|
24
|
+
stepId: step.stepId,
|
|
25
|
+
brokenMappings: broken
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return impacts;
|
|
31
|
+
}
|
|
32
|
+
async function findSubWorkflowCallers(em, options) {
|
|
33
|
+
const { subWorkflowId, tenantId, organizationId, ports } = options;
|
|
34
|
+
const containment = JSON.stringify({
|
|
35
|
+
steps: [{ stepType: "SUB_WORKFLOW", config: { subWorkflowId } }]
|
|
36
|
+
});
|
|
37
|
+
const rows = await em.getConnection().execute(
|
|
38
|
+
`select workflow_id, version, definition from workflow_definitions
|
|
39
|
+
where tenant_id = ? and organization_id = ? and deleted_at is null and definition @> ?::jsonb`,
|
|
40
|
+
[tenantId, organizationId, containment]
|
|
41
|
+
);
|
|
42
|
+
const callers = rows.map((row) => ({
|
|
43
|
+
workflowId: row.workflow_id,
|
|
44
|
+
version: row.version,
|
|
45
|
+
definition: typeof row.definition === "string" ? JSON.parse(row.definition) : row.definition
|
|
46
|
+
}));
|
|
47
|
+
return computeCallerImpacts(callers, subWorkflowId, ports);
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
computeCallerImpacts,
|
|
51
|
+
findSubWorkflowCallers
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=caller-graph.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/caller-graph.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Workflows Module - Sub-workflow Caller Graph\n *\n * Finds the parent definitions that invoke a given sub-workflow and computes\n * which of their field mappings a port-schema change would break. Used by the\n * publish flow and the breaking-change preview endpoint.\n *\n * The caller scan uses a tenant-scoped jsonb `@>` containment query (backed by\n * the GIN index on `workflow_definitions.definition`); the impact diff is a pure\n * function so it can be unit-tested without a database.\n */\n\nimport type { EntityManager } from '@mikro-orm/core'\nimport { WorkflowDefinition } from '../data/entities'\nimport type { PortField, WorkflowIoContract } from '../data/validators'\n\nexport interface CallerImpact {\n workflowId: string\n version: number\n stepId: string\n brokenMappings: string[]\n}\n\ninterface CallerDefinition {\n workflowId: string\n version: number\n definition: any\n}\n\n/**\n * Compute, for each caller, the mappings that reference a port no longer present\n * in `ports`. Input mappings are keyed by child INPUT port name; output mappings\n * are keyed by parent key with values that are dot-paths whose first segment is a\n * child OUTPUT port name.\n */\nexport function computeCallerImpacts(\n callers: CallerDefinition[],\n subWorkflowId: string,\n ports: WorkflowIoContract,\n): CallerImpact[] {\n const inputNames = new Set((ports.inputs || []).map((port: PortField) => port.name))\n const outputNames = new Set((ports.outputs || []).map((port: PortField) => port.name))\n const impacts: CallerImpact[] = []\n\n for (const caller of callers) {\n const steps: any[] = Array.isArray(caller.definition?.steps) ? caller.definition.steps : []\n for (const step of steps) {\n if (step?.stepType !== 'SUB_WORKFLOW') continue\n if (step?.config?.subWorkflowId !== subWorkflowId) continue\n\n const broken: string[] = []\n\n const inputMapping: Record<string, string> = step.config?.inputMapping || {}\n for (const childPortKey of Object.keys(inputMapping)) {\n if (!inputNames.has(childPortKey)) broken.push(`input:${childPortKey}`)\n }\n\n const outputMapping: Record<string, string> = step.config?.outputMapping || {}\n for (const childPath of Object.values(outputMapping)) {\n const portName = String(childPath).split('.')[0]\n if (!outputNames.has(portName)) broken.push(`output:${childPath}`)\n }\n\n if (broken.length > 0) {\n impacts.push({\n workflowId: caller.workflowId,\n version: caller.version,\n stepId: step.stepId,\n brokenMappings: broken,\n })\n }\n }\n }\n\n return impacts\n}\n\n/**\n * Find parent definitions that invoke `subWorkflowId` and compute their breaking\n * mappings against the supplied published port contract. Tenant/org scoped.\n */\nexport async function findSubWorkflowCallers(\n em: EntityManager,\n options: { subWorkflowId: string; tenantId: string; organizationId: string; ports: WorkflowIoContract },\n): Promise<CallerImpact[]> {\n const { subWorkflowId, tenantId, organizationId, ports } = options\n const containment = JSON.stringify({\n steps: [{ stepType: 'SUB_WORKFLOW', config: { subWorkflowId } }],\n })\n\n const rows = (await em.getConnection().execute(\n `select workflow_id, version, definition from workflow_definitions\n where tenant_id = ? and organization_id = ? and deleted_at is null and definition @> ?::jsonb`,\n [tenantId, organizationId, containment],\n )) as Array<{ workflow_id: string; version: number; definition: any }>\n\n const callers: CallerDefinition[] = rows.map((row) => ({\n workflowId: row.workflow_id,\n version: row.version,\n definition: typeof row.definition === 'string' ? JSON.parse(row.definition) : row.definition,\n }))\n\n return computeCallerImpacts(callers, subWorkflowId, ports)\n}\n"],
|
|
5
|
+
"mappings": "AAmCO,SAAS,qBACd,SACA,eACA,OACgB;AAChB,QAAM,aAAa,IAAI,KAAK,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,SAAoB,KAAK,IAAI,CAAC;AACnF,QAAM,cAAc,IAAI,KAAK,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC,SAAoB,KAAK,IAAI,CAAC;AACrF,QAAM,UAA0B,CAAC;AAEjC,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAe,MAAM,QAAQ,OAAO,YAAY,KAAK,IAAI,OAAO,WAAW,QAAQ,CAAC;AAC1F,eAAW,QAAQ,OAAO;AACxB,UAAI,MAAM,aAAa,eAAgB;AACvC,UAAI,MAAM,QAAQ,kBAAkB,cAAe;AAEnD,YAAM,SAAmB,CAAC;AAE1B,YAAM,eAAuC,KAAK,QAAQ,gBAAgB,CAAC;AAC3E,iBAAW,gBAAgB,OAAO,KAAK,YAAY,GAAG;AACpD,YAAI,CAAC,WAAW,IAAI,YAAY,EAAG,QAAO,KAAK,SAAS,YAAY,EAAE;AAAA,MACxE;AAEA,YAAM,gBAAwC,KAAK,QAAQ,iBAAiB,CAAC;AAC7E,iBAAW,aAAa,OAAO,OAAO,aAAa,GAAG;AACpD,cAAM,WAAW,OAAO,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC;AAC/C,YAAI,CAAC,YAAY,IAAI,QAAQ,EAAG,QAAO,KAAK,UAAU,SAAS,EAAE;AAAA,MACnE;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,gBAAQ,KAAK;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,SAAS,OAAO;AAAA,UAChB,QAAQ,KAAK;AAAA,UACb,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,eAAsB,uBACpB,IACA,SACyB;AACzB,QAAM,EAAE,eAAe,UAAU,gBAAgB,MAAM,IAAI;AAC3D,QAAM,cAAc,KAAK,UAAU;AAAA,IACjC,OAAO,CAAC,EAAE,UAAU,gBAAgB,QAAQ,EAAE,cAAc,EAAE,CAAC;AAAA,EACjE,CAAC;AAED,QAAM,OAAQ,MAAM,GAAG,cAAc,EAAE;AAAA,IACrC;AAAA;AAAA,IAEA,CAAC,UAAU,gBAAgB,WAAW;AAAA,EACxC;AAEA,QAAM,UAA8B,KAAK,IAAI,CAAC,SAAS;AAAA,IACrD,YAAY,IAAI;AAAA,IAChB,SAAS,IAAI;AAAA,IACb,YAAY,OAAO,IAAI,eAAe,WAAW,KAAK,MAAM,IAAI,UAAU,IAAI,IAAI;AAAA,EACpF,EAAE;AAEF,SAAO,qBAAqB,SAAS,eAAe,KAAK;AAC3D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
function parseErrorLine(message, text) {
|
|
2
|
+
const lineMatch = /line (\d+)/i.exec(message);
|
|
3
|
+
if (lineMatch) {
|
|
4
|
+
const parsed = Number.parseInt(lineMatch[1], 10);
|
|
5
|
+
if (Number.isFinite(parsed) && parsed > 0) return parsed;
|
|
6
|
+
}
|
|
7
|
+
const positionMatch = /position (\d+)/i.exec(message);
|
|
8
|
+
if (positionMatch) {
|
|
9
|
+
const offset = Number.parseInt(positionMatch[1], 10);
|
|
10
|
+
if (!Number.isFinite(offset) || offset < 0) return null;
|
|
11
|
+
let line = 1;
|
|
12
|
+
for (let index = 0; index < Math.min(offset, text.length); index += 1) {
|
|
13
|
+
if (text[index] === "\n") line += 1;
|
|
14
|
+
}
|
|
15
|
+
return line;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function evaluateCodeViewDraft(input) {
|
|
20
|
+
const { draftText, canvasText, parseDefinition, validateGraph } = input;
|
|
21
|
+
if (canvasText !== void 0 && draftText === canvasText) {
|
|
22
|
+
return { ok: false, reason: "unchanged" };
|
|
23
|
+
}
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = JSON.parse(draftText);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
29
|
+
return { ok: false, reason: "parseError", message, line: parseErrorLine(message, draftText) };
|
|
30
|
+
}
|
|
31
|
+
const definitionResult = parseDefinition(parsed);
|
|
32
|
+
if (!definitionResult.ok) {
|
|
33
|
+
return { ok: false, reason: "schemaError", messages: definitionResult.messages };
|
|
34
|
+
}
|
|
35
|
+
const graphErrors = validateGraph(definitionResult.definition);
|
|
36
|
+
if (graphErrors.length > 0) {
|
|
37
|
+
return { ok: false, reason: "graphError", messages: graphErrors };
|
|
38
|
+
}
|
|
39
|
+
return { ok: true, definition: definitionResult.definition };
|
|
40
|
+
}
|
|
41
|
+
function describeCodeViewDraft(decision) {
|
|
42
|
+
if (decision.ok) {
|
|
43
|
+
return {
|
|
44
|
+
dirty: true,
|
|
45
|
+
canApply: true,
|
|
46
|
+
parseErrorLine: null,
|
|
47
|
+
parseErrorMessage: null,
|
|
48
|
+
blockingMessages: [],
|
|
49
|
+
blockingSeverity: null
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (decision.reason === "unchanged") {
|
|
53
|
+
return {
|
|
54
|
+
dirty: false,
|
|
55
|
+
canApply: false,
|
|
56
|
+
parseErrorLine: null,
|
|
57
|
+
parseErrorMessage: null,
|
|
58
|
+
blockingMessages: [],
|
|
59
|
+
blockingSeverity: null
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (decision.reason === "parseError") {
|
|
63
|
+
return {
|
|
64
|
+
dirty: true,
|
|
65
|
+
canApply: false,
|
|
66
|
+
parseErrorLine: decision.line,
|
|
67
|
+
parseErrorMessage: decision.message,
|
|
68
|
+
blockingMessages: [decision.message],
|
|
69
|
+
blockingSeverity: "error"
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
dirty: true,
|
|
74
|
+
canApply: false,
|
|
75
|
+
parseErrorLine: null,
|
|
76
|
+
parseErrorMessage: null,
|
|
77
|
+
blockingMessages: decision.messages,
|
|
78
|
+
blockingSeverity: "error"
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
describeCodeViewDraft,
|
|
83
|
+
evaluateCodeViewDraft,
|
|
84
|
+
parseErrorLine
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=code-view-apply.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/code-view-apply.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Workflows Module \u2014 Code view stage 2, the apply gate (spec section 2.2)\n *\n * ## The safety model, and why this one\n *\n * Stage 2 asks for *\"two-way live sync\"*. Taken literally \u2014 mutate the canvas\n * on every keystroke \u2014 it is unimplementable safely: deleting the `s` of\n * `\"steps\"` momentarily produces a document with no steps, and applying it\n * would delete every node, blow away the arrangement and push an undo entry\n * per character. So the two directions get the treatment each can actually\n * support:\n *\n * - **canvas \u2192 code is LIVE.** The panel re-renders from the canvas whenever\n * the author has not started editing. This is the direction with no risk:\n * the canvas is already the source of truth.\n * - **code \u2192 canvas is EXPLICIT.** The textarea is a local draft; the author\n * presses Apply (or Cmd/Ctrl+Enter). Parsing and validation are still LIVE \u2014\n * squiggles, the issue list and the Apply button's enabled state all update\n * as you type \u2014 so the feedback loop is immediate even though the commit is\n * not.\n *\n * `evaluateCodeViewDraft` is that gate, and it is PURE so the rule is testable\n * without a canvas. It refuses in four escalating ways, each with a distinct\n * reason the UI can explain:\n *\n * 1. `unchanged` \u2014 nothing to apply.\n * 2. `parseError` \u2014 not JSON. Carries the line so the editor can point at it.\n * 3. `schemaError` \u2014 parses, but is not a workflow definition.\n * 4. `graphError` \u2014 a valid definition whose GRAPH is broken (no START, an\n * unreachable step, a route to nowhere). Warnings do NOT block, exactly as\n * they do not block a Save.\n *\n * Refusing on graph errors is the difference between this and a \"just apply\n * whatever parses\" design. A canvas holding a graph the engine would reject is\n * a canvas the author has to repair by hand, and they no longer have the JSON\n * they typed \u2014 the textarea now mirrors the broken result.\n */\n\nimport type { WorkflowValidationIssueSeverity } from './collect-validation-issues'\n\nexport type CodeViewApplyRefusal =\n | { ok: false; reason: 'unchanged' }\n | { ok: false; reason: 'parseError'; message: string; line: number | null }\n | { ok: false; reason: 'schemaError'; messages: string[] }\n | { ok: false; reason: 'graphError'; messages: string[] }\n\nexport type CodeViewApplyDecision<TDefinition> =\n | { ok: true; definition: TDefinition }\n | CodeViewApplyRefusal\n\nexport type CodeViewDraftInput<TDefinition> = {\n draftText: string\n /**\n * The JSON the canvas currently serializes to.\n *\n * OMIT it when there is no such text to compare against \u2014 an AI-generated\n * draft (spec section 9) is a document the author asked for, so \"identical to\n * the canvas\" is not a refusal, it is a coincidence. Every other refusal\n * still applies, which is the point: a generated definition passes the same\n * gate a pasted one does.\n */\n canvasText?: string\n parseDefinition: (parsed: unknown) => { ok: true; definition: TDefinition } | { ok: false; messages: string[] }\n /**\n * Graph-level validation of the parsed definition. Return only ERRORS \u2014\n * warnings never block an apply, for the same reason they never block a save.\n */\n validateGraph: (definition: TDefinition) => string[]\n}\n\n/**\n * Extract the 1-based line number from a `JSON.parse` error message.\n *\n * Engines disagree on the wording, and some report only a character position,\n * so this is deliberately best-effort: a missing line means \"no gutter marker\",\n * never a marker on the wrong line.\n */\nexport function parseErrorLine(message: string, text: string): number | null {\n const lineMatch = /line (\\d+)/i.exec(message)\n if (lineMatch) {\n const parsed = Number.parseInt(lineMatch[1], 10)\n if (Number.isFinite(parsed) && parsed > 0) return parsed\n }\n const positionMatch = /position (\\d+)/i.exec(message)\n if (positionMatch) {\n const offset = Number.parseInt(positionMatch[1], 10)\n if (!Number.isFinite(offset) || offset < 0) return null\n let line = 1\n for (let index = 0; index < Math.min(offset, text.length); index += 1) {\n if (text[index] === '\\n') line += 1\n }\n return line\n }\n return null\n}\n\nexport function evaluateCodeViewDraft<TDefinition>(\n input: CodeViewDraftInput<TDefinition>,\n): CodeViewApplyDecision<TDefinition> {\n const { draftText, canvasText, parseDefinition, validateGraph } = input\n\n if (canvasText !== undefined && draftText === canvasText) {\n return { ok: false, reason: 'unchanged' }\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(draftText)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return { ok: false, reason: 'parseError', message, line: parseErrorLine(message, draftText) }\n }\n\n const definitionResult = parseDefinition(parsed)\n if (!definitionResult.ok) {\n return { ok: false, reason: 'schemaError', messages: definitionResult.messages }\n }\n\n const graphErrors = validateGraph(definitionResult.definition)\n if (graphErrors.length > 0) {\n return { ok: false, reason: 'graphError', messages: graphErrors }\n }\n\n return { ok: true, definition: definitionResult.definition }\n}\n\nexport type CodeViewDraftStatus = {\n dirty: boolean\n canApply: boolean\n /** Line the editor should mark as the parse failure, when there is one. */\n parseErrorLine: number | null\n parseErrorMessage: string | null\n blockingMessages: string[]\n blockingSeverity: WorkflowValidationIssueSeverity | null\n}\n\nexport function describeCodeViewDraft<TDefinition>(\n decision: CodeViewApplyDecision<TDefinition>,\n): CodeViewDraftStatus {\n if (decision.ok) {\n return {\n dirty: true,\n canApply: true,\n parseErrorLine: null,\n parseErrorMessage: null,\n blockingMessages: [],\n blockingSeverity: null,\n }\n }\n if (decision.reason === 'unchanged') {\n return {\n dirty: false,\n canApply: false,\n parseErrorLine: null,\n parseErrorMessage: null,\n blockingMessages: [],\n blockingSeverity: null,\n }\n }\n if (decision.reason === 'parseError') {\n return {\n dirty: true,\n canApply: false,\n parseErrorLine: decision.line,\n parseErrorMessage: decision.message,\n blockingMessages: [decision.message],\n blockingSeverity: 'error',\n }\n }\n return {\n dirty: true,\n canApply: false,\n parseErrorLine: null,\n parseErrorMessage: null,\n blockingMessages: decision.messages,\n blockingSeverity: 'error',\n }\n}\n"],
|
|
5
|
+
"mappings": "AA6EO,SAAS,eAAe,SAAiB,MAA6B;AAC3E,QAAM,YAAY,cAAc,KAAK,OAAO;AAC5C,MAAI,WAAW;AACb,UAAM,SAAS,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE;AAC/C,QAAI,OAAO,SAAS,MAAM,KAAK,SAAS,EAAG,QAAO;AAAA,EACpD;AACA,QAAM,gBAAgB,kBAAkB,KAAK,OAAO;AACpD,MAAI,eAAe;AACjB,UAAM,SAAS,OAAO,SAAS,cAAc,CAAC,GAAG,EAAE;AACnD,QAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,EAAG,QAAO;AACnD,QAAI,OAAO;AACX,aAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,QAAQ,KAAK,MAAM,GAAG,SAAS,GAAG;AACrE,UAAI,KAAK,KAAK,MAAM,KAAM,SAAQ;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,sBACd,OACoC;AACpC,QAAM,EAAE,WAAW,YAAY,iBAAiB,cAAc,IAAI;AAElE,MAAI,eAAe,UAAa,cAAc,YAAY;AACxD,WAAO,EAAE,IAAI,OAAO,QAAQ,YAAY;AAAA,EAC1C;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,SAAS;AAAA,EAC/B,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO,EAAE,IAAI,OAAO,QAAQ,cAAc,SAAS,MAAM,eAAe,SAAS,SAAS,EAAE;AAAA,EAC9F;AAEA,QAAM,mBAAmB,gBAAgB,MAAM;AAC/C,MAAI,CAAC,iBAAiB,IAAI;AACxB,WAAO,EAAE,IAAI,OAAO,QAAQ,eAAe,UAAU,iBAAiB,SAAS;AAAA,EACjF;AAEA,QAAM,cAAc,cAAc,iBAAiB,UAAU;AAC7D,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO,EAAE,IAAI,OAAO,QAAQ,cAAc,UAAU,YAAY;AAAA,EAClE;AAEA,SAAO,EAAE,IAAI,MAAM,YAAY,iBAAiB,WAAW;AAC7D;AAYO,SAAS,sBACd,UACqB;AACrB,MAAI,SAAS,IAAI;AACf,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,kBAAkB,CAAC;AAAA,MACnB,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,MAAI,SAAS,WAAW,aAAa;AACnC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,kBAAkB,CAAC;AAAA,MACnB,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,MAAI,SAAS,WAAW,cAAc;AACpC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,gBAAgB,SAAS;AAAA,MACzB,mBAAmB,SAAS;AAAA,MAC5B,kBAAkB,CAAC,SAAS,OAAO;AAAA,MACnC,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,kBAAkB,SAAS;AAAA,IAC3B,kBAAkB;AAAA,EACpB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {
|
|
2
|
+
collectFlowLogicWarnings
|
|
3
|
+
} from "./flow-logic-warnings.js";
|
|
4
|
+
const FLOW_LOGIC_MESSAGE_KEYS = {
|
|
5
|
+
errorRouteUnknownSource: {
|
|
6
|
+
key: "workflows.visualEditor.problems.errorRouteUnknownSource",
|
|
7
|
+
fallback: 'Error route "{transitionId}" starts at unknown step "{stepId}"'
|
|
8
|
+
},
|
|
9
|
+
errorRouteUnknownTarget: {
|
|
10
|
+
key: "workflows.visualEditor.problems.errorRouteUnknownTarget",
|
|
11
|
+
fallback: 'Error route "{transitionId}" targets unknown step "{stepId}"'
|
|
12
|
+
},
|
|
13
|
+
errorRouteDuplicateTarget: {
|
|
14
|
+
key: "workflows.visualEditor.problems.errorRouteDuplicateTarget",
|
|
15
|
+
fallback: 'Error route "{transitionId}" shares its source and target with a normal route; the engine cannot tell them apart'
|
|
16
|
+
},
|
|
17
|
+
branchingWithoutOtherwise: {
|
|
18
|
+
key: "workflows.visualEditor.problems.branchingWithoutOtherwise",
|
|
19
|
+
fallback: 'Branching step "{stepId}" has no unconditioned route; add an otherwise route so the workflow cannot stall when no condition matches'
|
|
20
|
+
},
|
|
21
|
+
duplicateBranchingCase: {
|
|
22
|
+
key: "workflows.visualEditor.problems.duplicateBranchingCase",
|
|
23
|
+
fallback: 'Branching step "{stepId}" has more than one route for {caseValue}; only the highest-priority one can ever match'
|
|
24
|
+
},
|
|
25
|
+
conditionUnknownPath: {
|
|
26
|
+
key: "workflows.visualEditor.problems.conditionUnknownPath",
|
|
27
|
+
fallback: 'Condition path "{path}" is not provided by any earlier step, trigger, or input'
|
|
28
|
+
},
|
|
29
|
+
unmappedStepConfig: {
|
|
30
|
+
key: "workflows.visualEditor.problems.unmappedStepConfig",
|
|
31
|
+
fallback: 'Step "{stepId}" keeps unmapped configuration from an earlier type change ({keys}); it is stored but no longer executed'
|
|
32
|
+
},
|
|
33
|
+
taskDecisionUnknownRoute: {
|
|
34
|
+
key: "workflows.visualEditor.problems.taskDecisionUnknownRoute",
|
|
35
|
+
fallback: 'Decision "{decisionId}" on task "{stepId}" points at route "{transitionId}", which no longer leaves this step'
|
|
36
|
+
},
|
|
37
|
+
taskDecisionDuplicateId: {
|
|
38
|
+
key: "workflows.visualEditor.problems.taskDecisionDuplicateId",
|
|
39
|
+
fallback: 'Task "{stepId}" has more than one decision with the id "{decisionId}"; only one of them can ever be recorded'
|
|
40
|
+
},
|
|
41
|
+
taskWithoutOwner: {
|
|
42
|
+
key: "workflows.visualEditor.problems.taskWithoutOwner",
|
|
43
|
+
fallback: 'Task "{stepId}" names neither an assignee nor a role queue, so nobody can complete it and the workflow will stall there'
|
|
44
|
+
},
|
|
45
|
+
taskPortalWithoutBinding: {
|
|
46
|
+
key: "workflows.visualEditor.problems.taskPortalWithoutBinding",
|
|
47
|
+
fallback: 'Task "{stepId}" is addressed to a customer but is about no record; a portal task is only visible to the customer whose record it is linked to, so nobody in the portal would see it'
|
|
48
|
+
},
|
|
49
|
+
taskBindingUnknownEntityType: {
|
|
50
|
+
key: "workflows.visualEditor.problems.taskBindingUnknownEntityType",
|
|
51
|
+
fallback: 'Task "{stepId}" is about "{entityType}", which is not a known record type; the task would be hidden from its own assignee'
|
|
52
|
+
},
|
|
53
|
+
outcomeRouteUnknownKind: {
|
|
54
|
+
key: "workflows.visualEditor.problems.outcomeRouteUnknownKind",
|
|
55
|
+
fallback: 'Outcome route "{transitionId}" claims outcome "{outcomeKind}", which the platform does not define; it can never be selected'
|
|
56
|
+
},
|
|
57
|
+
outcomeRouteDuplicateKind: {
|
|
58
|
+
key: "workflows.visualEditor.problems.outcomeRouteDuplicateKind",
|
|
59
|
+
fallback: 'Agent step "{stepId}" has more than one route for the "{outcomeKind}" outcome; only the highest-priority one can ever be taken'
|
|
60
|
+
},
|
|
61
|
+
taskBindingAssigneeCannotView: {
|
|
62
|
+
key: "workflows.visualEditor.problems.taskBindingAssigneeCannotView",
|
|
63
|
+
fallback: 'Task "{stepId}" is about "{entityType}", which {roles} may not view; assignees holding only those roles would not see the task'
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
function interpolateFallback(template, params) {
|
|
67
|
+
return template.replace(/\{(\w+)\}/g, (match, name) => params[name] ?? match);
|
|
68
|
+
}
|
|
69
|
+
const defaultTranslator = (_key, fallback, params) => interpolateFallback(fallback, params);
|
|
70
|
+
function resolveNodeLabel(node) {
|
|
71
|
+
if (!node) return void 0;
|
|
72
|
+
const label = node.data?.label;
|
|
73
|
+
return typeof label === "string" && label.length > 0 ? label : node.id;
|
|
74
|
+
}
|
|
75
|
+
function mapZodPathToGraph(path, nodes, edges) {
|
|
76
|
+
const [collection, index] = path;
|
|
77
|
+
if (typeof index !== "number") return {};
|
|
78
|
+
if (collection === "steps") {
|
|
79
|
+
const node = nodes[index];
|
|
80
|
+
if (!node) return {};
|
|
81
|
+
return { nodeId: node.id, nodeLabel: resolveNodeLabel(node) };
|
|
82
|
+
}
|
|
83
|
+
if (collection === "transitions") {
|
|
84
|
+
const edge = edges[index];
|
|
85
|
+
if (!edge) return {};
|
|
86
|
+
return { edgeId: edge.id };
|
|
87
|
+
}
|
|
88
|
+
return {};
|
|
89
|
+
}
|
|
90
|
+
function formatZodPath(path) {
|
|
91
|
+
return path.map((segment) => String(segment)).join(".");
|
|
92
|
+
}
|
|
93
|
+
function collectValidationIssues(input) {
|
|
94
|
+
const {
|
|
95
|
+
graphErrors,
|
|
96
|
+
zodIssues = [],
|
|
97
|
+
configWarnings = [],
|
|
98
|
+
nodes,
|
|
99
|
+
edges,
|
|
100
|
+
definition,
|
|
101
|
+
ledger,
|
|
102
|
+
knownEntityIds = null,
|
|
103
|
+
assigneeEntityAccess = null,
|
|
104
|
+
translate = defaultTranslator
|
|
105
|
+
} = input;
|
|
106
|
+
const graphIssues = graphErrors.map((error, index) => ({
|
|
107
|
+
id: `graph-${index}`,
|
|
108
|
+
severity: error.type,
|
|
109
|
+
message: error.message,
|
|
110
|
+
...error.nodeId ? { nodeId: error.nodeId } : {},
|
|
111
|
+
...error.edgeId ? { edgeId: error.edgeId } : {},
|
|
112
|
+
...error.nodeId ? { nodeLabel: resolveNodeLabel(nodes.find((node) => node.id === error.nodeId)) } : {}
|
|
113
|
+
}));
|
|
114
|
+
const schemaIssues = zodIssues.map((issue, index) => {
|
|
115
|
+
const pathText = formatZodPath(issue.path);
|
|
116
|
+
return {
|
|
117
|
+
id: `schema-${index}`,
|
|
118
|
+
severity: "error",
|
|
119
|
+
message: pathText ? `${pathText} - ${issue.message}` : issue.message,
|
|
120
|
+
...mapZodPathToGraph(issue.path, nodes, edges)
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
const configWarningIssues = configWarnings.map((issue, index) => {
|
|
124
|
+
const pathText = formatZodPath(issue.path);
|
|
125
|
+
return {
|
|
126
|
+
id: `config-${index}`,
|
|
127
|
+
severity: "warning",
|
|
128
|
+
message: pathText ? `${pathText} - ${issue.message}` : issue.message,
|
|
129
|
+
...mapZodPathToGraph(issue.path, nodes, edges)
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
const flowLogicIssues = collectFlowLogicWarnings(definition, {
|
|
133
|
+
ledger,
|
|
134
|
+
knownEntityIds,
|
|
135
|
+
assigneeEntityAccess
|
|
136
|
+
}).map((warning, index) => {
|
|
137
|
+
const message = FLOW_LOGIC_MESSAGE_KEYS[warning.code];
|
|
138
|
+
return {
|
|
139
|
+
id: `flow-${warning.code}-${index}`,
|
|
140
|
+
severity: warning.severity ?? "warning",
|
|
141
|
+
message: translate(message.key, message.fallback, warning.params),
|
|
142
|
+
...mapZodPathToGraph(warning.path, nodes, edges)
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
const all = [...graphIssues, ...schemaIssues, ...configWarningIssues, ...flowLogicIssues];
|
|
146
|
+
const errors = all.filter((issue) => issue.severity === "error");
|
|
147
|
+
const warnings = all.filter((issue) => issue.severity === "warning");
|
|
148
|
+
return [...errors, ...warnings];
|
|
149
|
+
}
|
|
150
|
+
function countIssuesBySeverity(issues) {
|
|
151
|
+
let errors = 0;
|
|
152
|
+
let warnings = 0;
|
|
153
|
+
for (const issue of issues) {
|
|
154
|
+
if (issue.severity === "error") errors += 1;
|
|
155
|
+
else warnings += 1;
|
|
156
|
+
}
|
|
157
|
+
return { errors, warnings };
|
|
158
|
+
}
|
|
159
|
+
export {
|
|
160
|
+
FLOW_LOGIC_MESSAGE_KEYS,
|
|
161
|
+
collectValidationIssues,
|
|
162
|
+
countIssuesBySeverity
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=collect-validation-issues.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/collect-validation-issues.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Node, Edge } from '@xyflow/react'\nimport type { ValidationError } from './graph-utils'\nimport type { ContextLedger } from './context-ledger'\nimport {\n collectFlowLogicWarnings,\n type FlowLogicDefinition,\n type FlowLogicWarningCode,\n type TaskAssigneeEntityAccess,\n} from './flow-logic-warnings'\n\nexport type WorkflowValidationIssueSeverity = 'error' | 'warning'\n\nexport interface WorkflowValidationIssue {\n id: string\n severity: WorkflowValidationIssueSeverity\n message: string\n nodeId?: string\n edgeId?: string\n nodeLabel?: string\n}\n\nexport interface ZodIssueLike {\n path: Array<string | number | symbol>\n message: string\n}\n\n/**\n * Message keys for the Phase 3a flow-logic warnings. English fallbacks live with\n * the translator so a caller without an i18n dictionary still gets readable\n * text.\n */\nexport const FLOW_LOGIC_MESSAGE_KEYS: Record<FlowLogicWarningCode, { key: string; fallback: string }> = {\n errorRouteUnknownSource: {\n key: 'workflows.visualEditor.problems.errorRouteUnknownSource',\n fallback: 'Error route \"{transitionId}\" starts at unknown step \"{stepId}\"',\n },\n errorRouteUnknownTarget: {\n key: 'workflows.visualEditor.problems.errorRouteUnknownTarget',\n fallback: 'Error route \"{transitionId}\" targets unknown step \"{stepId}\"',\n },\n errorRouteDuplicateTarget: {\n key: 'workflows.visualEditor.problems.errorRouteDuplicateTarget',\n fallback: 'Error route \"{transitionId}\" shares its source and target with a normal route; the engine cannot tell them apart',\n },\n branchingWithoutOtherwise: {\n key: 'workflows.visualEditor.problems.branchingWithoutOtherwise',\n fallback: 'Branching step \"{stepId}\" has no unconditioned route; add an otherwise route so the workflow cannot stall when no condition matches',\n },\n duplicateBranchingCase: {\n key: 'workflows.visualEditor.problems.duplicateBranchingCase',\n fallback: 'Branching step \"{stepId}\" has more than one route for {caseValue}; only the highest-priority one can ever match',\n },\n conditionUnknownPath: {\n key: 'workflows.visualEditor.problems.conditionUnknownPath',\n fallback: 'Condition path \"{path}\" is not provided by any earlier step, trigger, or input',\n },\n unmappedStepConfig: {\n key: 'workflows.visualEditor.problems.unmappedStepConfig',\n fallback: 'Step \"{stepId}\" keeps unmapped configuration from an earlier type change ({keys}); it is stored but no longer executed',\n },\n taskDecisionUnknownRoute: {\n key: 'workflows.visualEditor.problems.taskDecisionUnknownRoute',\n fallback: 'Decision \"{decisionId}\" on task \"{stepId}\" points at route \"{transitionId}\", which no longer leaves this step',\n },\n taskDecisionDuplicateId: {\n key: 'workflows.visualEditor.problems.taskDecisionDuplicateId',\n fallback: 'Task \"{stepId}\" has more than one decision with the id \"{decisionId}\"; only one of them can ever be recorded',\n },\n taskWithoutOwner: {\n key: 'workflows.visualEditor.problems.taskWithoutOwner',\n fallback: 'Task \"{stepId}\" names neither an assignee nor a role queue, so nobody can complete it and the workflow will stall there',\n },\n taskPortalWithoutBinding: {\n key: 'workflows.visualEditor.problems.taskPortalWithoutBinding',\n fallback: 'Task \"{stepId}\" is addressed to a customer but is about no record; a portal task is only visible to the customer whose record it is linked to, so nobody in the portal would see it',\n },\n taskBindingUnknownEntityType: {\n key: 'workflows.visualEditor.problems.taskBindingUnknownEntityType',\n fallback: 'Task \"{stepId}\" is about \"{entityType}\", which is not a known record type; the task would be hidden from its own assignee',\n },\n outcomeRouteUnknownKind: {\n key: 'workflows.visualEditor.problems.outcomeRouteUnknownKind',\n fallback: 'Outcome route \"{transitionId}\" claims outcome \"{outcomeKind}\", which the platform does not define; it can never be selected',\n },\n outcomeRouteDuplicateKind: {\n key: 'workflows.visualEditor.problems.outcomeRouteDuplicateKind',\n fallback: 'Agent step \"{stepId}\" has more than one route for the \"{outcomeKind}\" outcome; only the highest-priority one can ever be taken',\n },\n taskBindingAssigneeCannotView: {\n key: 'workflows.visualEditor.problems.taskBindingAssigneeCannotView',\n fallback: 'Task \"{stepId}\" is about \"{entityType}\", which {roles} may not view; assignees holding only those roles would not see the task',\n },\n}\n\nexport type WorkflowIssueTranslator = (\n key: string,\n fallback: string,\n params: Record<string, string>,\n) => string\n\nfunction interpolateFallback(template: string, params: Record<string, string>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => params[name] ?? match)\n}\n\nconst defaultTranslator: WorkflowIssueTranslator = (_key, fallback, params) =>\n interpolateFallback(fallback, params)\n\nexport interface CollectValidationIssuesInput {\n graphErrors: ValidationError[]\n zodIssues?: ZodIssueLike[]\n configWarnings?: ZodIssueLike[]\n nodes: Node[]\n edges: Edge[]\n /**\n * Definition JSON for the Phase 3a checks (error routes, branching routes,\n * condition paths). Omit it and only the legacy channels run.\n */\n definition?: FlowLogicDefinition | null\n /** Context ledger enabling the condition-path resolution check. */\n ledger?: ContextLedger\n /**\n * Generated entity ids that exist. Without it the unknown-binding check falls\n * back to a shape test rather than flagging every id it cannot enumerate.\n */\n knownEntityIds?: ReadonlySet<string> | null\n /** Tenant role features + entity view requirements, when the caller has them. */\n assigneeEntityAccess?: TaskAssigneeEntityAccess | null\n translate?: WorkflowIssueTranslator\n}\n\nfunction resolveNodeLabel(node: Node | undefined): string | undefined {\n if (!node) return undefined\n const label = node.data?.label\n return typeof label === 'string' && label.length > 0 ? label : node.id\n}\n\nfunction mapZodPathToGraph(\n path: Array<string | number | symbol>,\n nodes: Node[],\n edges: Edge[],\n): { nodeId?: string; edgeId?: string; nodeLabel?: string } {\n const [collection, index] = path\n if (typeof index !== 'number') return {}\n if (collection === 'steps') {\n const node = nodes[index]\n if (!node) return {}\n return { nodeId: node.id, nodeLabel: resolveNodeLabel(node) }\n }\n if (collection === 'transitions') {\n const edge = edges[index]\n if (!edge) return {}\n return { edgeId: edge.id }\n }\n return {}\n}\n\nfunction formatZodPath(path: Array<string | number | symbol>): string {\n return path.map((segment) => String(segment)).join('.')\n}\n\nexport function collectValidationIssues(input: CollectValidationIssuesInput): WorkflowValidationIssue[] {\n const {\n graphErrors,\n zodIssues = [],\n configWarnings = [],\n nodes,\n edges,\n definition,\n ledger,\n knownEntityIds = null,\n assigneeEntityAccess = null,\n translate = defaultTranslator,\n } = input\n\n const graphIssues: WorkflowValidationIssue[] = graphErrors.map((error, index) => ({\n id: `graph-${index}`,\n severity: error.type,\n message: error.message,\n ...(error.nodeId ? { nodeId: error.nodeId } : {}),\n ...(error.edgeId ? { edgeId: error.edgeId } : {}),\n ...(error.nodeId\n ? { nodeLabel: resolveNodeLabel(nodes.find((node) => node.id === error.nodeId)) }\n : {}),\n }))\n\n const schemaIssues: WorkflowValidationIssue[] = zodIssues.map((issue, index) => {\n const pathText = formatZodPath(issue.path)\n return {\n id: `schema-${index}`,\n severity: 'error',\n message: pathText ? `${pathText} - ${issue.message}` : issue.message,\n ...mapZodPathToGraph(issue.path, nodes, edges),\n }\n })\n\n const configWarningIssues: WorkflowValidationIssue[] = configWarnings.map((issue, index) => {\n const pathText = formatZodPath(issue.path)\n return {\n id: `config-${index}`,\n severity: 'warning',\n message: pathText ? `${pathText} - ${issue.message}` : issue.message,\n ...mapZodPathToGraph(issue.path, nodes, edges),\n }\n })\n\n // Phase 3a flow-logic + ledger checks default to WARNINGS: flow logic is\n // transition sugar and a path a later edit will provide must never make the\n // definition unsaveable. The \u00A76.4 task checks opt into `error` because they\n // describe a step the engine can never advance past \u2014 the same class as the\n // structural problems `graphErrors` carries.\n const flowLogicIssues: WorkflowValidationIssue[] = collectFlowLogicWarnings(definition, {\n ledger,\n knownEntityIds,\n assigneeEntityAccess,\n }).map((warning, index) => {\n const message = FLOW_LOGIC_MESSAGE_KEYS[warning.code]\n return {\n id: `flow-${warning.code}-${index}`,\n severity: warning.severity ?? 'warning',\n message: translate(message.key, message.fallback, warning.params),\n ...mapZodPathToGraph(warning.path, nodes, edges),\n }\n })\n\n const all = [...graphIssues, ...schemaIssues, ...configWarningIssues, ...flowLogicIssues]\n const errors = all.filter((issue) => issue.severity === 'error')\n const warnings = all.filter((issue) => issue.severity === 'warning')\n return [...errors, ...warnings]\n}\n\nexport function countIssuesBySeverity(issues: WorkflowValidationIssue[]): { errors: number; warnings: number } {\n let errors = 0\n let warnings = 0\n for (const issue of issues) {\n if (issue.severity === 'error') errors += 1\n else warnings += 1\n }\n return { errors, warnings }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|