@open-mercato/core 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7195.1.b5efd1d51a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -2
- package/AGENTS.md +4 -3
- package/agentic/standalone-guide.md +1 -1
- package/build.mjs +16 -0
- package/dist/bootstrap.js +7 -3
- package/dist/bootstrap.js.map +2 -2
- package/dist/generated/entities/action_log/index.js +2 -0
- package/dist/generated/entities/action_log/index.js.map +2 -2
- package/dist/generated/entities/user/index.js +2 -0
- package/dist/generated/entities/user/index.js.map +2 -2
- package/dist/generated/entities/user_task/index.js +14 -0
- package/dist/generated/entities/user_task/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition/index.js +6 -0
- package/dist/generated/entities/workflow_definition/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition_draft/index.js +25 -0
- package/dist/generated/entities/workflow_definition_draft/index.js.map +7 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js +23 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js.map +7 -0
- package/dist/generated/entities/workflow_instance/index.js +4 -0
- package/dist/generated/entities/workflow_instance/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +4 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +39 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/workflowsFixtures.js +477 -2
- package/dist/helpers/integration/workflowsFixtures.js.map +2 -2
- package/dist/helpers/integration/workflowsUi.js +148 -0
- package/dist/helpers/integration/workflowsUi.js.map +7 -0
- package/dist/modules/attachments/lib/createFromBuffer.js +79 -0
- package/dist/modules/attachments/lib/createFromBuffer.js.map +7 -0
- package/dist/modules/audit_logs/data/entities.js +5 -0
- package/dist/modules/audit_logs/data/entities.js.map +2 -2
- package/dist/modules/audit_logs/data/validators.js +1 -0
- package/dist/modules/audit_logs/data/validators.js.map +2 -2
- package/dist/modules/audit_logs/lib/projections.js +2 -1
- package/dist/modules/audit_logs/lib/projections.js.map +2 -2
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js +15 -0
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js.map +7 -0
- package/dist/modules/audit_logs/services/actionLogService.js +3 -0
- package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
- package/dist/modules/auth/data/entities.js +6 -0
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/lib/executionPrincipal.js +140 -0
- package/dist/modules/auth/lib/executionPrincipal.js.map +7 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js +13 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js.map +7 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js +154 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js.map +7 -0
- package/dist/modules/business_rules/data/validators.js +6 -0
- package/dist/modules/business_rules/data/validators.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-engine.js +5 -3
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +5 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/workflows.js +19 -0
- package/dist/modules/catalog/workflows.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/cli.js +80 -0
- package/dist/modules/customer_accounts/cli.js.map +7 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js +59 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js.map +7 -0
- package/dist/modules/customer_accounts/setup.js +4 -2
- package/dist/modules/customer_accounts/setup.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +4 -0
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js +1 -1
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +2 -0
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/events.js +13 -2
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/link-workflow-task-handler.js +64 -0
- package/dist/modules/customers/lib/link-workflow-task-handler.js.map +7 -0
- package/dist/modules/customers/lib/todoCompatibility.js +1 -1
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/customers/lib/workflowTaskLink.js +9 -0
- package/dist/modules/customers/lib/workflowTaskLink.js.map +7 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js +12 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js.map +7 -0
- package/dist/modules/customers/workflows.js +29 -0
- package/dist/modules/customers/workflows.js.map +7 -0
- package/dist/modules/entities/api/records.js +13 -33
- package/dist/modules/entities/api/records.js.map +3 -3
- package/dist/modules/entities/lib/entityClassification.js +60 -0
- package/dist/modules/entities/lib/entityClassification.js.map +7 -0
- package/dist/modules/sales/commands/documents.js +31 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/events.js +12 -1
- package/dist/modules/sales/events.js.map +2 -2
- package/dist/modules/sales/workflows.js +12 -1
- package/dist/modules/sales/workflows.js.map +2 -2
- package/dist/modules/seeds/cli.js +199 -0
- package/dist/modules/seeds/cli.js.map +7 -0
- package/dist/modules/seeds/examples/sample-seed.json +26 -0
- package/dist/modules/seeds/index.js +12 -0
- package/dist/modules/seeds/index.js.map +7 -0
- package/dist/modules/workflows/acl.js +96 -0
- package/dist/modules/workflows/acl.js.map +2 -2
- package/dist/modules/workflows/ai-agents.js +50 -0
- package/dist/modules/workflows/ai-agents.js.map +7 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js +582 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js.map +7 -0
- package/dist/modules/workflows/ai-tools/types.js +43 -0
- package/dist/modules/workflows/ai-tools/types.js.map +7 -0
- package/dist/modules/workflows/ai-tools.js +10 -0
- package/dist/modules/workflows/ai-tools.js.map +7 -0
- package/dist/modules/workflows/api/command-settings/route.js +137 -0
- package/dist/modules/workflows/api/command-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/commands/route.js +72 -0
- package/dist/modules/workflows/api/commands/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js +76 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js +134 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js +5 -1
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js +286 -0
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js +207 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +5 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js +93 -9
- package/dist/modules/workflows/api/definitions/[id]/route.js.map +3 -3
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js +210 -0
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/generate/route.js +233 -0
- package/dist/modules/workflows/api/definitions/generate/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/route.js +61 -113
- package/dist/modules/workflows/api/definitions/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/serialize.js +9 -0
- package/dist/modules/workflows/api/definitions/serialize.js.map +2 -2
- package/dist/modules/workflows/api/endpoints/route.js +69 -0
- package/dist/modules/workflows/api/endpoints/route.js.map +7 -0
- package/dist/modules/workflows/api/functions/route.js +73 -0
- package/dist/modules/workflows/api/functions/route.js.map +7 -0
- package/dist/modules/workflows/api/grantable-features/route.js +75 -0
- package/dist/modules/workflows/api/grantable-features/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js +180 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js +184 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/retry/route.js +12 -2
- package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js +148 -0
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js +123 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js +172 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js +117 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js +165 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/route.js +94 -3
- package/dist/modules/workflows/api/instances/route.js.map +2 -2
- package/dist/modules/workflows/api/metrics/definitions/route.js +188 -0
- package/dist/modules/workflows/api/metrics/definitions/route.js.map +7 -0
- package/dist/modules/workflows/api/openapi.js +415 -4
- package/dist/modules/workflows/api/openapi.js.map +2 -2
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js +132 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js +97 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/route.js +126 -0
- package/dist/modules/workflows/api/portal/tasks/route.js.map +7 -0
- package/dist/modules/workflows/api/rule-usage/route.js +80 -0
- package/dist/modules/workflows/api/rule-usage/route.js.map +7 -0
- package/dist/modules/workflows/api/task-settings/route.js +107 -0
- package/dist/modules/workflows/api/task-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js +27 -16
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js +40 -16
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js +150 -0
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/route.js +39 -6
- package/dist/modules/workflows/api/tasks/[id]/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js +100 -0
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/route.js +37 -6
- package/dist/modules/workflows/api/tasks/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/serialize.js +83 -0
- package/dist/modules/workflows/api/tasks/serialize.js.map +7 -0
- package/dist/modules/workflows/api/templates/route.js +69 -0
- package/dist/modules/workflows/api/templates/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js +129 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/route.js +119 -0
- package/dist/modules/workflows/api/work-inbox/route.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.js +10 -0
- package/dist/modules/workflows/backend/config/workflows/page.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js +35 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/[id]/page.js +6 -271
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/definitions/create/page.js +7 -56
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +131 -51
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2606 -677
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +3 -3
- package/dist/modules/workflows/backend/instances/[id]/page.js +532 -421
- package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/instances/failure-queue/page.js +211 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.js.map +7 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js +20 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/instances/page.js +159 -22
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/tasks/[id]/page.js +553 -392
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/page.js +8 -250
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.meta.js +1 -0
- package/dist/modules/workflows/backend/tasks/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/work-inbox/page.js +399 -0
- package/dist/modules/workflows/backend/work-inbox/page.js.map +7 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js +19 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js.map +7 -0
- package/dist/modules/workflows/cli.js +1 -1
- package/dist/modules/workflows/cli.js.map +2 -2
- package/dist/modules/workflows/commands/tasks.js +81 -0
- package/dist/modules/workflows/commands/tasks.js.map +7 -0
- package/dist/modules/workflows/components/ActivitiesEditor.js +281 -287
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
- package/dist/modules/workflows/components/ActivityEditDialog.js +220 -0
- package/dist/modules/workflows/components/ActivityEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/AgentSelector.js +115 -0
- package/dist/modules/workflows/components/AgentSelector.js.map +7 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js +110 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js +71 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRulesSelector.js +151 -93
- package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
- package/dist/modules/workflows/components/ConfigJsonTextarea.js +85 -0
- package/dist/modules/workflows/components/ConfigJsonTextarea.js.map +7 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js +150 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js +102 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js +377 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js +132 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +307 -216
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialog.js +11 -18
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +112 -72
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/InputDataPanel.js +128 -0
- package/dist/modules/workflows/components/InputDataPanel.js.map +7 -0
- package/dist/modules/workflows/components/InspectorPanel.js +161 -0
- package/dist/modules/workflows/components/InspectorPanel.js.map +7 -0
- package/dist/modules/workflows/components/NodeEditDialog.js +363 -41
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +714 -159
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TemplateGalleryDialog.js +148 -0
- package/dist/modules/workflows/components/TemplateGalleryDialog.js.map +7 -0
- package/dist/modules/workflows/components/TransitionsEditor.js +80 -74
- package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TriggersDialog.js +53 -0
- package/dist/modules/workflows/components/TriggersDialog.js.map +7 -0
- package/dist/modules/workflows/components/TriggersEditor.js +331 -0
- package/dist/modules/workflows/components/TriggersEditor.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js +278 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js +173 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js +62 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js +70 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js +36 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowGraph.js +4 -2
- package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +324 -86
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +3 -3
- package/dist/modules/workflows/components/WorkflowIconPicker.js +109 -0
- package/dist/modules/workflows/components/WorkflowIconPicker.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowLegend.js +45 -29
- package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowNodeCard.js +221 -22
- package/dist/modules/workflows/components/WorkflowNodeCard.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowRouteChips.js +111 -0
- package/dist/modules/workflows/components/WorkflowRouteChips.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowSelector.js +108 -88
- package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js +61 -11
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js +15 -5
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +88 -21
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js +615 -0
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js +191 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js +488 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js +61 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js.map +7 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js +227 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +37 -4
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/CommandPicker.js +111 -0
- package/dist/modules/workflows/components/fields/CommandPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js +235 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FunctionPicker.js +55 -0
- package/dist/modules/workflows/components/fields/FunctionPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js +38 -15
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js +206 -0
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js +53 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js.map +7 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js +130 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js +104 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js.map +7 -0
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +2 -2
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js +210 -0
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js +126 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js +218 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js +114 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js +64 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js.map +7 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js +121 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js.map +7 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js +35 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js.map +7 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js +16 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js.map +7 -0
- package/dist/modules/workflows/components/formConfig.js +39 -10
- package/dist/modules/workflows/components/formConfig.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileMetadataSheet.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +29 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +64 -65
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +2 -2
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js +64 -0
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/AutomatedNode.js +24 -16
- package/dist/modules/workflows/components/nodes/AutomatedNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/EndNode.js +13 -12
- package/dist/modules/workflows/components/nodes/EndNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js +29 -0
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js.map +7 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js +51 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js +122 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js +100 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js.map +7 -0
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StartNode.js +66 -15
- package/dist/modules/workflows/components/nodes/StartNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js +54 -0
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js +107 -41
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/SwitchNode.js +51 -0
- package/dist/modules/workflows/components/nodes/SwitchNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js +65 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js +111 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/UserTaskNode.js +43 -17
- package/dist/modules/workflows/components/nodes/UserTaskNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js +53 -0
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/index.js +14 -0
- package/dist/modules/workflows/components/nodes/index.js.map +2 -2
- package/dist/modules/workflows/components/portal/PortalTaskForm.js +196 -0
- package/dist/modules/workflows/components/portal/PortalTaskForm.js.map +7 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js +22 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js.map +7 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js +106 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js.map +7 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js +30 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunGantt.js +130 -0
- package/dist/modules/workflows/components/run/RunGantt.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js +82 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js +116 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js.map +7 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js +52 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js.map +7 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js +28 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js.map +7 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js +89 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js +41 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js +57 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js.map +7 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js +156 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js +72 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js +156 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js +46 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js +53 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js +261 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js +27 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-schemas.js +191 -0
- package/dist/modules/workflows/data/activity-config-schemas.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-warnings.js +42 -0
- package/dist/modules/workflows/data/activity-config-warnings.js.map +7 -0
- package/dist/modules/workflows/data/branching-route-warnings.js +65 -0
- package/dist/modules/workflows/data/branching-route-warnings.js.map +7 -0
- package/dist/modules/workflows/data/entities.js +144 -4
- package/dist/modules/workflows/data/entities.js.map +2 -2
- package/dist/modules/workflows/data/metrics-validators.js +35 -0
- package/dist/modules/workflows/data/metrics-validators.js.map +7 -0
- package/dist/modules/workflows/data/task-primitives.js +14 -0
- package/dist/modules/workflows/data/task-primitives.js.map +7 -0
- package/dist/modules/workflows/data/validators.js +504 -61
- package/dist/modules/workflows/data/validators.js.map +3 -3
- package/dist/modules/workflows/di.js +16 -1
- package/dist/modules/workflows/di.js.map +2 -2
- package/dist/modules/workflows/events.js +66 -8
- package/dist/modules/workflows/events.js.map +2 -2
- package/dist/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/dist/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/dist/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/dist/modules/workflows/examples/templates/order-approval.json +230 -0
- package/dist/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/dist/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/dist/modules/workflows/extension-points.js +1 -1
- package/dist/modules/workflows/extension-points.js.map +2 -2
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js +144 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js +12 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js +114 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js +18 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js.map +7 -0
- package/dist/modules/workflows/lib/activity-executor.js +505 -137
- package/dist/modules/workflows/lib/activity-executor.js.map +3 -3
- package/dist/modules/workflows/lib/activity-queue-types.js +3 -1
- package/dist/modules/workflows/lib/activity-queue-types.js.map +2 -2
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js +2 -0
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js.map +7 -0
- package/dist/modules/workflows/lib/activity-registry.js +27 -0
- package/dist/modules/workflows/lib/activity-registry.js.map +7 -0
- package/dist/modules/workflows/lib/activity-types.js +291 -0
- package/dist/modules/workflows/lib/activity-types.js.map +7 -0
- package/dist/modules/workflows/lib/activity-worker-handler.js +456 -32
- package/dist/modules/workflows/lib/activity-worker-handler.js.map +3 -3
- package/dist/modules/workflows/lib/advanced-config.js +31 -0
- package/dist/modules/workflows/lib/advanced-config.js.map +7 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js +198 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js.map +7 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js +82 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js.map +7 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js +54 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js +61 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review.js +66 -0
- package/dist/modules/workflows/lib/agent-review.js.map +7 -0
- package/dist/modules/workflows/lib/ai-authoring.js +155 -0
- package/dist/modules/workflows/lib/ai-authoring.js.map +7 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js +43 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js.map +7 -0
- package/dist/modules/workflows/lib/annotation-events.js +10 -0
- package/dist/modules/workflows/lib/annotation-events.js.map +7 -0
- package/dist/modules/workflows/lib/branching-routes.js +182 -0
- package/dist/modules/workflows/lib/branching-routes.js.map +7 -0
- package/dist/modules/workflows/lib/breach-routing.js +50 -0
- package/dist/modules/workflows/lib/breach-routing.js.map +7 -0
- package/dist/modules/workflows/lib/bulk-replay.js +101 -0
- package/dist/modules/workflows/lib/bulk-replay.js.map +7 -0
- package/dist/modules/workflows/lib/business-rule-usage.js +91 -0
- package/dist/modules/workflows/lib/business-rule-usage.js.map +7 -0
- package/dist/modules/workflows/lib/caller-graph.js +53 -0
- package/dist/modules/workflows/lib/caller-graph.js.map +7 -0
- package/dist/modules/workflows/lib/code-view-apply.js +86 -0
- package/dist/modules/workflows/lib/code-view-apply.js.map +7 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js +164 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js.map +7 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js +72 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js.map +7 -0
- package/dist/modules/workflows/lib/component-guard.js +7 -0
- package/dist/modules/workflows/lib/component-guard.js.map +7 -0
- package/dist/modules/workflows/lib/condition-handler.js +443 -0
- package/dist/modules/workflows/lib/condition-handler.js.map +7 -0
- package/dist/modules/workflows/lib/context-ledger.js +448 -0
- package/dist/modules/workflows/lib/context-ledger.js.map +7 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js +8 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js.map +7 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js +63 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/definition-context-schema.js +56 -0
- package/dist/modules/workflows/lib/definition-context-schema.js.map +7 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js +123 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js.map +7 -0
- package/dist/modules/workflows/lib/definition-error-body.js +33 -0
- package/dist/modules/workflows/lib/definition-error-body.js.map +7 -0
- package/dist/modules/workflows/lib/definition-evaluation.js +79 -0
- package/dist/modules/workflows/lib/definition-evaluation.js.map +7 -0
- package/dist/modules/workflows/lib/definition-grant.js +90 -0
- package/dist/modules/workflows/lib/definition-grant.js.map +7 -0
- package/dist/modules/workflows/lib/definition-json-locations.js +139 -0
- package/dist/modules/workflows/lib/definition-json-locations.js.map +7 -0
- package/dist/modules/workflows/lib/definition-payload.js +31 -0
- package/dist/modules/workflows/lib/definition-payload.js.map +7 -0
- package/dist/modules/workflows/lib/draft-restore.js +49 -0
- package/dist/modules/workflows/lib/draft-restore.js.map +7 -0
- package/dist/modules/workflows/lib/dry-run.js +106 -0
- package/dist/modules/workflows/lib/dry-run.js.map +7 -0
- package/dist/modules/workflows/lib/duration.js +66 -17
- package/dist/modules/workflows/lib/duration.js.map +2 -2
- package/dist/modules/workflows/lib/edge-reattachment.js +79 -0
- package/dist/modules/workflows/lib/edge-reattachment.js.map +7 -0
- package/dist/modules/workflows/lib/edgeFormTransforms.js +7 -11
- package/dist/modules/workflows/lib/edgeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/editor-annotations.js +195 -0
- package/dist/modules/workflows/lib/editor-annotations.js.map +7 -0
- package/dist/modules/workflows/lib/editor-commands.js +103 -0
- package/dist/modules/workflows/lib/editor-commands.js.map +7 -0
- package/dist/modules/workflows/lib/editor-history.js +51 -0
- package/dist/modules/workflows/lib/editor-history.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js +181 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-path.js +90 -0
- package/dist/modules/workflows/lib/endpoint-path.js.map +7 -0
- package/dist/modules/workflows/lib/engine-version.js +42 -0
- package/dist/modules/workflows/lib/engine-version.js.map +7 -0
- package/dist/modules/workflows/lib/error-handler.js +132 -0
- package/dist/modules/workflows/lib/error-handler.js.map +7 -0
- package/dist/modules/workflows/lib/error-routing.js +104 -0
- package/dist/modules/workflows/lib/error-routing.js.map +7 -0
- package/dist/modules/workflows/lib/event-logger.js +23 -0
- package/dist/modules/workflows/lib/event-logger.js.map +2 -2
- package/dist/modules/workflows/lib/expression-refs.js +168 -0
- package/dist/modules/workflows/lib/expression-refs.js.map +7 -0
- package/dist/modules/workflows/lib/failure-grouping.js +62 -0
- package/dist/modules/workflows/lib/failure-grouping.js.map +7 -0
- package/dist/modules/workflows/lib/find-definition.js +1 -0
- package/dist/modules/workflows/lib/find-definition.js.map +2 -2
- package/dist/modules/workflows/lib/flow-logic-warnings.js +338 -0
- package/dist/modules/workflows/lib/flow-logic-warnings.js.map +7 -0
- package/dist/modules/workflows/lib/graph-utils.js +328 -77
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/dist/modules/workflows/lib/icon-search.js +32 -0
- package/dist/modules/workflows/lib/icon-search.js.map +7 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js +26 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js.map +7 -0
- package/dist/modules/workflows/lib/instance-date-filter.js +28 -0
- package/dist/modules/workflows/lib/instance-date-filter.js.map +7 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js +271 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-drag.js +28 -0
- package/dist/modules/workflows/lib/ledger-drag.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js +66 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js +82 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js +110 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js +26 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js +160 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js.map +7 -0
- package/dist/modules/workflows/lib/node-config-summary.js +128 -0
- package/dist/modules/workflows/lib/node-config-summary.js.map +7 -0
- package/dist/modules/workflows/lib/node-geometry.js +53 -0
- package/dist/modules/workflows/lib/node-geometry.js.map +7 -0
- package/dist/modules/workflows/lib/node-nudge.js +44 -0
- package/dist/modules/workflows/lib/node-nudge.js.map +7 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js +88 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js.map +7 -0
- package/dist/modules/workflows/lib/node-placement.js +55 -0
- package/dist/modules/workflows/lib/node-placement.js.map +7 -0
- package/dist/modules/workflows/lib/node-type-icons.js +54 -13
- package/dist/modules/workflows/lib/node-type-icons.js.map +2 -2
- package/dist/modules/workflows/lib/nodeFormTransforms.js +329 -19
- package/dist/modules/workflows/lib/nodeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/outcome-routing.js +158 -0
- package/dist/modules/workflows/lib/outcome-routing.js.map +7 -0
- package/dist/modules/workflows/lib/owned-definition.js +107 -0
- package/dist/modules/workflows/lib/owned-definition.js.map +7 -0
- package/dist/modules/workflows/lib/owned-node-changes.js +10 -0
- package/dist/modules/workflows/lib/owned-node-changes.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drag.js +36 -0
- package/dist/modules/workflows/lib/palette-drag.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drop.js +45 -0
- package/dist/modules/workflows/lib/palette-drop.js.map +7 -0
- package/dist/modules/workflows/lib/parallel-handler.js +57 -2
- package/dist/modules/workflows/lib/parallel-handler.js.map +2 -2
- package/dist/modules/workflows/lib/port-contract.js +54 -0
- package/dist/modules/workflows/lib/port-contract.js.map +7 -0
- package/dist/modules/workflows/lib/portal-task-access.js +89 -0
- package/dist/modules/workflows/lib/portal-task-access.js.map +7 -0
- package/dist/modules/workflows/lib/rerun-from-step.js +65 -0
- package/dist/modules/workflows/lib/rerun-from-step.js.map +7 -0
- package/dist/modules/workflows/lib/route-chip-events.js +23 -0
- package/dist/modules/workflows/lib/route-chip-events.js.map +7 -0
- package/dist/modules/workflows/lib/route-chips.js +91 -0
- package/dist/modules/workflows/lib/route-chips.js.map +7 -0
- package/dist/modules/workflows/lib/route-edge.js +17 -0
- package/dist/modules/workflows/lib/route-edge.js.map +7 -0
- package/dist/modules/workflows/lib/route-kinds.js +67 -0
- package/dist/modules/workflows/lib/route-kinds.js.map +7 -0
- package/dist/modules/workflows/lib/route-priority.js +104 -0
- package/dist/modules/workflows/lib/route-priority.js.map +7 -0
- package/dist/modules/workflows/lib/run-duration.js +44 -0
- package/dist/modules/workflows/lib/run-duration.js.map +7 -0
- package/dist/modules/workflows/lib/run-event-tone.js +25 -0
- package/dist/modules/workflows/lib/run-event-tone.js.map +7 -0
- package/dist/modules/workflows/lib/run-execution.js +305 -0
- package/dist/modules/workflows/lib/run-execution.js.map +7 -0
- package/dist/modules/workflows/lib/run-gantt.js +180 -0
- package/dist/modules/workflows/lib/run-gantt.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js +33 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome.js +48 -0
- package/dist/modules/workflows/lib/run-outcome.js.map +7 -0
- package/dist/modules/workflows/lib/sample-resolver.js +71 -0
- package/dist/modules/workflows/lib/sample-resolver.js.map +7 -0
- package/dist/modules/workflows/lib/seeds.js +1 -1
- package/dist/modules/workflows/lib/seeds.js.map +2 -2
- package/dist/modules/workflows/lib/server-output-contract.js +65 -0
- package/dist/modules/workflows/lib/server-output-contract.js.map +7 -0
- package/dist/modules/workflows/lib/set-variable.js +47 -0
- package/dist/modules/workflows/lib/set-variable.js.map +7 -0
- package/dist/modules/workflows/lib/signal-handler.js +63 -4
- package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
- package/dist/modules/workflows/lib/start-fixtures.js +42 -0
- package/dist/modules/workflows/lib/start-fixtures.js.map +7 -0
- package/dist/modules/workflows/lib/status-colors.js +153 -22
- package/dist/modules/workflows/lib/status-colors.js.map +2 -2
- package/dist/modules/workflows/lib/step-handler.js +529 -53
- package/dist/modules/workflows/lib/step-handler.js.map +3 -3
- package/dist/modules/workflows/lib/step-presentation.js +147 -0
- package/dist/modules/workflows/lib/step-presentation.js.map +7 -0
- package/dist/modules/workflows/lib/step-through.js +26 -0
- package/dist/modules/workflows/lib/step-through.js.map +7 -0
- package/dist/modules/workflows/lib/step-type-conversion.js +167 -0
- package/dist/modules/workflows/lib/step-type-conversion.js.map +7 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js +114 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js.map +7 -0
- package/dist/modules/workflows/lib/task-decision-context.js +38 -0
- package/dist/modules/workflows/lib/task-decision-context.js.map +7 -0
- package/dist/modules/workflows/lib/task-decisions.js +49 -0
- package/dist/modules/workflows/lib/task-decisions.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-access.js +62 -0
- package/dist/modules/workflows/lib/task-entity-access.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js +39 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-types.js +36 -0
- package/dist/modules/workflows/lib/task-entity-types.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-registry.js +33 -0
- package/dist/modules/workflows/lib/task-form-registry.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-schema.js +75 -0
- package/dist/modules/workflows/lib/task-form-schema.js.map +7 -0
- package/dist/modules/workflows/lib/task-handler.js +251 -32
- package/dist/modules/workflows/lib/task-handler.js.map +2 -2
- package/dist/modules/workflows/lib/task-inspector-config.js +182 -0
- package/dist/modules/workflows/lib/task-inspector-config.js.map +7 -0
- package/dist/modules/workflows/lib/task-list-query.js +19 -0
- package/dist/modules/workflows/lib/task-list-query.js.map +7 -0
- package/dist/modules/workflows/lib/task-notifications.js +119 -0
- package/dist/modules/workflows/lib/task-notifications.js.map +7 -0
- package/dist/modules/workflows/lib/task-permission-settings.js +43 -0
- package/dist/modules/workflows/lib/task-permission-settings.js.map +7 -0
- package/dist/modules/workflows/lib/task-presets.js +35 -0
- package/dist/modules/workflows/lib/task-presets.js.map +7 -0
- package/dist/modules/workflows/lib/task-quick-action.js +45 -0
- package/dist/modules/workflows/lib/task-quick-action.js.map +7 -0
- package/dist/modules/workflows/lib/task-resolution.js +120 -0
- package/dist/modules/workflows/lib/task-resolution.js.map +7 -0
- package/dist/modules/workflows/lib/task-sla.js +357 -0
- package/dist/modules/workflows/lib/task-sla.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility-request.js +266 -0
- package/dist/modules/workflows/lib/task-visibility-request.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility.js +194 -0
- package/dist/modules/workflows/lib/task-visibility.js.map +7 -0
- package/dist/modules/workflows/lib/timer-handler.js +3 -1
- package/dist/modules/workflows/lib/timer-handler.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +148 -20
- package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
- package/dist/modules/workflows/lib/trigger-node.js +121 -0
- package/dist/modules/workflows/lib/trigger-node.js.map +7 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js +14 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js +52 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js +63 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js +11 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js +90 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js +118 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/query.js +70 -0
- package/dist/modules/workflows/lib/work-inbox/query.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/service.js +56 -0
- package/dist/modules/workflows/lib/work-inbox/service.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js +149 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js +57 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js +54 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-executor.js +658 -6
- package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-function-registry.js +40 -0
- package/dist/modules/workflows/lib/workflow-function-registry.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-safe-commands.js +11 -1
- package/dist/modules/workflows/lib/workflow-safe-commands.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-templates.js +69 -0
- package/dist/modules/workflows/lib/workflow-templates.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js +17 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js +12 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js.map +7 -0
- package/dist/modules/workflows/notifications.js +38 -10
- package/dist/modules/workflows/notifications.js.map +2 -2
- package/dist/modules/workflows/setup.js +81 -1
- package/dist/modules/workflows/setup.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-assigned-notification.js +19 -27
- package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js.map +7 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js +73 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js +17 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js.map +7 -0
- package/dist/modules/workflows/widgets/injection-table.js +26 -0
- package/dist/modules/workflows/widgets/injection-table.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-activities.worker.js +61 -39
- package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js +40 -0
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js +43 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js +30 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js.map +7 -0
- package/generated/entities/action_log/index.ts +1 -0
- package/generated/entities/user/index.ts +1 -0
- package/generated/entities/user_task/index.ts +7 -0
- package/generated/entities/workflow_definition/index.ts +3 -0
- package/generated/entities/workflow_definition_draft/index.ts +11 -0
- package/generated/entities/workflow_definition_metric_rollup/index.ts +10 -0
- package/generated/entities/workflow_instance/index.ts +2 -0
- package/generated/entities.ids.generated.ts +4 -1
- package/generated/entity-fields-registry.ts +39 -0
- package/jest.setup.ts +13 -0
- package/package.json +8 -7
- package/src/bootstrap.ts +13 -3
- package/src/helpers/integration/workflowsFixtures.ts +765 -5
- package/src/helpers/integration/workflowsUi.ts +318 -0
- package/src/modules/attachments/lib/createFromBuffer.ts +120 -0
- package/src/modules/audit_logs/data/entities.ts +12 -0
- package/src/modules/audit_logs/data/validators.ts +1 -0
- package/src/modules/audit_logs/lib/projections.ts +5 -1
- package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +26 -0
- package/src/modules/audit_logs/migrations/Migration20260625120000.ts +15 -0
- package/src/modules/audit_logs/services/actionLogService.ts +3 -0
- package/src/modules/auth/data/entities.ts +21 -0
- package/src/modules/auth/i18n/de.json +31 -0
- package/src/modules/auth/i18n/en.json +31 -0
- package/src/modules/auth/i18n/es.json +31 -0
- package/src/modules/auth/i18n/ko.json +31 -0
- package/src/modules/auth/i18n/pl.json +31 -0
- package/src/modules/auth/lib/executionPrincipal.ts +235 -0
- package/src/modules/auth/migrations/.snapshot-open-mercato.json +16 -0
- package/src/modules/auth/migrations/Migration20260625050000.ts +21 -0
- package/src/modules/business_rules/components/InlineRuleEditor.tsx +231 -0
- package/src/modules/business_rules/data/validators.ts +6 -0
- package/src/modules/business_rules/i18n/de.json +4 -0
- package/src/modules/business_rules/i18n/en.json +4 -0
- package/src/modules/business_rules/i18n/es.json +4 -0
- package/src/modules/business_rules/i18n/ko.json +4 -0
- package/src/modules/business_rules/i18n/pl.json +4 -0
- package/src/modules/business_rules/lib/rule-engine.ts +15 -1
- package/src/modules/catalog/commands/products.ts +12 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/workflows.ts +35 -0
- package/src/modules/customer_accounts/AGENTS.md +11 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +2 -0
- package/src/modules/customer_accounts/cli.ts +96 -0
- package/src/modules/customer_accounts/i18n/de.json +5 -0
- package/src/modules/customer_accounts/i18n/en.json +5 -0
- package/src/modules/customer_accounts/i18n/es.json +5 -0
- package/src/modules/customer_accounts/i18n/ko.json +5 -0
- package/src/modules/customer_accounts/i18n/pl.json +5 -0
- package/src/modules/customer_accounts/lib/customerRoleAclSync.ts +92 -0
- package/src/modules/customer_accounts/setup.ts +15 -3
- package/src/modules/customers/commands/deals.ts +5 -0
- package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +4 -2
- package/src/modules/customers/components/detail/utils.ts +2 -0
- package/src/modules/customers/events.ts +21 -3
- package/src/modules/customers/i18n/de.json +4 -0
- package/src/modules/customers/i18n/en.json +4 -0
- package/src/modules/customers/i18n/es.json +4 -0
- package/src/modules/customers/i18n/ko.json +4 -0
- package/src/modules/customers/i18n/pl.json +4 -0
- package/src/modules/customers/lib/link-workflow-task-handler.ts +136 -0
- package/src/modules/customers/lib/todoCompatibility.ts +4 -1
- package/src/modules/customers/lib/workflowTaskLink.ts +23 -0
- package/src/modules/customers/subscribers/link-workflow-task.ts +19 -0
- package/src/modules/customers/workflows.ts +57 -0
- package/src/modules/entities/api/records.ts +18 -62
- package/src/modules/entities/lib/entityClassification.ts +102 -0
- package/src/modules/sales/commands/documents.ts +46 -0
- package/src/modules/sales/events.ts +20 -2
- package/src/modules/sales/i18n/de.json +2 -1
- package/src/modules/sales/i18n/en.json +2 -1
- package/src/modules/sales/i18n/es.json +2 -1
- package/src/modules/sales/i18n/ko.json +2 -1
- package/src/modules/sales/i18n/pl.json +2 -1
- package/src/modules/sales/workflows.ts +12 -1
- package/src/modules/seeds/README.md +86 -0
- package/src/modules/seeds/cli.ts +220 -0
- package/src/modules/seeds/examples/sample-seed.json +26 -0
- package/src/modules/seeds/index.ts +11 -0
- package/src/modules/workflows/AGENTS.md +851 -10
- package/src/modules/workflows/acl.ts +96 -0
- package/src/modules/workflows/ai-agents.ts +80 -0
- package/src/modules/workflows/ai-tools/authoring-pack.ts +798 -0
- package/src/modules/workflows/ai-tools/types.ts +117 -0
- package/src/modules/workflows/ai-tools.ts +20 -0
- package/src/modules/workflows/api/command-settings/route.ts +171 -0
- package/src/modules/workflows/api/commands/route.ts +109 -0
- package/src/modules/workflows/api/definitions/[id]/callers/route.ts +95 -0
- package/src/modules/workflows/api/definitions/[id]/context-schema/route.ts +187 -0
- package/src/modules/workflows/api/definitions/[id]/customize/route.ts +6 -1
- package/src/modules/workflows/api/definitions/[id]/draft/route.ts +395 -0
- package/src/modules/workflows/api/definitions/[id]/publish/route.ts +250 -0
- package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +5 -0
- package/src/modules/workflows/api/definitions/[id]/route.ts +107 -7
- package/src/modules/workflows/api/definitions/[id]/test-step/route.ts +288 -0
- package/src/modules/workflows/api/definitions/generate/route.ts +335 -0
- package/src/modules/workflows/api/definitions/route.ts +88 -113
- package/src/modules/workflows/api/definitions/serialize.ts +9 -0
- package/src/modules/workflows/api/endpoints/route.ts +88 -0
- package/src/modules/workflows/api/functions/route.ts +91 -0
- package/src/modules/workflows/api/grantable-features/route.ts +102 -0
- package/src/modules/workflows/api/instances/[id]/context/route.ts +214 -0
- package/src/modules/workflows/api/instances/[id]/rerun-step/route.ts +226 -0
- package/src/modules/workflows/api/instances/[id]/retry/route.ts +18 -2
- package/src/modules/workflows/api/instances/[id]/step-through/route.ts +195 -0
- package/src/modules/workflows/api/instances/[id]/steps/route.ts +160 -0
- package/src/modules/workflows/api/instances/[id]/would-do/route.ts +216 -0
- package/src/modules/workflows/api/instances/bulk-replay/route.ts +141 -0
- package/src/modules/workflows/api/instances/failure-queue/route.ts +197 -0
- package/src/modules/workflows/api/instances/route.ts +135 -3
- package/src/modules/workflows/api/metrics/definitions/route.ts +262 -0
- package/src/modules/workflows/api/openapi.ts +549 -2
- package/src/modules/workflows/api/portal/tasks/[id]/complete/route.ts +160 -0
- package/src/modules/workflows/api/portal/tasks/[id]/route.ts +124 -0
- package/src/modules/workflows/api/portal/tasks/route.ts +157 -0
- package/src/modules/workflows/api/rule-usage/route.ts +94 -0
- package/src/modules/workflows/api/task-settings/route.ts +138 -0
- package/src/modules/workflows/api/tasks/[id]/claim/route.ts +42 -17
- package/src/modules/workflows/api/tasks/[id]/complete/route.ts +47 -15
- package/src/modules/workflows/api/tasks/[id]/reassign/route.ts +197 -0
- package/src/modules/workflows/api/tasks/[id]/route.ts +57 -6
- package/src/modules/workflows/api/tasks/[id]/unclaim/route.ts +132 -0
- package/src/modules/workflows/api/tasks/route.ts +60 -5
- package/src/modules/workflows/api/tasks/serialize.ts +119 -0
- package/src/modules/workflows/api/templates/route.ts +87 -0
- package/src/modules/workflows/api/work-inbox/next/route.ts +170 -0
- package/src/modules/workflows/api/work-inbox/route.ts +153 -0
- package/src/modules/workflows/backend/config/workflows/page.meta.ts +33 -0
- package/src/modules/workflows/backend/config/workflows/page.tsx +12 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +19 -343
- package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/create/page.tsx +19 -59
- package/src/modules/workflows/backend/definitions/page.tsx +156 -76
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +3129 -584
- package/src/modules/workflows/backend/instances/[id]/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/[id]/page.tsx +711 -539
- package/src/modules/workflows/backend/instances/failure-queue/page.meta.ts +16 -0
- package/src/modules/workflows/backend/instances/failure-queue/page.tsx +311 -0
- package/src/modules/workflows/backend/instances/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/page.tsx +218 -38
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +639 -400
- package/src/modules/workflows/backend/tasks/page.meta.ts +7 -0
- package/src/modules/workflows/backend/tasks/page.tsx +20 -333
- package/src/modules/workflows/backend/work-inbox/page.meta.ts +15 -0
- package/src/modules/workflows/backend/work-inbox/page.tsx +506 -0
- package/src/modules/workflows/cli.ts +1 -1
- package/src/modules/workflows/commands/tasks.ts +146 -0
- package/src/modules/workflows/components/ActivitiesEditor.tsx +91 -114
- package/src/modules/workflows/components/ActivityEditDialog.tsx +244 -0
- package/src/modules/workflows/components/AgentSelector.tsx +200 -0
- package/src/modules/workflows/components/AnnotationEditDialog.tsx +157 -0
- package/src/modules/workflows/components/BusinessRuleUsagePanel.tsx +106 -0
- package/src/modules/workflows/components/BusinessRulesSelector.tsx +71 -17
- package/src/modules/workflows/components/ConfigJsonTextarea.tsx +111 -0
- package/src/modules/workflows/components/ContextSchemaEditor.tsx +165 -0
- package/src/modules/workflows/components/DefinitionErrorHandlerField.tsx +133 -0
- package/src/modules/workflows/components/DefinitionMetadataDrawer.tsx +456 -0
- package/src/modules/workflows/components/DefinitionMetricsCells.tsx +212 -0
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +196 -95
- package/src/modules/workflows/components/EdgeEditDialog.tsx +15 -16
- package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +130 -80
- package/src/modules/workflows/components/InputDataPanel.tsx +177 -0
- package/src/modules/workflows/components/InspectorPanel.tsx +250 -0
- package/src/modules/workflows/components/NodeEditDialog.tsx +444 -38
- package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +848 -178
- package/src/modules/workflows/components/StepsEditor.tsx +9 -2
- package/src/modules/workflows/components/TemplateGalleryDialog.tsx +205 -0
- package/src/modules/workflows/components/TransitionsEditor.tsx +98 -89
- package/src/modules/workflows/components/TriggersDialog.tsx +83 -0
- package/src/modules/workflows/components/TriggersEditor.tsx +363 -0
- package/src/modules/workflows/components/WorkflowAiDraftDialog.tsx +383 -0
- package/src/modules/workflows/components/WorkflowCodeView.tsx +257 -0
- package/src/modules/workflows/components/WorkflowCommandPalette.tsx +82 -0
- package/src/modules/workflows/components/WorkflowCompensationGhostEdge.tsx +78 -0
- package/src/modules/workflows/components/WorkflowDataMappingEdge.tsx +46 -0
- package/src/modules/workflows/components/WorkflowGraph.tsx +54 -1
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +463 -37
- package/src/modules/workflows/components/WorkflowIconPicker.tsx +144 -0
- package/src/modules/workflows/components/WorkflowLegend.tsx +59 -33
- package/src/modules/workflows/components/WorkflowNodeCard.tsx +355 -28
- package/src/modules/workflows/components/WorkflowRouteChips.tsx +145 -0
- package/src/modules/workflows/components/WorkflowSelector.tsx +33 -14
- package/src/modules/workflows/components/WorkflowTransitionEdge.tsx +83 -10
- package/src/modules/workflows/components/WorkflowTransitionLabel.tsx +13 -2
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +120 -30
- package/src/modules/workflows/components/fields/ActivityConfigFields.tsx +675 -0
- package/src/modules/workflows/components/fields/ActivityTestPanel.tsx +250 -0
- package/src/modules/workflows/components/fields/AgentInvokeConfigField.tsx +580 -0
- package/src/modules/workflows/components/fields/AgentReviewOnBreachField.tsx +88 -0
- package/src/modules/workflows/components/fields/BranchingRoutesEditor.tsx +323 -0
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +36 -4
- package/src/modules/workflows/components/fields/CommandPicker.tsx +158 -0
- package/src/modules/workflows/components/fields/EndpointPicker.tsx +330 -0
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/FunctionPicker.tsx +68 -0
- package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +46 -12
- package/src/modules/workflows/components/fields/PortFieldArrayEditor.tsx +255 -0
- package/src/modules/workflows/components/fields/RolesMultiSelect.tsx +68 -0
- package/src/modules/workflows/components/fields/RouteOrderEditor.tsx +169 -0
- package/src/modules/workflows/components/fields/SchemaBuilderDialog.tsx +139 -0
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/TaskAssignmentField.tsx +355 -0
- package/src/modules/workflows/components/fields/TaskDeadlineFields.tsx +172 -0
- package/src/modules/workflows/components/fields/TaskDecisionsField.tsx +294 -0
- package/src/modules/workflows/components/fields/TaskEntityBindingsField.tsx +156 -0
- package/src/modules/workflows/components/fields/TemplateTextControl.tsx +85 -0
- package/src/modules/workflows/components/fields/VariablePickerButton.tsx +177 -0
- package/src/modules/workflows/components/fields/ledgerDropTarget.ts +55 -0
- package/src/modules/workflows/components/fields/useActivityTypeOptions.ts +19 -0
- package/src/modules/workflows/components/formConfig.tsx +84 -10
- package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +5 -0
- package/src/modules/workflows/components/mobile/MobileMetadataSheet.tsx +10 -0
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +55 -19
- package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +49 -40
- package/src/modules/workflows/components/nodes/AnnotationGroupNode.tsx +81 -0
- package/src/modules/workflows/components/nodes/AutomatedNode.tsx +34 -17
- package/src/modules/workflows/components/nodes/EndNode.tsx +15 -14
- package/src/modules/workflows/components/nodes/ErrorOutputHandle.tsx +32 -0
- package/src/modules/workflows/components/nodes/IfElseNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/InvokeAgentNode.tsx +180 -0
- package/src/modules/workflows/components/nodes/NodeOutcomeRows.tsx +143 -0
- package/src/modules/workflows/components/nodes/ParallelForkNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/ParallelJoinNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/StartNode.tsx +78 -18
- package/src/modules/workflows/components/nodes/StickyNoteNode.tsx +65 -0
- package/src/modules/workflows/components/nodes/SubWorkflowNode.tsx +124 -23
- package/src/modules/workflows/components/nodes/SwitchNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/TriggerCap.tsx +103 -0
- package/src/modules/workflows/components/nodes/TriggerNode.tsx +151 -0
- package/src/modules/workflows/components/nodes/UserTaskNode.tsx +67 -22
- package/src/modules/workflows/components/nodes/WaitForConditionNode.tsx +74 -0
- package/src/modules/workflows/components/nodes/WaitForSignalNode.tsx +31 -17
- package/src/modules/workflows/components/nodes/WaitForTimerNode.tsx +31 -16
- package/src/modules/workflows/components/nodes/index.ts +17 -0
- package/src/modules/workflows/components/portal/PortalTaskForm.tsx +280 -0
- package/src/modules/workflows/components/run/AgentActivityPanel.tsx +48 -0
- package/src/modules/workflows/components/run/RerunStepDialog.tsx +133 -0
- package/src/modules/workflows/components/run/RunEventBadge.tsx +37 -0
- package/src/modules/workflows/components/run/RunGantt.tsx +180 -0
- package/src/modules/workflows/components/run/RunStatusBadge.tsx +112 -0
- package/src/modules/workflows/components/run/RunStepInspector.tsx +176 -0
- package/src/modules/workflows/components/run/WouldDoReport.tsx +93 -0
- package/src/modules/workflows/components/run/useAgentLabels.ts +42 -0
- package/src/modules/workflows/components/run/useLastRunOverlay.ts +150 -0
- package/src/modules/workflows/components/run/useLiveAgentActions.ts +70 -0
- package/src/modules/workflows/components/run/useLiveRunUpdates.ts +89 -0
- package/src/modules/workflows/components/settings/CommandSettingsPageClient.tsx +228 -0
- package/src/modules/workflows/components/work-inbox/EntityContextPanel.tsx +179 -0
- package/src/modules/workflows/components/work-inbox/ReassignTaskDialog.tsx +203 -0
- package/src/modules/workflows/components/work-inbox/StatusChip.tsx +61 -0
- package/src/modules/workflows/components/work-inbox/TaskActionNotice.tsx +77 -0
- package/src/modules/workflows/components/work-inbox/TaskFormFields.tsx +322 -0
- package/src/modules/workflows/components/work-inbox/WorkInboxEmptyState.tsx +43 -0
- package/src/modules/workflows/data/activity-config-schemas.ts +249 -0
- package/src/modules/workflows/data/activity-config-warnings.ts +71 -0
- package/src/modules/workflows/data/branching-route-warnings.ts +129 -0
- package/src/modules/workflows/data/entities.ts +397 -4
- package/src/modules/workflows/data/metrics-validators.ts +51 -0
- package/src/modules/workflows/data/task-primitives.ts +36 -0
- package/src/modules/workflows/data/types.ts +81 -2
- package/src/modules/workflows/data/validators.ts +729 -60
- package/src/modules/workflows/di.ts +22 -0
- package/src/modules/workflows/events.ts +68 -8
- package/src/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/src/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/src/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/src/modules/workflows/examples/templates/order-approval.json +230 -0
- package/src/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/src/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/src/modules/workflows/extension-points.ts +1 -1
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.ts +21 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.tsx +212 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.ts +25 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.tsx +185 -0
- package/src/modules/workflows/i18n/de.json +1083 -24
- package/src/modules/workflows/i18n/en.json +1081 -22
- package/src/modules/workflows/i18n/es.json +1083 -24
- package/src/modules/workflows/i18n/ko.json +1072 -13
- package/src/modules/workflows/i18n/pl.json +1082 -23
- package/src/modules/workflows/lib/activity-executor.ts +855 -186
- package/src/modules/workflows/lib/activity-queue-types.ts +120 -1
- package/src/modules/workflows/lib/activity-registry-bootstrap.ts +7 -0
- package/src/modules/workflows/lib/activity-registry.ts +89 -0
- package/src/modules/workflows/lib/activity-types.ts +415 -0
- package/src/modules/workflows/lib/activity-worker-handler.ts +744 -35
- package/src/modules/workflows/lib/advanced-config.ts +41 -0
- package/src/modules/workflows/lib/agent-disposition-task.ts +343 -0
- package/src/modules/workflows/lib/agent-outcome-paths.ts +153 -0
- package/src/modules/workflows/lib/agent-result-mapping.ts +88 -0
- package/src/modules/workflows/lib/agent-review-inspector.ts +125 -0
- package/src/modules/workflows/lib/agent-review.ts +171 -0
- package/src/modules/workflows/lib/ai-authoring.ts +402 -0
- package/src/modules/workflows/lib/ai-draft-runner.ts +105 -0
- package/src/modules/workflows/lib/annotation-events.ts +15 -0
- package/src/modules/workflows/lib/branching-routes.ts +280 -0
- package/src/modules/workflows/lib/breach-routing.ts +142 -0
- package/src/modules/workflows/lib/bulk-replay.ts +185 -0
- package/src/modules/workflows/lib/business-rule-usage.ts +154 -0
- package/src/modules/workflows/lib/caller-graph.ts +104 -0
- package/src/modules/workflows/lib/code-view-apply.ts +178 -0
- package/src/modules/workflows/lib/collect-validation-issues.ts +239 -0
- package/src/modules/workflows/lib/compensation-ghosts.ts +134 -0
- package/src/modules/workflows/lib/component-guard.ts +13 -0
- package/src/modules/workflows/lib/condition-handler.ts +658 -0
- package/src/modules/workflows/lib/context-ledger.ts +814 -0
- package/src/modules/workflows/lib/crud-form-dialogs-flag.ts +5 -0
- package/src/modules/workflows/lib/data-edge-mapping.ts +112 -0
- package/src/modules/workflows/lib/definition-context-schema.ts +103 -0
- package/src/modules/workflows/lib/definition-edit-safety.ts +228 -0
- package/src/modules/workflows/lib/definition-error-body.ts +43 -0
- package/src/modules/workflows/lib/definition-evaluation.ts +156 -0
- package/src/modules/workflows/lib/definition-grant.ts +211 -0
- package/src/modules/workflows/lib/definition-json-locations.ts +226 -0
- package/src/modules/workflows/lib/definition-payload.ts +81 -0
- package/src/modules/workflows/lib/draft-restore.ts +72 -0
- package/src/modules/workflows/lib/dry-run.ts +203 -0
- package/src/modules/workflows/lib/duration.ts +138 -24
- package/src/modules/workflows/lib/edge-reattachment.ts +186 -0
- package/src/modules/workflows/lib/edgeFormTransforms.ts +15 -14
- package/src/modules/workflows/lib/editor-annotations.ts +301 -0
- package/src/modules/workflows/lib/editor-commands.ts +205 -0
- package/src/modules/workflows/lib/editor-history.ts +151 -0
- package/src/modules/workflows/lib/endpoint-catalog.ts +283 -0
- package/src/modules/workflows/lib/endpoint-path.ts +134 -0
- package/src/modules/workflows/lib/engine-version.ts +67 -0
- package/src/modules/workflows/lib/error-handler.ts +192 -0
- package/src/modules/workflows/lib/error-routing.ts +236 -0
- package/src/modules/workflows/lib/event-logger.ts +27 -0
- package/src/modules/workflows/lib/expression-refs.ts +291 -0
- package/src/modules/workflows/lib/failure-grouping.ts +134 -0
- package/src/modules/workflows/lib/find-definition.ts +4 -0
- package/src/modules/workflows/lib/flow-logic-warnings.ts +591 -0
- package/src/modules/workflows/lib/graph-utils.ts +620 -110
- package/src/modules/workflows/lib/icon-search.ts +65 -0
- package/src/modules/workflows/lib/insert-at-cursor.ts +53 -0
- package/src/modules/workflows/lib/instance-date-filter.ts +56 -0
- package/src/modules/workflows/lib/interpolation-pipeline.ts +351 -0
- package/src/modules/workflows/lib/ledger-drag.ts +61 -0
- package/src/modules/workflows/lib/ledger-entry-display.ts +89 -0
- package/src/modules/workflows/lib/ledger-schema-flatten.ts +137 -0
- package/src/modules/workflows/lib/metrics/definition-metrics.ts +268 -0
- package/src/modules/workflows/lib/metrics/metrics-display.ts +57 -0
- package/src/modules/workflows/lib/metrics/rollup-schedule.ts +26 -0
- package/src/modules/workflows/lib/metrics/rollup-service.ts +292 -0
- package/src/modules/workflows/lib/node-config-summary.ts +235 -0
- package/src/modules/workflows/lib/node-geometry.ts +168 -0
- package/src/modules/workflows/lib/node-nudge.ts +63 -0
- package/src/modules/workflows/lib/node-outcome-rows.ts +195 -0
- package/src/modules/workflows/lib/node-placement.ts +104 -0
- package/src/modules/workflows/lib/node-type-icons.ts +71 -10
- package/src/modules/workflows/lib/nodeFormTransforms.ts +519 -28
- package/src/modules/workflows/lib/outcome-routing.ts +346 -0
- package/src/modules/workflows/lib/owned-definition.ts +188 -0
- package/src/modules/workflows/lib/owned-node-changes.ts +29 -0
- package/src/modules/workflows/lib/palette-drag.ts +68 -0
- package/src/modules/workflows/lib/palette-drop.ts +114 -0
- package/src/modules/workflows/lib/parallel-handler.ts +79 -2
- package/src/modules/workflows/lib/port-contract.ts +107 -0
- package/src/modules/workflows/lib/portal-task-access.ts +220 -0
- package/src/modules/workflows/lib/rerun-from-step.ts +140 -0
- package/src/modules/workflows/lib/route-chip-events.ts +45 -0
- package/src/modules/workflows/lib/route-chips.ts +177 -0
- package/src/modules/workflows/lib/route-edge.ts +57 -0
- package/src/modules/workflows/lib/route-kinds.ts +166 -0
- package/src/modules/workflows/lib/route-priority.ts +197 -0
- package/src/modules/workflows/lib/run-duration.ts +70 -0
- package/src/modules/workflows/lib/run-event-tone.ts +46 -0
- package/src/modules/workflows/lib/run-execution.ts +598 -0
- package/src/modules/workflows/lib/run-gantt.ts +311 -0
- package/src/modules/workflows/lib/run-outcome-evidence.ts +60 -0
- package/src/modules/workflows/lib/run-outcome.ts +142 -0
- package/src/modules/workflows/lib/sample-resolver.ts +113 -0
- package/src/modules/workflows/lib/seeds.ts +3 -1
- package/src/modules/workflows/lib/server-output-contract.ts +120 -0
- package/src/modules/workflows/lib/set-variable.ts +94 -0
- package/src/modules/workflows/lib/signal-handler.ts +134 -4
- package/src/modules/workflows/lib/start-fixtures.ts +93 -0
- package/src/modules/workflows/lib/status-colors.ts +220 -21
- package/src/modules/workflows/lib/step-handler.ts +744 -68
- package/src/modules/workflows/lib/step-presentation.ts +295 -0
- package/src/modules/workflows/lib/step-through.ts +71 -0
- package/src/modules/workflows/lib/step-type-conversion.ts +263 -0
- package/src/modules/workflows/lib/subgraph-clipboard.ts +214 -0
- package/src/modules/workflows/lib/task-decision-context.ts +76 -0
- package/src/modules/workflows/lib/task-decisions.ts +117 -0
- package/src/modules/workflows/lib/task-entity-access.ts +181 -0
- package/src/modules/workflows/lib/task-entity-aliases.ts +77 -0
- package/src/modules/workflows/lib/task-entity-types.ts +66 -0
- package/src/modules/workflows/lib/task-form-registry.ts +123 -0
- package/src/modules/workflows/lib/task-form-schema.ts +129 -0
- package/src/modules/workflows/lib/task-handler.ts +492 -51
- package/src/modules/workflows/lib/task-inspector-config.ts +348 -0
- package/src/modules/workflows/lib/task-list-query.ts +46 -0
- package/src/modules/workflows/lib/task-notifications.ts +218 -0
- package/src/modules/workflows/lib/task-permission-settings.ts +117 -0
- package/src/modules/workflows/lib/task-presets.ts +95 -0
- package/src/modules/workflows/lib/task-quick-action.ts +111 -0
- package/src/modules/workflows/lib/task-resolution.ts +270 -0
- package/src/modules/workflows/lib/task-sla.ts +628 -0
- package/src/modules/workflows/lib/task-visibility-request.ts +668 -0
- package/src/modules/workflows/lib/task-visibility.ts +627 -0
- package/src/modules/workflows/lib/timer-handler.ts +8 -1
- package/src/modules/workflows/lib/transition-handler.ts +228 -20
- package/src/modules/workflows/lib/trigger-node.ts +272 -0
- package/src/modules/workflows/lib/visual-editor-navigation.ts +29 -0
- package/src/modules/workflows/lib/work-inbox/empty-state.ts +150 -0
- package/src/modules/workflows/lib/work-inbox/entity-links.ts +99 -0
- package/src/modules/workflows/lib/work-inbox/navigation.ts +28 -0
- package/src/modules/workflows/lib/work-inbox/presentation.ts +163 -0
- package/src/modules/workflows/lib/work-inbox/provider.ts +390 -0
- package/src/modules/workflows/lib/work-inbox/query.ts +103 -0
- package/src/modules/workflows/lib/work-inbox/service.ts +122 -0
- package/src/modules/workflows/lib/work-inbox/user-task-source.ts +240 -0
- package/src/modules/workflows/lib/workflow-command-enablement.ts +188 -0
- package/src/modules/workflows/lib/workflow-command-settings.ts +124 -0
- package/src/modules/workflows/lib/workflow-executor.ts +1036 -10
- package/src/modules/workflows/lib/workflow-function-registry.ts +44 -0
- package/src/modules/workflows/lib/workflow-safe-commands.ts +42 -1
- package/src/modules/workflows/lib/workflow-templates.ts +91 -0
- package/src/modules/workflows/migrations/.snapshot-open-mercato.json +2321 -698
- package/src/modules/workflows/migrations/Migration20260626214855_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260626222424_workflows.ts +17 -0
- package/src/modules/workflows/migrations/Migration20260727074335_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260728104038_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260728163001_workflows.ts +36 -0
- package/src/modules/workflows/migrations/Migration20260729061736_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260729192652_workflows.ts +11 -0
- package/src/modules/workflows/migrations/Migration20260730085000_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260730092706_workflows.ts +13 -0
- package/src/modules/workflows/notifications.ts +40 -10
- package/src/modules/workflows/setup.ts +128 -0
- package/src/modules/workflows/subscribers/task-assigned-notification.ts +36 -45
- package/src/modules/workflows/subscribers/task-deadline-breached-notification.ts +31 -0
- package/src/modules/workflows/subscribers/task-reminder-notification.ts +31 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.client.tsx +119 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.ts +27 -0
- package/src/modules/workflows/widgets/injection-table.ts +52 -2
- package/src/modules/workflows/workers/workflow-activities.worker.ts +95 -42
- package/src/modules/workflows/workers/workflow-definition-metric-rollup.worker.ts +71 -0
- package/src/modules/workflows/workers/workflow-instance-bulk-replay.ts +51 -0
- package/src/modules/workflows/workers/workflow-invoke-agent.worker.ts +72 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/helpers/integration/workflowsFixtures.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, type APIRequestContext } from '@playwright/test';\nimport { apiRequest } from './api';\nimport { expectId, readJsonSafe } from './generalFixtures';\n\nexport function buildMinimalDefinitionPayload(timestamp: number, suffix = '') {\n const id = `qa-wf${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Workflow${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-end',\n fromStepId: 'start',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n };\n}\n\nexport function buildUserTaskDefinitionPayload(timestamp: number) {\n return {\n workflowId: `qa-wf-task-${timestamp}`,\n workflowName: `QA User Task Workflow ${timestamp}`,\n description: 'Workflow with a USER_TASK step for integration testing',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedTo: 'admin',\n formSchema: {\n fields: [\n { name: 'approved', type: 'boolean', required: true },\n { name: 'comments', type: 'string' },\n ],\n },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-review',\n fromStepId: 'start',\n toStepId: 'review',\n trigger: 'auto',\n },\n {\n transitionId: 'review-to-end',\n fromStepId: 'review',\n toStepId: 'end',\n trigger: 'manual',\n },\n ],\n },\n enabled: true,\n };\n}\n\nexport async function createWorkflowDefinitionFixture(\n request: APIRequestContext,\n token: string,\n data: Record<string, unknown>,\n): Promise<string> {\n const response = await apiRequest(request, 'POST', '/api/workflows/definitions', { token, data });\n const body = await readJsonSafe<{ data?: { id?: string } }>(response);\n expect(response.status(), `POST /api/workflows/definitions should return 201 (got ${response.status()}: ${JSON.stringify(body)})`).toBe(201);\n return expectId(body?.data?.id, 'Definition creation response should include data.id');\n}\n\nexport async function deleteWorkflowDefinitionIfExists(\n request: APIRequestContext,\n token: string | null,\n definitionId: string | null,\n): Promise<void> {\n if (!token || !definitionId) return;\n await apiRequest(\n request,\n 'DELETE',\n `/api/workflows/definitions/${encodeURIComponent(definitionId)}`,\n { token },\n ).catch(() => undefined);\n}\n\nexport async function startWorkflowInstanceFixture(\n request: APIRequestContext,\n token: string,\n data: Record<string, unknown>,\n): Promise<string> {\n const response = await apiRequest(request, 'POST', '/api/workflows/instances', { token, data });\n const body = await readJsonSafe<{ data?: { instance?: { id?: string } } }>(response);\n expect(response.status(), `POST /api/workflows/instances should return 201 (got ${response.status()}: ${JSON.stringify(body)})`).toBe(201);\n return expectId(body?.data?.instance?.id, 'Instance start response should include data.instance.id');\n}\n\nexport async function cancelWorkflowInstanceIfExists(\n request: APIRequestContext,\n token: string | null,\n instanceId: string | null,\n): Promise<void> {\n if (!token || !instanceId) return;\n await apiRequest(\n request,\n 'POST',\n `/api/workflows/instances/${encodeURIComponent(instanceId)}/cancel`,\n { token },\n ).catch(() => undefined);\n}\n\n/**\n * Definition with a single USER_TASK queued to a role (not a specific user), so the\n * generated task is claimable. The array form of `assignedTo` is intentional: the step\n * handler stores an array `assignedTo` as `assignedToRoles` (a role queue) and leaves\n * `assignedTo` null \u2014 the precondition `claimUserTask` requires. The post-task transition\n * is `auto` so completing the task advances the instance to END (COMPLETED).\n */\nexport function buildClaimableUserTaskDefinitionPayload(timestamp: number, suffix = '') {\n const id = `qa-wf-claim${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Claimable User Task${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedTo: ['admin'],\n formSchema: {\n properties: {\n approved: { type: 'boolean' },\n comments: { type: 'string' },\n },\n required: ['approved'],\n },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'review', trigger: 'auto' },\n { transitionId: 'review-to-end', fromStepId: 'review', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Definition with a single USER_TASK assigned directly to one user id, so the generated\n * task carries `assignedTo=<userId>` (and is therefore filterable by `assignedTo`/`myTasks`\n * and NOT claimable from a role queue).\n */\nexport function buildAssignedUserTaskDefinitionPayload(timestamp: number, assignedUserId: string, suffix = '') {\n const id = `qa-wf-assigned${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Assigned User Task${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedTo: assignedUserId,\n formSchema: { properties: { approved: { type: 'boolean' } } },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'review', trigger: 'auto' },\n { transitionId: 'review-to-end', fromStepId: 'review', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Definition that pauses at a WAIT_FOR_SIGNAL step until the named signal arrives. The\n * post-signal transition is `auto` so a matching signal resumes the instance to COMPLETED.\n */\nexport function buildSignalDefinitionPayload(timestamp: number, signalName = 'approval', suffix = '') {\n const id = `qa-wf-signal${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Signal Workflow${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'wait', stepName: 'Wait For Signal', stepType: 'WAIT_FOR_SIGNAL', signalConfig: { signalName } },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-wait', fromStepId: 'start', toStepId: 'wait', trigger: 'auto' },\n { transitionId: 'wait-to-end', fromStepId: 'wait', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Linear START \u2192 mid \u2192 END definition whose transitions are all `manual`. The background\n * executor never auto-fires them, so the instance rests at each step (RUNNING) until the\n * `/advance` endpoint moves it on \u2014 the precondition for exercising manual progression.\n */\nexport function buildManualAdvanceDefinitionPayload(timestamp: number, suffix = '') {\n const id = `qa-wf-advance${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Manual Advance Workflow${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'mid', stepName: 'Middle', stepType: 'AUTOMATED' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-mid', fromStepId: 'start', toStepId: 'mid', trigger: 'manual' },\n { transitionId: 'mid-to-end', fromStepId: 'mid', toStepId: 'end', trigger: 'manual' },\n ],\n },\n enabled: true,\n };\n}\n\nexport type WorkflowInstanceSnapshot = {\n id?: string;\n status?: string;\n currentStepId?: string;\n retryCount?: number;\n correlationKey?: string;\n context?: Record<string, unknown>;\n};\n\nexport async function getWorkflowInstanceSnapshot(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n): Promise<WorkflowInstanceSnapshot | null> {\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/instances/${encodeURIComponent(instanceId)}`,\n { token },\n );\n if (response.status() !== 200) return null;\n const body = await readJsonSafe<{ data?: WorkflowInstanceSnapshot }>(response);\n return body?.data ?? null;\n}\n\n/**\n * Polls instance detail until `predicate` holds or the timeout elapses. Required because\n * `POST /api/workflows/instances` runs execution in a background `setImmediate` callback,\n * so the instance reaches its pause/terminal state asynchronously after the 201 response.\n * Returns the last snapshot seen (so callers can assert on a timeout too).\n */\nexport async function pollWorkflowInstance(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n predicate: (instance: WorkflowInstanceSnapshot) => boolean,\n options: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<WorkflowInstanceSnapshot | null> {\n const timeoutMs = options.timeoutMs ?? 8_000;\n const intervalMs = options.intervalMs ?? 250;\n const deadline = Date.now() + timeoutMs;\n let last: WorkflowInstanceSnapshot | null = null;\n for (;;) {\n last = await getWorkflowInstanceSnapshot(request, token, instanceId);\n if (last && predicate(last)) return last;\n if (Date.now() >= deadline) return last;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\nexport type UserTaskSnapshot = {\n id?: string;\n status?: string;\n assignedTo?: string | null;\n assignedToRoles?: string[] | null;\n claimedBy?: string | null;\n completedBy?: string | null;\n completedAt?: string | null;\n workflowInstanceId?: string;\n};\n\nexport async function listWorkflowInstanceTasks(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n): Promise<UserTaskSnapshot[]> {\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/tasks?workflowInstanceId=${encodeURIComponent(instanceId)}`,\n { token },\n );\n if (response.status() !== 200) return [];\n const body = await readJsonSafe<{ data?: UserTaskSnapshot[] }>(response);\n return body?.data ?? [];\n}\n\n/**\n * Polls the task list scoped to `instanceId` until a task in one of `statuses` appears\n * (default PENDING/IN_PROGRESS), accommodating the same background-execution delay.\n */\nexport async function findInstanceUserTask(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n options: { timeoutMs?: number; intervalMs?: number; statuses?: string[] } = {},\n): Promise<UserTaskSnapshot | null> {\n const timeoutMs = options.timeoutMs ?? 8_000;\n const intervalMs = options.intervalMs ?? 250;\n const statuses = options.statuses ?? ['PENDING', 'IN_PROGRESS'];\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const tasks = await listWorkflowInstanceTasks(request, token, instanceId);\n const match = tasks.find((task) => typeof task.status === 'string' && statuses.includes(task.status));\n if (match?.id) return match;\n if (Date.now() >= deadline) return null;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { expect, type APIRequestContext } from '@playwright/test';\nimport { apiRequest } from './api';\nimport { expectId, readJsonSafe } from './generalFixtures';\n\nexport function buildMinimalDefinitionPayload(timestamp: number, suffix = '') {\n const id = `qa-wf${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Workflow${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-end',\n fromStepId: 'start',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n };\n}\n\nexport function buildUserTaskDefinitionPayload(timestamp: number) {\n return {\n workflowId: `qa-wf-task-${timestamp}`,\n workflowName: `QA User Task Workflow ${timestamp}`,\n description: 'Workflow with a USER_TASK step for integration testing',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedTo: 'admin',\n formSchema: {\n fields: [\n { name: 'approved', type: 'boolean', label: 'Approved', required: true },\n { name: 'comments', type: 'string', label: 'Comments' },\n ],\n },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-review',\n fromStepId: 'start',\n toStepId: 'review',\n trigger: 'auto',\n },\n {\n transitionId: 'review-to-end',\n fromStepId: 'review',\n toStepId: 'end',\n trigger: 'manual',\n },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Definition exercising every isolation guarantee a dry run must give\n * (spec section 8.2): it emits an event, mutates an entity, sends an email and\n * raises a USER_TASK. In a real run each of those is a side effect; in a dry\n * run every one must be replaced by its would-do report entry.\n */\nexport function buildDryRunIsolationDefinitionPayload(timestamp: number, suffix = '') {\n return {\n workflowId: `qa-wf-dryrun-${timestamp}${suffix}`,\n workflowName: `QA Dry Run Isolation ${timestamp}${suffix}`,\n description: 'Workflow whose every step has a side effect, for dry-run isolation testing',\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'notify', stepName: 'Notify', stepType: 'AUTOMATED' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedTo: ['admin'],\n formSchema: { fields: [{ name: 'approved', type: 'boolean', label: 'Approved', required: true }] },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-notify',\n fromStepId: 'start',\n toStepId: 'notify',\n trigger: 'auto',\n activities: [\n {\n activityId: 'send-mail',\n activityName: 'sendMail',\n activityType: 'SEND_EMAIL',\n config: { to: 'qa@example.com', subject: 'Dry run isolation probe' },\n },\n {\n activityId: 'emit',\n activityName: 'emitProbe',\n activityType: 'EMIT_EVENT',\n config: { eventName: 'workflows.qa.dry_run_probe', payload: { probe: true } },\n },\n ],\n },\n {\n transitionId: 'notify-to-review',\n fromStepId: 'notify',\n toStepId: 'review',\n trigger: 'auto',\n },\n {\n transitionId: 'review-to-end',\n fromStepId: 'review',\n toStepId: 'end',\n trigger: 'auto',\n },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Definition whose first activity REFUSES simulation (`EXECUTE_FUNCTION` declares\n * `mock: 'refuse'`), so a dry run must stop at that node with an explicit marker\n * rather than following an error route.\n */\nexport function buildDryRunRefusalDefinitionPayload(timestamp: number, suffix = '') {\n return {\n workflowId: `qa-wf-dryrun-refuse-${timestamp}${suffix}`,\n workflowName: `QA Dry Run Refusal ${timestamp}${suffix}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'run', stepName: 'Run', stepType: 'AUTOMATED' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n {\n transitionId: 'start-to-run',\n fromStepId: 'start',\n toStepId: 'run',\n trigger: 'auto',\n activities: [\n {\n activityId: 'custom',\n activityName: 'customFn',\n activityType: 'EXECUTE_FUNCTION',\n config: { functionName: 'qa.noop' },\n },\n ],\n },\n { transitionId: 'run-to-end', fromStepId: 'run', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\nexport async function createWorkflowDefinitionFixture(\n request: APIRequestContext,\n token: string,\n data: Record<string, unknown>,\n): Promise<string> {\n const response = await apiRequest(request, 'POST', '/api/workflows/definitions', { token, data });\n const body = await readJsonSafe<{ data?: { id?: string } }>(response);\n expect(response.status(), `POST /api/workflows/definitions should return 201 (got ${response.status()}: ${JSON.stringify(body)})`).toBe(201);\n return expectId(body?.data?.id, 'Definition creation response should include data.id');\n}\n\nexport async function deleteWorkflowDefinitionIfExists(\n request: APIRequestContext,\n token: string | null,\n definitionId: string | null,\n): Promise<void> {\n if (!token || !definitionId) return;\n await apiRequest(\n request,\n 'DELETE',\n `/api/workflows/definitions/${encodeURIComponent(definitionId)}`,\n { token },\n ).catch(() => undefined);\n}\n\nexport async function startWorkflowInstanceFixture(\n request: APIRequestContext,\n token: string,\n data: Record<string, unknown>,\n): Promise<string> {\n const response = await apiRequest(request, 'POST', '/api/workflows/instances', { token, data });\n const body = await readJsonSafe<{ data?: { instance?: { id?: string } } }>(response);\n expect(response.status(), `POST /api/workflows/instances should return 201 (got ${response.status()}: ${JSON.stringify(body)})`).toBe(201);\n return expectId(body?.data?.instance?.id, 'Instance start response should include data.instance.id');\n}\n\nexport async function cancelWorkflowInstanceIfExists(\n request: APIRequestContext,\n token: string | null,\n instanceId: string | null,\n): Promise<void> {\n if (!token || !instanceId) return;\n await apiRequest(\n request,\n 'POST',\n `/api/workflows/instances/${encodeURIComponent(instanceId)}/cancel`,\n { token },\n ).catch(() => undefined);\n}\n\n/**\n * Definition with a single USER_TASK queued to a role (not a specific user), so the\n * generated task is claimable. The array form of `assignedTo` is intentional: the step\n * handler stores an array `assignedTo` as `assignedToRoles` (a role queue) and leaves\n * `assignedTo` null \u2014 the precondition `claimUserTask` requires. The post-task transition\n * is `auto` so completing the task advances the instance to END (COMPLETED).\n */\nexport function buildClaimableUserTaskDefinitionPayload(timestamp: number, suffix = '') {\n const id = `qa-wf-claim${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Claimable User Task${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedTo: ['admin'],\n formSchema: {\n properties: {\n approved: { type: 'boolean' },\n comments: { type: 'string' },\n },\n required: ['approved'],\n },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'review', trigger: 'auto' },\n { transitionId: 'review-to-end', fromStepId: 'review', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Definition with a single USER_TASK assigned directly to one user id, so the generated\n * task carries `assignedTo=<userId>` (and is therefore filterable by `assignedTo`/`myTasks`\n * and NOT claimable from a role queue).\n */\nexport function buildAssignedUserTaskDefinitionPayload(timestamp: number, assignedUserId: string, suffix = '') {\n const id = `qa-wf-assigned${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Assigned User Task${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedTo: assignedUserId,\n formSchema: { properties: { approved: { type: 'boolean' } } },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'review', trigger: 'auto' },\n { transitionId: 'review-to-end', fromStepId: 'review', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Definition that pauses at a WAIT_FOR_SIGNAL step until the named signal arrives. The\n * post-signal transition is `auto` so a matching signal resumes the instance to COMPLETED.\n */\nexport function buildSignalDefinitionPayload(timestamp: number, signalName = 'approval', suffix = '') {\n const id = `qa-wf-signal${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Signal Workflow${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'wait', stepName: 'Wait For Signal', stepType: 'WAIT_FOR_SIGNAL', signalConfig: { signalName } },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-wait', fromStepId: 'start', toStepId: 'wait', trigger: 'auto' },\n { transitionId: 'wait-to-end', fromStepId: 'wait', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Linear START \u2192 mid \u2192 END definition whose transitions are all `manual`. The background\n * executor never auto-fires them, so the instance rests at each step (RUNNING) until the\n * `/advance` endpoint moves it on \u2014 the precondition for exercising manual progression.\n */\nexport function buildManualAdvanceDefinitionPayload(timestamp: number, suffix = '') {\n const id = `qa-wf-advance${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Manual Advance Workflow${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'mid', stepName: 'Middle', stepType: 'AUTOMATED' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-mid', fromStepId: 'start', toStepId: 'mid', trigger: 'manual' },\n { transitionId: 'mid-to-end', fromStepId: 'mid', toStepId: 'end', trigger: 'manual' },\n ],\n },\n enabled: true,\n };\n}\n\nexport type WorkflowInstanceSnapshot = {\n id?: string;\n status?: string;\n currentStepId?: string;\n retryCount?: number;\n correlationKey?: string;\n context?: Record<string, unknown>;\n};\n\nexport async function getWorkflowInstanceSnapshot(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n): Promise<WorkflowInstanceSnapshot | null> {\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/instances/${encodeURIComponent(instanceId)}`,\n { token },\n );\n if (response.status() !== 200) return null;\n const body = await readJsonSafe<{ data?: WorkflowInstanceSnapshot }>(response);\n return body?.data ?? null;\n}\n\n/**\n * Polls instance detail until `predicate` holds or the timeout elapses. Required because\n * `POST /api/workflows/instances` runs execution in a background `setImmediate` callback,\n * so the instance reaches its pause/terminal state asynchronously after the 201 response.\n *\n * An elapsed budget THROWS by default, naming the last status/step it saw. Returning the\n * last snapshot instead turned every engine timeout in this suite into a downstream value\n * mismatch (\"expected COMPLETED, received PAUSED\") that reads like a routing bug, so the\n * one failure mode a poll actually has was the one it never reported.\n *\n * `onTimeout: 'returnLast'` keeps the old behaviour for the callers that use the budget as\n * a deliberate STALL DETECTOR and have a fallback to run.\n */\nexport async function pollWorkflowInstance(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n predicate: (instance: WorkflowInstanceSnapshot) => boolean,\n options: { timeoutMs?: number; intervalMs?: number; onTimeout?: 'throw' | 'returnLast' } = {},\n): Promise<WorkflowInstanceSnapshot | null> {\n const timeoutMs = options.timeoutMs ?? 8_000;\n const intervalMs = options.intervalMs ?? 250;\n const onTimeout = options.onTimeout ?? 'throw';\n const deadline = Date.now() + timeoutMs;\n let last: WorkflowInstanceSnapshot | null = null;\n for (;;) {\n last = await getWorkflowInstanceSnapshot(request, token, instanceId);\n if (last && predicate(last)) return last;\n if (Date.now() >= deadline) {\n if (onTimeout === 'returnLast') return last;\n const seen = last\n ? `status=${last.status} currentStepId=${last.currentStepId ?? 'null'}`\n : 'the instance was never readable';\n throw new Error(\n `[internal] pollWorkflowInstance: instance ${instanceId} did not satisfy the predicate within ${timeoutMs}ms (last seen: ${seen})`,\n );\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * Single-USER_TASK definition whose `userTaskConfig` is supplied verbatim by the caller.\n *\n * The Phase-4a task inspector vocabulary (`priority`, `deadline`, `entityBindings`,\n * `assignedToRoles`, `formKey`, `allowedActions`, `instructions`) is all optional and all\n * additive, so a builder per combination would multiply without end. This one takes the\n * config as-is, which also makes it the honest fixture for the A1 regression: what the test\n * posts is exactly what the definition endpoint is asked to persist.\n */\nexport function buildInspectorUserTaskDefinitionPayload(\n timestamp: number,\n options: {\n suffix?: string;\n userTaskConfig?: Record<string, unknown>;\n /** `auto` resumes the instance to END on completion; `manual` leaves it parked. */\n postTaskTrigger?: 'auto' | 'manual';\n stepName?: string;\n } = {},\n) {\n const suffix = options.suffix ?? '';\n const id = `qa-wf-inspector${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Inspector User Task${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: options.stepName ?? 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: options.userTaskConfig ?? {\n assignedToRoles: ['admin'],\n formSchema: { properties: { approved: { type: 'boolean' } } },\n },\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'review', trigger: 'auto' },\n {\n transitionId: 'review-to-end',\n fromStepId: 'review',\n toStepId: 'end',\n trigger: options.postTaskTrigger ?? 'auto',\n },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * USER_TASK with two decision buttons, each bound 1:1 to its own outgoing route ending at a\n * DIFFERENT END step \u2014 so the step the instance finishes on proves which route was taken.\n *\n * Both routes are `manual` on purpose: completion without a decision then finds no `auto`\n * transition and leaves the instance parked, which makes \"the decision selected the route\"\n * an assertion rather than a coincidence of route order.\n */\nexport function buildDecisionUserTaskDefinitionPayload(timestamp: number, suffix = '') {\n const id = `qa-wf-decision${suffix}-${timestamp}`;\n return {\n workflowId: id,\n workflowName: `QA Decision User Task${suffix} ${timestamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedToRoles: ['admin'],\n formSchema: { properties: { comments: { type: 'string' } } },\n decisions: [\n { id: 'approve', label: 'Approve', transitionId: 'review-to-approved', style: 'primary' },\n { id: 'reject', label: 'Reject', transitionId: 'review-to-rejected', style: 'destructive' },\n ],\n },\n },\n { stepId: 'approved', stepName: 'Approved', stepType: 'END' },\n { stepId: 'rejected', stepName: 'Rejected', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'review', trigger: 'auto' },\n { transitionId: 'review-to-approved', fromStepId: 'review', toStepId: 'approved', trigger: 'manual' },\n { transitionId: 'review-to-rejected', fromStepId: 'review', toStepId: 'rejected', trigger: 'manual' },\n ],\n },\n enabled: true,\n };\n}\n\nexport type UserTaskSnapshot = {\n id?: string;\n status?: string;\n assignedTo?: string | null;\n assignedToRoles?: string[] | null;\n claimedBy?: string | null;\n completedBy?: string | null;\n completedAt?: string | null;\n workflowInstanceId?: string;\n formData?: Record<string, unknown> | null;\n priority?: string | number | null;\n entityBindings?: unknown[] | null;\n dueDate?: string | null;\n /** SLA escalation bookkeeping (`api/tasks/serialize.ts`). */\n escalatedAt?: string | null;\n escalatedTo?: string | null;\n reassignedAt?: string | null;\n reassignReason?: string | null;\n};\n\n/** Task detail adds the DERIVED fields the list cannot carry (see `api/tasks/[id]/route.ts`). */\nexport type UserTaskDetail = UserTaskSnapshot & {\n stepId?: string | null;\n formKey?: string | null;\n decisions?: Array<{ id: string; label: string; transitionId: string; style?: string }>;\n};\n\nexport async function getUserTaskDetail(\n request: APIRequestContext,\n token: string,\n taskId: string,\n): Promise<UserTaskDetail | null> {\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/tasks/${encodeURIComponent(taskId)}`,\n { token },\n );\n if (response.status() !== 200) return null;\n const body = await readJsonSafe<{ data?: UserTaskDetail }>(response);\n return body?.data ?? null;\n}\n\n/**\n * One work-inbox row on the wire: the common projection plus the provider payload flattened\n * underneath it (`serializeWorkInboxRow`), which is what keeps a `user_task` row a strict\n * superset of a `GET /api/workflows/tasks` row.\n */\nexport type WorkInboxRowSnapshot = {\n id?: string;\n kind?: string;\n moduleId?: string;\n title?: string;\n status?: string;\n priority?: string | null;\n dueDate?: string | null;\n overdue?: boolean;\n assignedTo?: string | null;\n assignedToRoles?: string[] | null;\n claimedBy?: string | null;\n entityTypes?: string[];\n entityBindings?: Array<{ entityType?: string; entityId?: string; label?: string | null }>;\n detailHref?: string | null;\n actions?: Array<{ id?: string; labelKey?: string; endpoint?: string; appliesTo?: string }>;\n proposalId?: string | null;\n};\n\nexport type WorkInboxListBody = {\n data?: WorkInboxRowSnapshot[];\n pagination?: { total?: number; limit?: number; offset?: number; hasMore?: boolean };\n meta?: { kinds?: string[]; degradedKinds?: string[] };\n};\n\nexport async function listWorkInbox(\n request: APIRequestContext,\n token: string,\n query: string,\n): Promise<WorkInboxListBody | null> {\n const response = await apiRequest(request, 'GET', `/api/workflows/work-inbox${query}`, { token });\n expect(response.status(), `GET /api/workflows/work-inbox${query} should return 200`).toBe(200);\n return readJsonSafe<WorkInboxListBody>(response);\n}\n\n/**\n * Polls the work inbox until `predicate` holds. Tasks are created by the background executor\n * after the instance-start response, so the inbox is eventually \u2014 not immediately \u2014 populated.\n */\nexport async function pollWorkInbox(\n request: APIRequestContext,\n token: string,\n query: string,\n predicate: (body: WorkInboxListBody) => boolean,\n options: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<WorkInboxListBody | null> {\n const timeoutMs = options.timeoutMs ?? 8_000;\n const intervalMs = options.intervalMs ?? 250;\n const deadline = Date.now() + timeoutMs;\n let last: WorkInboxListBody | null = null;\n for (;;) {\n last = await listWorkInbox(request, token, query);\n if (last && predicate(last)) return last;\n if (Date.now() >= deadline) return last;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\nexport async function listWorkflowInstanceTasks(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n): Promise<UserTaskSnapshot[]> {\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/tasks?workflowInstanceId=${encodeURIComponent(instanceId)}`,\n { token },\n );\n if (response.status() !== 200) return [];\n const body = await readJsonSafe<{ data?: UserTaskSnapshot[] }>(response);\n return body?.data ?? [];\n}\n\n/**\n * Polls the task list scoped to `instanceId` until a task in one of `statuses` appears\n * (default PENDING/IN_PROGRESS), accommodating the same background-execution delay.\n */\nexport async function findInstanceUserTask(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n options: { timeoutMs?: number; intervalMs?: number; statuses?: string[] } = {},\n): Promise<UserTaskSnapshot | null> {\n const timeoutMs = options.timeoutMs ?? 8_000;\n const intervalMs = options.intervalMs ?? 250;\n const statuses = options.statuses ?? ['PENDING', 'IN_PROGRESS'];\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const tasks = await listWorkflowInstanceTasks(request, token, instanceId);\n const match = tasks.find((task) => typeof task.status === 'string' && statuses.includes(task.status));\n if (match?.id) return match;\n if (Date.now() >= deadline) return null;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * Register a run-unique CUSTOM ENTITY so a task may legally be bound to it.\n *\n * Spec \u00A76.4's entity clause (`lib/task-visibility.ts` \u2192 `evaluateEntityClause`)\n * FAILS CLOSED on a binding whose `entityType` resolves to nothing:\n * `resolveTaskEntityAccess` answers `{ kind: 'unknown-entity-type' }` and the task\n * becomes invisible to every principal except a superadmin \u2014 the list route\n * reports it as `diagnostics.entityHidden[].reason = 'denied:unknown-entity-type'`\n * while returning zero rows. A spec that invents an `entityType` purely to scope\n * `?entityType=` against a shared database therefore sees nothing at all.\n *\n * Registering the id as a tenant custom entity makes `classifyRecordsEntity`\n * answer `{ kind: 'custom', restricted: false }`, which requires only\n * `entities.records.view` \u2014 held by `admin` \u2014 so the binding resolves and the\n * scoping trick works while still exercising the real \u00A76.4 path.\n *\n * `entityId` MUST match `^[a-z0-9_]+:[a-z0-9_]+$` (`entityIdRegex`): underscores,\n * never hyphens.\n */\nexport async function registerTaskBindingEntityType(\n request: APIRequestContext,\n token: string,\n entityId: string,\n label?: string,\n): Promise<void> {\n const response = await apiRequest(request, 'POST', '/api/entities/entities', {\n token,\n data: {\n entityId,\n label: label ?? entityId,\n showInSidebar: false,\n accessRestricted: false,\n },\n });\n expect(\n response.status(),\n `POST /api/entities/entities should register ${entityId}, got ${response.status()}`,\n ).toBeLessThan(300);\n}\n\nexport async function deleteTaskBindingEntityTypeIfExists(\n request: APIRequestContext,\n token: string,\n entityId: string | null,\n): Promise<void> {\n if (!entityId) return;\n await apiRequest(request, 'DELETE', '/api/entities/entities', {\n token,\n data: { entityId },\n }).catch(() => undefined);\n}\n\n/**\n * Definition whose \"agent\" step parks on the INVOKE_AGENT proposal-ready signal and\n * declares outcome routes for two of spec \u00A77.2's five disposition kinds.\n *\n * The step parks on a WAIT_FOR_SIGNAL rather than running an agent because the agent\n * runtime lives in `agent_orchestrator`, an OPTIONAL enterprise peer \u2014 `executeInvokeAgent`\n * refuses outright when it is absent, so a fixture that invoked one would only ever run\n * where enterprise is installed. Declaring the INVOKE_AGENT activity is what the engine\n * keys outcome routing off (`signal-handler`'s `isInvokeAgentStep`), so the routing under\n * test is the real path a disposition takes, not a lookalike.\n *\n * Routes out of `agent`: the default `agent -> apply -> end` happy path, plus\n * `rejected -> rejected_end` and `guardrailBlocked -> guardrail_end`.\n */\nexport function buildAgentOutcomeDefinitionPayload(stamp: string, signalName: string) {\n const id = `qa-wf-outcome-${stamp}`;\n return {\n workflowId: id,\n workflowName: `QA Agent Outcome Workflow ${stamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'agent',\n stepName: 'Assess',\n stepType: 'WAIT_FOR_SIGNAL',\n signalConfig: { signalName },\n activities: [\n {\n activityId: 'assess',\n activityName: 'Assess',\n activityType: 'INVOKE_AGENT',\n config: { agentId: 'qa.assessor', input: {}, onResult: { autoApproveThreshold: 0.8 } },\n },\n ],\n },\n { stepId: 'apply', stepName: 'Apply', stepType: 'AUTOMATED' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n { stepId: 'rejected_end', stepName: 'Rejected', stepType: 'END' },\n { stepId: 'guardrail_end', stepName: 'Guardrail Blocked', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-agent', fromStepId: 'start', toStepId: 'agent', trigger: 'auto' },\n { transitionId: 'agent-to-apply', fromStepId: 'agent', toStepId: 'apply', trigger: 'auto' },\n { transitionId: 'apply-to-end', fromStepId: 'apply', toStepId: 'end', trigger: 'auto' },\n {\n transitionId: 'agent-rejected',\n fromStepId: 'agent',\n toStepId: 'rejected_end',\n trigger: 'auto',\n kind: 'outcome',\n outcomeKind: 'rejected',\n },\n {\n transitionId: 'agent-guardrail',\n fromStepId: 'agent',\n toStepId: 'guardrail_end',\n trigger: 'auto',\n kind: 'outcome',\n outcomeKind: 'guardrailBlocked',\n },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Single-USER_TASK definition carrying an SLA-breach route (`kind: 'slaBreach'`).\n *\n * The A.1 regression fixture: `graphToDefinition` used to persist only `kind: 'error'`,\n * so opening a definition like this in the Studio and saving it silently downgraded the\n * breach route to a normal transition and the breach stopped routing \u2014 with no error\n * anywhere. The route must survive a create \u2192 read \u2192 update \u2192 read round trip.\n */\nexport function buildSlaBreachRouteDefinitionPayload(stamp: string) {\n const id = `qa-wf-breach-${stamp}`;\n return {\n workflowId: id,\n workflowName: `QA SLA Breach Route Workflow ${stamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'review',\n stepName: 'Review',\n stepType: 'USER_TASK',\n userTaskConfig: { assignedToRoles: ['admin'], allowedActions: ['complete'] },\n },\n { stepId: 'escalate', stepName: 'Escalate', stepType: 'END' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'review', trigger: 'auto' },\n { transitionId: 'review-to-end', fromStepId: 'review', toStepId: 'end', trigger: 'auto' },\n {\n transitionId: 'review-breach',\n fromStepId: 'review',\n toStepId: 'escalate',\n trigger: 'auto',\n kind: 'slaBreach',\n },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * Linear, fully automated START -> prepare -> finish -> END definition. Every route is\n * `auto` and no step carries an activity, so the start call drives it to COMPLETED\n * synchronously \u2014 which is the precondition for anything that reads a FINISHED run\n * (the Studio's \"Show last run\" overlay, the Gantt, the per-step I/O inspector).\n */\nexport function buildCompletedRunDefinitionPayload(stamp: string, suffix = '') {\n const id = `qa-wf-run${suffix}-${stamp}`;\n return {\n workflowId: id,\n workflowName: `QA Completed Run${suffix} ${stamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'prepare', stepName: 'Prepare', stepType: 'AUTOMATED' },\n { stepId: 'finish', stepName: 'Finish', stepType: 'AUTOMATED' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-prepare', fromStepId: 'start', toStepId: 'prepare', trigger: 'auto' },\n { transitionId: 'prepare-to-finish', fromStepId: 'prepare', toStepId: 'finish', trigger: 'auto' },\n { transitionId: 'finish-to-end', fromStepId: 'finish', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * START -> mid -> boom -> END, where `boom` carries a STEP-level activity that cannot\n * succeed: `EXECUTE_FUNCTION` names a `functionName` that no module registers, so the\n * activity fails on the first attempt with a stable message (`Workflow function \"\u2026\" not\n * registered in DI container`) and no external dependency. The key MUST be `functionName`\n * \u2014 `REQUIRED_ACTIVITY_CONFIG_KEYS` rejects the definition at CREATE time otherwise, so a\n * config declaring `functionId` never reaches a run at all. `mid` reaches COMPLETED\n * before it, which is what makes the run a legal\n * rerun target (spec 8.4 eligibility reads the LATEST attempt of the requested step and\n * requires it to be terminal).\n *\n * `errorDirective: 'failureQueue'` switches the same fixture from \"the instance FAILS\" to\n * \"the instance PARKS with `metadata.attention`\" \u2014 the two halves of the spec 8.4 failure\n * queue, which is a UNION of those states rather than a filter over one of them.\n *\n * The activity is on the STEP, not on the outgoing transition, on purpose: a transition\n * activity attributes the failure to the step the route LEAVES, which would make `mid` the\n * failing step and leave nothing completed behind it.\n */\nexport function buildFailingStepDefinitionPayload(\n stamp: string,\n options: { suffix?: string; errorDirective?: 'fail' | 'continueWithFallback' | 'failureQueue' } = {},\n) {\n const suffix = options.suffix ?? '';\n const id = `qa-wf-fail${suffix}-${stamp}`;\n return {\n workflowId: id,\n workflowName: `QA Failing Step${suffix} ${stamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n { stepId: 'mid', stepName: 'Mid', stepType: 'AUTOMATED' },\n {\n stepId: 'boom',\n stepName: 'Boom',\n stepType: 'AUTOMATED',\n ...(options.errorDirective ? { errorDirective: { mode: options.errorDirective } } : {}),\n activities: [\n {\n activityId: 'boom',\n activityName: 'Boom',\n activityType: 'EXECUTE_FUNCTION',\n config: { functionName: 'qa-nonexistent-function-do-not-register' },\n },\n ],\n },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-mid', fromStepId: 'start', toStepId: 'mid', trigger: 'auto' },\n { transitionId: 'mid-to-boom', fromStepId: 'mid', toStepId: 'boom', trigger: 'auto' },\n { transitionId: 'boom-to-end', fromStepId: 'boom', toStepId: 'end', trigger: 'auto' },\n ],\n },\n enabled: true,\n };\n}\n\n/**\n * A review task whose step is AGENT-SHAPED, carrying a deadline and an authored\n * `onBreach` escalation (spec section 7.5).\n *\n * The step is a `USER_TASK` that ALSO declares an `INVOKE_AGENT` activity, and\n * that combination is deliberate. `applyBreachHandling` (`lib/task-sla.ts`)\n * chooses between the full USER_TASK breach vocabulary and the escalate-only\n * agent-review one STRUCTURALLY \u2014 `isInvokeAgentStepDef` asks only whether the\n * step declares an `INVOKE_AGENT` activity \u2014 so this is the exact input the\n * production disposition path presents, without needing `agent_orchestrator`\n * (an optional enterprise peer) or a real model round trip to write the row.\n * `handleUserTaskStep` reads `userTaskConfig` only, so the declared activity is\n * never executed and the absent peer is never reached.\n *\n * The fixture also asks \u2014 twice, as loudly as a definition can \u2014 for the run to\n * be ROUTED on breach: `userTaskConfig.onBreach = { action: 'route' }` plus a\n * wired `kind: 'slaBreach'` transition to `escalate`. Neither may be honoured on\n * an agent step, and that refusal is the thing under test.\n */\nexport function buildAgentReviewDeadlineDefinitionPayload(\n stamp: string,\n options: {\n suffix?: string;\n deadlineDuration: string;\n onBreach: { action: 'notify' | 'reassign' | 'attention'; reassignTo?: string };\n assignedToRoles?: string[];\n },\n) {\n const suffix = options.suffix ?? '';\n const id = `qa-wf-review${suffix}-${stamp}`;\n return {\n workflowId: id,\n workflowName: `QA Agent Review Deadline${suffix} ${stamp}`,\n description: `Integration test definition ${id}`,\n version: 1,\n definition: {\n steps: [\n { stepId: 'start', stepName: 'Start', stepType: 'START' },\n {\n stepId: 'agent_review',\n stepName: 'Dispose agent proposal',\n stepType: 'USER_TASK',\n userTaskConfig: {\n assignedToRoles: options.assignedToRoles ?? ['admin'],\n allowedActions: ['complete'],\n deadline: { duration: options.deadlineDuration },\n // The USER_TASK vocabulary asking to route. Must be ignored here.\n onBreach: { action: 'route', transitionId: 'review-breach' },\n },\n activities: [\n {\n activityId: 'assess',\n activityName: 'Assess',\n activityType: 'INVOKE_AGENT',\n config: {\n agentId: 'qa.assessor',\n input: {},\n onResult: { autoApproveThreshold: 0.8 },\n review: {\n deadline: { duration: options.deadlineDuration },\n onBreach: options.onBreach,\n },\n },\n },\n ],\n },\n { stepId: 'escalate', stepName: 'Escalate', stepType: 'END' },\n { stepId: 'end', stepName: 'End', stepType: 'END' },\n ],\n transitions: [\n { transitionId: 'start-to-review', fromStepId: 'start', toStepId: 'agent_review', trigger: 'auto' },\n { transitionId: 'review-to-end', fromStepId: 'agent_review', toStepId: 'end', trigger: 'manual' },\n // The breach route the engine must refuse to follow on an agent step.\n {\n transitionId: 'review-breach',\n fromStepId: 'agent_review',\n toStepId: 'escalate',\n trigger: 'auto',\n kind: 'slaBreach',\n },\n ],\n },\n enabled: true,\n };\n}\n\nexport type WorkflowEventSnapshot = {\n id?: string;\n eventType?: string;\n eventData?: Record<string, unknown> | null;\n userId?: string | null;\n occurredAt?: string;\n};\n\n/**\n * Instance event log, optionally narrowed to one event type. The event log is the ONLY\n * audit surface for things that leave no row of their own (a taken transition, a rerun),\n * so a test asserting an audit trail has to read it rather than infer from state.\n */\nexport async function listWorkflowInstanceEvents(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n options: { eventType?: string; limit?: number } = {},\n): Promise<WorkflowEventSnapshot[]> {\n const params = new URLSearchParams({ limit: String(options.limit ?? 100) });\n if (options.eventType) params.set('eventType', options.eventType);\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/instances/${encodeURIComponent(instanceId)}/events?${params.toString()}`,\n { token },\n );\n expect(response.status(), `GET instance events should return 200 (got ${response.status()})`).toBe(200);\n const body = await readJsonSafe<{ data?: WorkflowEventSnapshot[] }>(response);\n return body?.data ?? [];\n}\n\nexport type StepInstanceSnapshot = {\n id?: string;\n stepId?: string;\n stepType?: string;\n status?: string;\n inputData?: Record<string, unknown> | null;\n outputData?: Record<string, unknown> | null;\n errorData?: Record<string, unknown> | null;\n enteredAt?: string | null;\n exitedAt?: string | null;\n executionTimeMs?: number | null;\n retryCount?: number;\n};\n\n/** `GET api/instances/[id]/steps` \u2014 the spec 8.3 read surface for `StepInstance` rows. */\nexport async function listWorkflowInstanceSteps(\n request: APIRequestContext,\n token: string,\n instanceId: string,\n): Promise<StepInstanceSnapshot[]> {\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/instances/${encodeURIComponent(instanceId)}/steps?limit=100`,\n { token },\n );\n expect(response.status(), `GET instance steps should return 200 (got ${response.status()})`).toBe(200);\n const body = await readJsonSafe<{ data?: StepInstanceSnapshot[] }>(response);\n return body?.data ?? [];\n}\n\nexport type FailureQueueGroupSnapshot = {\n key?: string;\n label?: string;\n count?: number;\n workflowIds?: string[];\n instanceIds?: string[];\n};\n\nexport type FailureQueueBody = {\n // `attentionReason` and `outcome` are the two non-status arms of the union:\n // a row can be here because it is parked, or because its verdict says so.\n data?: Array<{\n id?: string;\n status?: string;\n retryCount?: number;\n errorMessage?: string | null;\n attentionReason?: string | null;\n outcome?: string | null;\n }>;\n groups?: FailureQueueGroupSnapshot[];\n grouping?: { scannedCount?: number; scanLimit?: number; truncated?: boolean };\n pagination?: { total?: number; limit?: number; offset?: number; hasMore?: boolean };\n};\n\n/**\n * `GET api/instances/failure-queue` \u2014 the spec 8.4 triage union (attention-parked PLUS\n * FAILED). Shared-database safe by construction: callers must assert on their OWN instance\n * ids, never on the total.\n */\nexport async function getWorkflowFailureQueue(\n request: APIRequestContext,\n token: string,\n query = 'limit=100',\n): Promise<FailureQueueBody | null> {\n const response = await apiRequest(\n request,\n 'GET',\n `/api/workflows/instances/failure-queue?${query}`,\n { token },\n );\n expect(response.status(), `GET failure-queue should return 200 (got ${response.status()})`).toBe(200);\n return readJsonSafe<FailureQueueBody>(response);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { expect } from "@playwright/test";
|
|
2
|
+
const WORKFLOW_TRIGGER_NODE_ID = "__workflow_trigger__";
|
|
3
|
+
const WORKFLOW_TRIGGER_EDGE_ID = "__workflow_trigger_edge__";
|
|
4
|
+
const WORKFLOW_MORE_MENU_LABEL = "More";
|
|
5
|
+
const WORKFLOW_DETAILS_MENU_ITEM_LABEL = "Settings";
|
|
6
|
+
const WORKFLOW_RESET_TO_CODE_MENU_ITEM_LABEL = "Reset to code version";
|
|
7
|
+
const WORKFLOW_CODE_VIEW_MENU_ITEM_LABEL = "Code";
|
|
8
|
+
const WORKFLOW_DETAILS_DRAWER_TITLE = "Workflow details";
|
|
9
|
+
const WORKFLOW_INSPECTOR_SELECTOR = '[data-slot="workflow-inspector"]';
|
|
10
|
+
const WORKFLOW_TRIGGER_CAP_TESTID = "workflow-trigger-cap";
|
|
11
|
+
const WORKFLOW_ADD_TRIGGER_LABEL = "Add Trigger";
|
|
12
|
+
function visualEditorHref(definitionId) {
|
|
13
|
+
return definitionId ? `/backend/definitions/visual-editor?id=${encodeURIComponent(definitionId)}` : "/backend/definitions/visual-editor";
|
|
14
|
+
}
|
|
15
|
+
function workflowStepNodes(page) {
|
|
16
|
+
return page.locator(`.react-flow__node:not([data-id="${WORKFLOW_TRIGGER_NODE_ID}"])`);
|
|
17
|
+
}
|
|
18
|
+
const WORKFLOW_NODE_TITLE_SELECTOR = '[data-slot="workflow-node-title"]';
|
|
19
|
+
function escapeForRegExp(value) {
|
|
20
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
21
|
+
}
|
|
22
|
+
function workflowNodeByTitle(page, title) {
|
|
23
|
+
return workflowStepNodes(page).filter({
|
|
24
|
+
has: page.locator(WORKFLOW_NODE_TITLE_SELECTOR, {
|
|
25
|
+
hasText: new RegExp(`^\\s*${escapeForRegExp(title)}\\s*$`)
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function workflowRouteEdges(page) {
|
|
30
|
+
return page.locator(`.react-flow__edge:not([data-id="${WORKFLOW_TRIGGER_EDGE_ID}"])`);
|
|
31
|
+
}
|
|
32
|
+
function workflowInspector(page) {
|
|
33
|
+
return page.locator(WORKFLOW_INSPECTOR_SELECTOR);
|
|
34
|
+
}
|
|
35
|
+
function workflowDetailsDrawer(page) {
|
|
36
|
+
return page.getByRole("dialog", { name: WORKFLOW_DETAILS_DRAWER_TITLE });
|
|
37
|
+
}
|
|
38
|
+
async function openWorkflowStudio(page, definitionId) {
|
|
39
|
+
await page.goto(visualEditorHref(definitionId));
|
|
40
|
+
await expect(workflowStepNodes(page).first()).toBeVisible({ timeout: 3e4 });
|
|
41
|
+
}
|
|
42
|
+
function workflowHeaderMenuTrigger(page) {
|
|
43
|
+
return page.getByRole("button", { name: WORKFLOW_MORE_MENU_LABEL, exact: true });
|
|
44
|
+
}
|
|
45
|
+
function workflowHeaderMenuItem(page, label) {
|
|
46
|
+
return page.getByRole("menuitem", { name: label, exact: true });
|
|
47
|
+
}
|
|
48
|
+
async function openWorkflowHeaderMenu(page) {
|
|
49
|
+
await workflowHeaderMenuTrigger(page).hover();
|
|
50
|
+
}
|
|
51
|
+
async function closeWorkflowHeaderMenu(page, label) {
|
|
52
|
+
await page.mouse.move(0, 0);
|
|
53
|
+
await expect(workflowHeaderMenuItem(page, label)).toBeHidden({ timeout: 1e4 });
|
|
54
|
+
}
|
|
55
|
+
async function runWorkflowPaletteCommand(page, query) {
|
|
56
|
+
await page.keyboard.press("ControlOrMeta+k");
|
|
57
|
+
const search = page.getByPlaceholder("Search commands\u2026");
|
|
58
|
+
await expect(search).toBeVisible({ timeout: 15e3 });
|
|
59
|
+
await search.fill(query);
|
|
60
|
+
await expect(page.getByRole("option").filter({ hasText: query }).first()).toBeVisible({ timeout: 15e3 });
|
|
61
|
+
await page.keyboard.press("Enter");
|
|
62
|
+
await expect(search).toBeHidden({ timeout: 15e3 });
|
|
63
|
+
}
|
|
64
|
+
function isWorkflowDefinitionSave(response, definitionId) {
|
|
65
|
+
if (response.request().method() !== "PUT") return false;
|
|
66
|
+
try {
|
|
67
|
+
return new URL(response.url()).pathname.endsWith(`/api/workflows/definitions/${definitionId}`);
|
|
68
|
+
} catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function invokeWorkflowHeaderAction(page, label) {
|
|
73
|
+
await openWorkflowHeaderMenu(page);
|
|
74
|
+
await workflowHeaderMenuItem(page, label).click();
|
|
75
|
+
}
|
|
76
|
+
async function expectWorkflowHeaderAction(page, label, { available = true } = {}) {
|
|
77
|
+
await openWorkflowHeaderMenu(page);
|
|
78
|
+
const item = workflowHeaderMenuItem(page, label);
|
|
79
|
+
if (available) await expect(item).toBeVisible({ timeout: 1e4 });
|
|
80
|
+
else await expect(item).toHaveCount(0);
|
|
81
|
+
await closeWorkflowHeaderMenu(page, label);
|
|
82
|
+
}
|
|
83
|
+
async function openWorkflowTriggersDialog(page) {
|
|
84
|
+
await page.getByTestId(WORKFLOW_TRIGGER_CAP_TESTID).click();
|
|
85
|
+
await expect(page.getByRole("button", { name: WORKFLOW_ADD_TRIGGER_LABEL })).toBeVisible({
|
|
86
|
+
timeout: 15e3
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async function openWorkflowDetailsDrawer(page) {
|
|
90
|
+
const drawer = workflowDetailsDrawer(page);
|
|
91
|
+
if (!await drawer.isVisible().catch(() => false)) {
|
|
92
|
+
await invokeWorkflowHeaderAction(page, WORKFLOW_DETAILS_MENU_ITEM_LABEL);
|
|
93
|
+
}
|
|
94
|
+
await expect(drawer).toBeVisible({ timeout: 15e3 });
|
|
95
|
+
return drawer;
|
|
96
|
+
}
|
|
97
|
+
async function saveWorkflowFromDetailsDrawer(page) {
|
|
98
|
+
const drawer = workflowDetailsDrawer(page);
|
|
99
|
+
await drawer.getByRole("button", { name: /^(save|update)$/i }).click();
|
|
100
|
+
}
|
|
101
|
+
const WORKFLOW_LAST_RUN_TOGGLE_LABEL = "Show the last run on the canvas";
|
|
102
|
+
function workflowLastRunToggle(page) {
|
|
103
|
+
return page.getByRole("button", { name: WORKFLOW_LAST_RUN_TOGGLE_LABEL });
|
|
104
|
+
}
|
|
105
|
+
function workflowNodeStatus(page, stepId) {
|
|
106
|
+
return page.locator(`.react-flow__node[data-id="${stepId}"] [data-node-status]`).first();
|
|
107
|
+
}
|
|
108
|
+
function workflowEdgePath(page, transitionId) {
|
|
109
|
+
return page.locator(`.react-flow__edge[data-id="${transitionId}"] path.react-flow__edge-path`).first();
|
|
110
|
+
}
|
|
111
|
+
const WORKFLOW_TAKEN_ROUTE_STROKE = "var(--status-success-icon)";
|
|
112
|
+
export {
|
|
113
|
+
WORKFLOW_ADD_TRIGGER_LABEL,
|
|
114
|
+
WORKFLOW_CODE_VIEW_MENU_ITEM_LABEL,
|
|
115
|
+
WORKFLOW_DETAILS_DRAWER_TITLE,
|
|
116
|
+
WORKFLOW_DETAILS_MENU_ITEM_LABEL,
|
|
117
|
+
WORKFLOW_INSPECTOR_SELECTOR,
|
|
118
|
+
WORKFLOW_LAST_RUN_TOGGLE_LABEL,
|
|
119
|
+
WORKFLOW_MORE_MENU_LABEL,
|
|
120
|
+
WORKFLOW_NODE_TITLE_SELECTOR,
|
|
121
|
+
WORKFLOW_RESET_TO_CODE_MENU_ITEM_LABEL,
|
|
122
|
+
WORKFLOW_TAKEN_ROUTE_STROKE,
|
|
123
|
+
WORKFLOW_TRIGGER_CAP_TESTID,
|
|
124
|
+
WORKFLOW_TRIGGER_EDGE_ID,
|
|
125
|
+
WORKFLOW_TRIGGER_NODE_ID,
|
|
126
|
+
closeWorkflowHeaderMenu,
|
|
127
|
+
expectWorkflowHeaderAction,
|
|
128
|
+
invokeWorkflowHeaderAction,
|
|
129
|
+
isWorkflowDefinitionSave,
|
|
130
|
+
openWorkflowDetailsDrawer,
|
|
131
|
+
openWorkflowHeaderMenu,
|
|
132
|
+
openWorkflowStudio,
|
|
133
|
+
openWorkflowTriggersDialog,
|
|
134
|
+
runWorkflowPaletteCommand,
|
|
135
|
+
saveWorkflowFromDetailsDrawer,
|
|
136
|
+
visualEditorHref,
|
|
137
|
+
workflowDetailsDrawer,
|
|
138
|
+
workflowEdgePath,
|
|
139
|
+
workflowHeaderMenuItem,
|
|
140
|
+
workflowHeaderMenuTrigger,
|
|
141
|
+
workflowInspector,
|
|
142
|
+
workflowLastRunToggle,
|
|
143
|
+
workflowNodeByTitle,
|
|
144
|
+
workflowNodeStatus,
|
|
145
|
+
workflowRouteEdges,
|
|
146
|
+
workflowStepNodes
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=workflowsUi.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/helpers/integration/workflowsUi.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, type Locator, type Page } from '@playwright/test'\n\n/**\n * Shared browser-side helpers for the workflow Studio specs.\n *\n * The Studio is the ONLY workflow editor (workflows/AGENTS.md \u2192 \"The Form Editor\n * Is Retired\"). Three facts about it broke every spec written against the old\n * form editor, and each of them is centralised here so a future move is one\n * edit rather than twenty:\n *\n * 1. **Definition metadata lives in a modal Drawer that starts CLOSED.**\n * `workflowId` / `workflowName` / `description` / triggers / `contextSchema`\n * are inside `DefinitionMetadataDrawer`, which the header does not expose\n * directly: it is the `Settings` entry of the header's `More` menu\n * (`ActionsDropdown`, so a `role=\"button\"` named `More` opening\n * `role=\"menuitem\"`s). They are plain `Input`s with `id=` \u2014 there is no\n * `data-crud-field-id` on definition metadata (that attribute survives only\n * inside the step/route inspectors, which do use `CrudForm`).\n * 2. **The trigger summary is FOLDED onto the START node.** `TriggerCap` floats\n * above the START pill from inside that node's own render, so it adds no node\n * of its own \u2014 assert it with `WORKFLOW_TRIGGER_CAP_TESTID`. The separate\n * overlay node + dashed connector it replaced (`__workflow_trigger__`,\n * `components/nodes/TriggerNode.tsx`) are deprecated and no longer mounted;\n * `workflowStepNodes` / `workflowRouteEdges` still filter them out so a spec\n * counts the author's steps and routes either way.\n * 3. **The step and route inspectors are a wide overlay `Drawer`.** Both forms\n * outgrew the 384px docked rail, so each now opens as the wide modal Drawer\n * that mirrors the definition metadata drawer, whatever the viewport. The\n * `docked` variant of `InspectorPanel` (an `<aside role=\"complementary\">` in\n * the editor row) is still supported by the component but no longer mounted\n * by the Studio. BOTH variants carry `data-slot=\"workflow-inspector\"` plus a\n * `data-variant`, so `workflowInspector` matches either and a spec never has\n * to know which layout it got.\n */\n\nexport const WORKFLOW_TRIGGER_NODE_ID = '__workflow_trigger__'\nexport const WORKFLOW_TRIGGER_EDGE_ID = '__workflow_trigger_edge__'\n\n/** Accessible name of the Studio header's overflow menu (`workflows.visualEditor.more`). */\nexport const WORKFLOW_MORE_MENU_LABEL = 'More'\n/** The menu entry that opens the metadata drawer (`workflows.visualEditor.metadata.buttonLabel`). */\nexport const WORKFLOW_DETAILS_MENU_ITEM_LABEL = 'Settings'\n/** The menu entry that drops a customized definition back to its code version. */\nexport const WORKFLOW_RESET_TO_CODE_MENU_ITEM_LABEL = 'Reset to code version'\n/**\n * The menu entry that opens the read/edit Code view\n * (`workflows.visualEditor.codeView.title`).\n *\n * It used to be a header BUTTON labelled \"Show the definition JSON\"\n * (`\u2026codeView.open`); the toolbar declutter moved it into the More menu under\n * the shorter \"Code\".\n */\nexport const WORKFLOW_CODE_VIEW_MENU_ITEM_LABEL = 'Code'\nexport const WORKFLOW_DETAILS_DRAWER_TITLE = 'Workflow details'\nexport const WORKFLOW_INSPECTOR_SELECTOR = '[data-slot=\"workflow-inspector\"]'\n/** The START node's trigger cap \u2014 the only affordance that opens `TriggersDialog`. */\nexport const WORKFLOW_TRIGGER_CAP_TESTID = 'workflow-trigger-cap'\n/** The add button inside `TriggersDialog` (`workflows.triggers.add`). */\nexport const WORKFLOW_ADD_TRIGGER_LABEL = 'Add Trigger'\n\nexport function visualEditorHref(definitionId?: string | null): string {\n return definitionId\n ? `/backend/definitions/visual-editor?id=${encodeURIComponent(definitionId)}`\n : '/backend/definitions/visual-editor'\n}\n\n/**\n * The author's steps, without the render-time trigger pill.\n */\nexport function workflowStepNodes(page: Page): Locator {\n return page.locator(`.react-flow__node:not([data-id=\"${WORKFLOW_TRIGGER_NODE_ID}\"])`)\n}\n\n/**\n * The element carrying a node's OWN label (`WORKFLOW_NODE_TITLE_SLOT`).\n *\n * A whole-card text match is NOT a way to find a node by name: every card also\n * renders an unconditional `sr-only` status name (spec \u00A74.6 \u2014 status is never\n * colour-only), which in the editor is always \"Not started\". Playwright's\n * `hasText` is a case-insensitive SUBSTRING match, so `hasText: 'Start'` over a\n * card matches \"Not started\" and therefore matches every node on the canvas.\n * The START node compounds it: its trigger cap says \"manual / API start\".\n */\nexport const WORKFLOW_NODE_TITLE_SELECTOR = '[data-slot=\"workflow-node-title\"]'\n\nfunction escapeForRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * The single author step whose label is exactly `title`.\n *\n * Scoped to the title element and anchored, so it neither matches the status\n * copy nor a longer label that merely contains this one.\n */\nexport function workflowNodeByTitle(page: Page, title: string): Locator {\n return workflowStepNodes(page).filter({\n has: page.locator(WORKFLOW_NODE_TITLE_SELECTOR, {\n hasText: new RegExp(`^\\\\s*${escapeForRegExp(title)}\\\\s*$`),\n }),\n })\n}\n\n/**\n * The author's routes, without the trigger pill's connector.\n */\nexport function workflowRouteEdges(page: Page): Locator {\n return page.locator(`.react-flow__edge:not([data-id=\"${WORKFLOW_TRIGGER_EDGE_ID}\"])`)\n}\n\n/**\n * The step/route inspector, docked at >=1280px and a modal Drawer below it.\n * Distinguish the two by heading: \"Edit Step\" vs \"Edit Transition\".\n */\nexport function workflowInspector(page: Page): Locator {\n return page.locator(WORKFLOW_INSPECTOR_SELECTOR)\n}\n\nexport function workflowDetailsDrawer(page: Page): Locator {\n return page.getByRole('dialog', { name: WORKFLOW_DETAILS_DRAWER_TITLE })\n}\n\n/**\n * Open the Studio on an existing definition and wait for the canvas to paint.\n *\n * Goes straight to `/backend/definitions/visual-editor?id=\u2026` rather than through\n * the `/backend/definitions/<id>` bridge route: the bridge only exists so old\n * bookmarks keep working and costs a client-side `router.replace`.\n */\nexport async function openWorkflowStudio(page: Page, definitionId: string): Promise<void> {\n await page.goto(visualEditorHref(definitionId))\n await expect(workflowStepNodes(page).first()).toBeVisible({ timeout: 30_000 })\n}\n\n/** The Studio header's overflow-menu trigger. */\nexport function workflowHeaderMenuTrigger(page: Page): Locator {\n return page.getByRole('button', { name: WORKFLOW_MORE_MENU_LABEL, exact: true })\n}\n\n/**\n * One entry of the header's overflow menu.\n *\n * `ActionsDropdown` renders entries as `<Button role=\"menuitem\">`, so the\n * explicit role wins over the implicit one and `getByRole('button', \u2026)` never\n * matches them \u2014 and nothing is in the DOM at all until the menu is open.\n */\nexport function workflowHeaderMenuItem(page: Page, label: string): Locator {\n return page.getByRole('menuitem', { name: label, exact: true })\n}\n\n/**\n * Open the header's overflow menu.\n *\n * Hover, never click. `ActionsDropdown` opens on `mouseenter` and its trigger\n * *toggles* on click, so Playwright's `click()` \u2014 which moves the pointer over\n * the element first \u2014 opens the menu on the way in and closes it again on the\n * press. The row-action menus in these specs are driven the same way.\n */\nexport async function openWorkflowHeaderMenu(page: Page): Promise<void> {\n await workflowHeaderMenuTrigger(page).hover()\n}\n\n/**\n * Close the header's overflow menu by moving the pointer off it.\n *\n * `handleMouseLeave` closes on a 150 ms timer, so callers that go on to touch\n * the page underneath should await this rather than race the overlay.\n */\nexport async function closeWorkflowHeaderMenu(page: Page, label: string): Promise<void> {\n await page.mouse.move(0, 0)\n await expect(workflowHeaderMenuItem(page, label)).toBeHidden({ timeout: 10_000 })\n}\n\n/**\n * Run a Studio command from the Cmd/Ctrl+K palette.\n *\n * The palette is the complete non-pointer path (spec section 4.6), and it is\n * also the only way to reach an action the header renders no button for \u2014 Save\n * among them.\n */\nexport async function runWorkflowPaletteCommand(page: Page, query: string): Promise<void> {\n await page.keyboard.press('ControlOrMeta+k')\n const search = page.getByPlaceholder('Search commands\u2026')\n await expect(search).toBeVisible({ timeout: 15_000 })\n await search.fill(query)\n await expect(page.getByRole('option').filter({ hasText: query }).first()).toBeVisible({ timeout: 15_000 })\n await page.keyboard.press('Enter')\n await expect(search).toBeHidden({ timeout: 15_000 })\n}\n\n/**\n * Predicate matching the Studio's SAVE, and nothing else.\n *\n * The editor also autosaves to `\u2026/definitions/<id>/draft`, so a `url.includes(id)\n * && method === 'PUT'` matcher \u2014 what these specs used to write \u2014 is satisfied by\n * the autosave. A spec then walks on to read the definition the save never wrote\n * and reports a persistence bug that is not there (TC-WF-037 did exactly this).\n * Matching the pathname's END keeps the draft out.\n */\nexport function isWorkflowDefinitionSave(response: { url(): string; request(): { method(): string } }, definitionId: string): boolean {\n if (response.request().method() !== 'PUT') return false\n try {\n return new URL(response.url()).pathname.endsWith(`/api/workflows/definitions/${definitionId}`)\n } catch {\n return false\n }\n}\n\n/** Open the header's overflow menu and pick `label`. */\nexport async function invokeWorkflowHeaderAction(page: Page, label: string): Promise<void> {\n await openWorkflowHeaderMenu(page)\n await workflowHeaderMenuItem(page, label).click()\n}\n\n/**\n * Assert a header action is offered, then close the menu again.\n *\n * The pre-Studio header rendered these as always-visible buttons, so specs used\n * to assert availability with a bare `toBeVisible()`; the equivalent now is\n * \"the menu offers it\".\n */\nexport async function expectWorkflowHeaderAction(\n page: Page,\n label: string,\n { available = true }: { available?: boolean } = {},\n): Promise<void> {\n await openWorkflowHeaderMenu(page)\n const item = workflowHeaderMenuItem(page, label)\n if (available) await expect(item).toBeVisible({ timeout: 10_000 })\n else await expect(item).toHaveCount(0)\n await closeWorkflowHeaderMenu(page, label)\n}\n\n/**\n * Open the focused Triggers modal and wait for it.\n *\n * Triggers are NOT part of the definition drawer. The Studio routes them\n * through `TriggersDialog`, opened from the START node's trigger cap on the\n * canvas \u2014 page.tsx puts it plainly: the author clicked \"what starts this\", so\n * the affordance opens exactly that, \"NOT the five-section definition drawer\".\n * (The older `DefinitionTriggersEditor` survives only in the mobile sheet.)\n */\nexport async function openWorkflowTriggersDialog(page: Page): Promise<void> {\n await page.getByTestId(WORKFLOW_TRIGGER_CAP_TESTID).click()\n await expect(page.getByRole('button', { name: WORKFLOW_ADD_TRIGGER_LABEL })).toBeVisible({\n timeout: 15_000,\n })\n}\n\n/**\n * Open the definition-metadata drawer and wait for it.\n *\n * Every metadata field is unmounted until this runs, which is why so many specs\n * time out on a field that does still exist.\n */\nexport async function openWorkflowDetailsDrawer(page: Page): Promise<Locator> {\n const drawer = workflowDetailsDrawer(page)\n if (!(await drawer.isVisible().catch(() => false))) {\n await invokeWorkflowHeaderAction(page, WORKFLOW_DETAILS_MENU_ITEM_LABEL)\n }\n await expect(drawer).toBeVisible({ timeout: 15_000 })\n return drawer\n}\n\n/**\n * Save from INSIDE the drawer.\n *\n * With the drawer open there are two buttons named `Save`/`Update` \u2014 the page\n * header's and the drawer footer's \u2014 so an unscoped `getByRole('button', \u2026)`\n * fails Playwright's strict mode. The drawer's button submits the same\n * `handleSave`, header and all.\n */\nexport async function saveWorkflowFromDetailsDrawer(page: Page): Promise<void> {\n const drawer = workflowDetailsDrawer(page)\n await drawer.getByRole('button', { name: /^(save|update)$/i }).click()\n}\n\n/**\n * The Studio's \"Show last run\" execution overlay (spec \u00A78.3).\n *\n * The toggle is off by default and PERSISTED per author\n * (`om:wf-editor-last-run`), and it fetches nothing until it is on \u2014 so a spec\n * must click it, and a spec must not assume a previous test left it on.\n *\n * It is a header BUTTON rather than a More-menu entry, unlike the other view\n * toggles: it is stateful (`aria-pressed`) and it reports \"(never run)\" beside\n * its label, neither of which a fire-and-forget menu item can carry.\n */\nexport const WORKFLOW_LAST_RUN_TOGGLE_LABEL = 'Show the last run on the canvas'\n\nexport function workflowLastRunToggle(page: Page): Locator {\n return page.getByRole('button', { name: WORKFLOW_LAST_RUN_TOGGLE_LABEL })\n}\n\n/**\n * The run status the canvas painted for one step, read off the node card's\n * `data-node-status` attribute.\n *\n * The value is a `WorkflowStatus`, not the `StepRunStatus` the overlay derives:\n * each node component funnels `data.status` through `toWorkflowStatus`, which\n * collapses `active` to `in_progress` and anything it does not know (including\n * an absent status, i.e. the plain editor) to `not_started`.\n */\nexport function workflowNodeStatus(page: Page, stepId: string): Locator {\n return page.locator(`.react-flow__node[data-id=\"${stepId}\"] [data-node-status]`).first()\n}\n\n/**\n * The visible stroke of one route. The overlay paints a TAKEN route by setting\n * the edge's `state` to `completed`, which reaches the DOM only as the inline\n * `stroke` (there is no `data-*` marker), so `EDGE_COLORS.completed.stroke` \u2014\n * `var(--status-success-icon)` \u2014 is what a spec has to look for.\n */\nexport function workflowEdgePath(page: Page, transitionId: string): Locator {\n return page.locator(`.react-flow__edge[data-id=\"${transitionId}\"] path.react-flow__edge-path`).first()\n}\n\nexport const WORKFLOW_TAKEN_ROUTE_STROKE = 'var(--status-success-icon)'\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { emitCrudSideEffects } from "@open-mercato/shared/lib/commands/helpers";
|
|
3
|
+
import { Attachment, AttachmentPartition } from "../data/entities.js";
|
|
4
|
+
import { StorageDriverFactory } from "./drivers/index.js";
|
|
5
|
+
import { ensureDefaultPartitions, resolveDefaultPartitionCode } from "./partitions.js";
|
|
6
|
+
import { buildAttachmentFileUrl } from "./imageUrls.js";
|
|
7
|
+
import { mergeAttachmentMetadata, upsertAssignment } from "./metadata.js";
|
|
8
|
+
import { assertAttachmentScopeInvariant } from "./access.js";
|
|
9
|
+
import { attachmentCrudEvents, attachmentCrudIndexer } from "./crud.js";
|
|
10
|
+
async function createAttachmentFromBuffer(input) {
|
|
11
|
+
const { em } = input;
|
|
12
|
+
const code = input.partitionCode && input.partitionCode.length > 0 ? input.partitionCode : resolveDefaultPartitionCode(input.entityId);
|
|
13
|
+
let partition = await em.findOne(AttachmentPartition, { code });
|
|
14
|
+
if (!partition) {
|
|
15
|
+
await ensureDefaultPartitions(em);
|
|
16
|
+
partition = await em.findOne(AttachmentPartition, { code });
|
|
17
|
+
}
|
|
18
|
+
if (!partition) throw new Error(`[internal] attachment partition "${code}" is not available`);
|
|
19
|
+
const driver = await new StorageDriverFactory(em).resolveForPartition(partition.code, {
|
|
20
|
+
tenantId: input.tenantId,
|
|
21
|
+
organizationId: input.organizationId
|
|
22
|
+
});
|
|
23
|
+
const stored = await driver.store({
|
|
24
|
+
partitionCode: partition.code,
|
|
25
|
+
orgId: input.organizationId,
|
|
26
|
+
tenantId: input.tenantId,
|
|
27
|
+
fileName: input.fileName,
|
|
28
|
+
buffer: input.buffer
|
|
29
|
+
});
|
|
30
|
+
const metadata = mergeAttachmentMetadata(null, {
|
|
31
|
+
assignments: upsertAssignment([], { type: input.entityId, id: input.recordId })
|
|
32
|
+
});
|
|
33
|
+
const attachmentId = randomUUID();
|
|
34
|
+
assertAttachmentScopeInvariant({ tenantId: input.tenantId, organizationId: input.organizationId });
|
|
35
|
+
const attachment = em.create(Attachment, {
|
|
36
|
+
id: attachmentId,
|
|
37
|
+
entityId: input.entityId,
|
|
38
|
+
recordId: input.recordId,
|
|
39
|
+
organizationId: input.organizationId,
|
|
40
|
+
tenantId: input.tenantId,
|
|
41
|
+
fileName: input.fileName,
|
|
42
|
+
mimeType: input.mimeType,
|
|
43
|
+
fileSize: input.buffer.length,
|
|
44
|
+
partitionCode: partition.code,
|
|
45
|
+
storageDriver: partition.storageDriver || "local",
|
|
46
|
+
storagePath: stored.storagePath,
|
|
47
|
+
url: buildAttachmentFileUrl(attachmentId),
|
|
48
|
+
content: null,
|
|
49
|
+
storageMetadata: metadata
|
|
50
|
+
});
|
|
51
|
+
await em.transactional(async (tx) => {
|
|
52
|
+
await tx.persist(attachment).flush();
|
|
53
|
+
});
|
|
54
|
+
if (input.dataEngine) {
|
|
55
|
+
await emitCrudSideEffects({
|
|
56
|
+
dataEngine: input.dataEngine,
|
|
57
|
+
action: "created",
|
|
58
|
+
entity: attachment,
|
|
59
|
+
identifiers: {
|
|
60
|
+
id: attachment.id,
|
|
61
|
+
organizationId: attachment.organizationId ?? null,
|
|
62
|
+
tenantId: attachment.tenantId ?? null
|
|
63
|
+
},
|
|
64
|
+
events: attachmentCrudEvents,
|
|
65
|
+
indexer: attachmentCrudIndexer
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
id: attachmentId,
|
|
70
|
+
fileName: input.fileName,
|
|
71
|
+
mimeType: input.mimeType,
|
|
72
|
+
fileSize: input.buffer.length,
|
|
73
|
+
url: attachment.url
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
createAttachmentFromBuffer
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=createFromBuffer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/attachments/lib/createFromBuffer.ts"],
|
|
4
|
+
"sourcesContent": ["import { randomUUID } from 'node:crypto'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { emitCrudSideEffects } from '@open-mercato/shared/lib/commands/helpers'\nimport { Attachment, AttachmentPartition } from '../data/entities'\nimport { StorageDriverFactory } from './drivers'\nimport { ensureDefaultPartitions, resolveDefaultPartitionCode } from './partitions'\nimport { buildAttachmentFileUrl } from './imageUrls'\nimport { mergeAttachmentMetadata, upsertAssignment } from './metadata'\nimport { assertAttachmentScopeInvariant } from './access'\nimport { attachmentCrudEvents, attachmentCrudIndexer } from './crud'\n\n/** DataEngine handle whose exact type is derived from `emitCrudSideEffects` (no `any`). */\ntype CrudDataEngine = Parameters<typeof emitCrudSideEffects>[0]['dataEngine']\n\nexport type CreateAttachmentFromBufferInput = {\n em: EntityManager\n /** When provided, fires CRUD side effects (events + indexing). Omit to skip. */\n dataEngine?: CrudDataEngine\n tenantId: string\n organizationId: string\n /** Domain entity this attachment is linked to (e.g. 'customers:deal'). */\n entityId: string\n recordId: string\n fileName: string\n mimeType: string\n buffer: Buffer\n /** Storage partition; defaults to the entity's default partition. */\n partitionCode?: string | null\n}\n\nexport type CreatedAttachment = {\n id: string\n fileName: string\n mimeType: string\n fileSize: number\n url: string\n}\n\n/**\n * Create a durable `Attachment` from an in-memory buffer, linked to a domain\n * record. Additive reusable seam extracted from the upload route's store block so\n * server-side producers (e.g. the agent file-plane artifact-promotion effector,\n * #12) can materialize an attachment without going through the multipart HTTP\n * route. Resolves the partition + driver, stores the bytes, persists the row\n * atomically, and (when a `dataEngine` is passed) fires CRUD side effects so the\n * attachment is indexed and its events emitted \u2014 exactly like an uploaded file.\n */\nexport async function createAttachmentFromBuffer(input: CreateAttachmentFromBufferInput): Promise<CreatedAttachment> {\n const { em } = input\n const code = (input.partitionCode && input.partitionCode.length > 0)\n ? input.partitionCode\n : resolveDefaultPartitionCode(input.entityId)\n\n let partition = await em.findOne(AttachmentPartition, { code })\n if (!partition) {\n await ensureDefaultPartitions(em)\n partition = await em.findOne(AttachmentPartition, { code })\n }\n if (!partition) throw new Error(`[internal] attachment partition \"${code}\" is not available`)\n\n const driver = await new StorageDriverFactory(em).resolveForPartition(partition.code, {\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n })\n const stored = await driver.store({\n partitionCode: partition.code,\n orgId: input.organizationId,\n tenantId: input.tenantId,\n fileName: input.fileName,\n buffer: input.buffer,\n })\n\n const metadata = mergeAttachmentMetadata(null, {\n assignments: upsertAssignment([], { type: input.entityId, id: input.recordId }),\n })\n const attachmentId = randomUUID()\n assertAttachmentScopeInvariant({ tenantId: input.tenantId, organizationId: input.organizationId })\n const attachment = em.create(Attachment, {\n id: attachmentId,\n entityId: input.entityId,\n recordId: input.recordId,\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n fileName: input.fileName,\n mimeType: input.mimeType,\n fileSize: input.buffer.length,\n partitionCode: partition.code,\n storageDriver: partition.storageDriver || 'local',\n storagePath: stored.storagePath,\n url: buildAttachmentFileUrl(attachmentId),\n content: null,\n storageMetadata: metadata,\n })\n await em.transactional(async (tx) => {\n await tx.persist(attachment).flush()\n })\n\n if (input.dataEngine) {\n await emitCrudSideEffects({\n dataEngine: input.dataEngine,\n action: 'created',\n entity: attachment,\n identifiers: {\n id: attachment.id,\n organizationId: attachment.organizationId ?? null,\n tenantId: attachment.tenantId ?? null,\n },\n events: attachmentCrudEvents,\n indexer: attachmentCrudIndexer,\n })\n }\n\n return {\n id: attachmentId,\n fileName: input.fileName,\n mimeType: input.mimeType,\n fileSize: input.buffer.length,\n url: attachment.url,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,kBAAkB;AAE3B,SAAS,2BAA2B;AACpC,SAAS,YAAY,2BAA2B;AAChD,SAAS,4BAA4B;AACrC,SAAS,yBAAyB,mCAAmC;AACrE,SAAS,8BAA8B;AACvC,SAAS,yBAAyB,wBAAwB;AAC1D,SAAS,sCAAsC;AAC/C,SAAS,sBAAsB,6BAA6B;AAsC5D,eAAsB,2BAA2B,OAAoE;AACnH,QAAM,EAAE,GAAG,IAAI;AACf,QAAM,OAAQ,MAAM,iBAAiB,MAAM,cAAc,SAAS,IAC9D,MAAM,gBACN,4BAA4B,MAAM,QAAQ;AAE9C,MAAI,YAAY,MAAM,GAAG,QAAQ,qBAAqB,EAAE,KAAK,CAAC;AAC9D,MAAI,CAAC,WAAW;AACd,UAAM,wBAAwB,EAAE;AAChC,gBAAY,MAAM,GAAG,QAAQ,qBAAqB,EAAE,KAAK,CAAC;AAAA,EAC5D;AACA,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,oCAAoC,IAAI,oBAAoB;AAE5F,QAAM,SAAS,MAAM,IAAI,qBAAqB,EAAE,EAAE,oBAAoB,UAAU,MAAM;AAAA,IACpF,UAAU,MAAM;AAAA,IAChB,gBAAgB,MAAM;AAAA,EACxB,CAAC;AACD,QAAM,SAAS,MAAM,OAAO,MAAM;AAAA,IAChC,eAAe,UAAU;AAAA,IACzB,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM;AAAA,EAChB,CAAC;AAED,QAAM,WAAW,wBAAwB,MAAM;AAAA,IAC7C,aAAa,iBAAiB,CAAC,GAAG,EAAE,MAAM,MAAM,UAAU,IAAI,MAAM,SAAS,CAAC;AAAA,EAChF,CAAC;AACD,QAAM,eAAe,WAAW;AAChC,iCAA+B,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,eAAe,CAAC;AACjG,QAAM,aAAa,GAAG,OAAO,YAAY;AAAA,IACvC,IAAI;AAAA,IACJ,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,gBAAgB,MAAM;AAAA,IACtB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM,OAAO;AAAA,IACvB,eAAe,UAAU;AAAA,IACzB,eAAe,UAAU,iBAAiB;AAAA,IAC1C,aAAa,OAAO;AAAA,IACpB,KAAK,uBAAuB,YAAY;AAAA,IACxC,SAAS;AAAA,IACT,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,GAAG,cAAc,OAAO,OAAO;AACnC,UAAM,GAAG,QAAQ,UAAU,EAAE,MAAM;AAAA,EACrC,CAAC;AAED,MAAI,MAAM,YAAY;AACpB,UAAM,oBAAoB;AAAA,MACxB,YAAY,MAAM;AAAA,MAClB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,IAAI,WAAW;AAAA,QACf,gBAAgB,WAAW,kBAAkB;AAAA,QAC7C,UAAU,WAAW,YAAY;AAAA,MACnC;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM,OAAO;AAAA,IACvB,KAAK,WAAW;AAAA,EAClB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -14,6 +14,7 @@ let ActionLog = class {
|
|
|
14
14
|
this.tenantId = null;
|
|
15
15
|
this.organizationId = null;
|
|
16
16
|
this.actorUserId = null;
|
|
17
|
+
this.onBehalfOfUserId = null;
|
|
17
18
|
this.actionLabel = null;
|
|
18
19
|
this.actionType = null;
|
|
19
20
|
this.resourceKind = null;
|
|
@@ -49,6 +50,9 @@ __decorateClass([
|
|
|
49
50
|
__decorateClass([
|
|
50
51
|
Property({ name: "actor_user_id", type: "uuid", nullable: true })
|
|
51
52
|
], ActionLog.prototype, "actorUserId", 2);
|
|
53
|
+
__decorateClass([
|
|
54
|
+
Property({ name: "on_behalf_of_user_id", type: "uuid", nullable: true })
|
|
55
|
+
], ActionLog.prototype, "onBehalfOfUserId", 2);
|
|
52
56
|
__decorateClass([
|
|
53
57
|
Property({ name: "command_id", type: "text" })
|
|
54
58
|
], ActionLog.prototype, "commandId", 2);
|
|
@@ -119,6 +123,7 @@ ActionLog = __decorateClass([
|
|
|
119
123
|
Entity({ tableName: "action_logs" }),
|
|
120
124
|
Index({ name: "action_logs_tenant_idx", properties: ["tenantId", "createdAt"] }),
|
|
121
125
|
Index({ name: "action_logs_actor_idx", properties: ["actorUserId", "createdAt"] }),
|
|
126
|
+
Index({ name: "action_logs_obo_idx", properties: ["onBehalfOfUserId"] }),
|
|
122
127
|
Index({ name: "action_logs_resource_idx", properties: ["tenantId", "resourceKind", "resourceId", "createdAt"] }),
|
|
123
128
|
Index({ name: "action_logs_parent_resource_idx", properties: ["tenantId", "parentResourceKind", "parentResourceId", "createdAt"] }),
|
|
124
129
|
Index({ name: "action_logs_action_type_idx", properties: ["tenantId", "organizationId", "actionType", "createdAt"] }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/audit_logs/data/entities.ts"],
|
|
4
|
-
"sourcesContent": ["import { Entity, Index, PrimaryKey, Property } from '@mikro-orm/decorators/legacy'\nimport type { ActionLogProjectionType, ActionLogSourceKey } from '@open-mercato/core/modules/audit_logs/lib/projections'\n\nexport type ActionLogExecutionState = 'done' | 'undoing' | 'undone' | 'failed' | 'redone'\n\n@Entity({ tableName: 'action_logs' })\n@Index({ name: 'action_logs_tenant_idx', properties: ['tenantId', 'createdAt'] })\n@Index({ name: 'action_logs_actor_idx', properties: ['actorUserId', 'createdAt'] })\n@Index({ name: 'action_logs_resource_idx', properties: ['tenantId', 'resourceKind', 'resourceId', 'createdAt'] })\n@Index({ name: 'action_logs_parent_resource_idx', properties: ['tenantId', 'parentResourceKind', 'parentResourceId', 'createdAt'] })\n@Index({ name: 'action_logs_action_type_idx', properties: ['tenantId', 'organizationId', 'actionType', 'createdAt'] })\n@Index({ name: 'action_logs_source_key_idx', properties: ['tenantId', 'organizationId', 'sourceKey', 'createdAt'] })\n@Index({ name: 'action_logs_primary_changed_field_idx', properties: ['tenantId', 'organizationId', 'primaryChangedField', 'createdAt'] })\n@Index({ name: 'action_logs_changed_fields_idx', properties: ['changedFields'], type: 'gin' })\n@Index({ name: 'action_logs_related_resource_idx', properties: ['tenantId', 'relatedResourceKind', 'relatedResourceId', 'createdAt'] })\nexport class ActionLog {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId: string | null = null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId: string | null = null\n\n @Property({ name: 'actor_user_id', type: 'uuid', nullable: true })\n actorUserId: string | null = null\n\n @Property({ name: 'command_id', type: 'text' })\n commandId!: string\n\n @Property({ name: 'action_label', type: 'text', nullable: true })\n actionLabel: string | null = null\n\n @Property({ name: 'action_type', type: 'text', nullable: true })\n actionType: ActionLogProjectionType | null = null\n\n @Property({ name: 'resource_kind', type: 'text', nullable: true })\n resourceKind: string | null = null\n\n @Property({ name: 'resource_id', type: 'text', nullable: true })\n resourceId: string | null = null\n\n @Property({ name: 'parent_resource_kind', type: 'text', nullable: true })\n parentResourceKind: string | null = null\n\n @Property({ name: 'parent_resource_id', type: 'text', nullable: true })\n parentResourceId: string | null = null\n\n @Property({ name: 'execution_state', type: 'text', default: 'done' })\n executionState: ActionLogExecutionState = 'done'\n\n @Property({ name: 'undo_token', type: 'text', nullable: true })\n undoToken: string | null = null\n\n @Property({ name: 'command_payload', type: 'jsonb', nullable: true })\n commandPayload: unknown | null = null\n\n @Property({ name: 'snapshot_before', type: 'jsonb', nullable: true })\n snapshotBefore: unknown | null = null\n\n @Property({ name: 'snapshot_after', type: 'jsonb', nullable: true })\n snapshotAfter: unknown | null = null\n\n @Property({ name: 'changes_json', type: 'jsonb', nullable: true })\n changesJson: Record<string, unknown> | null = null\n\n @Property({ name: 'changed_fields', type: 'text[]', nullable: true })\n changedFields: string[] | null = null\n\n @Property({ name: 'primary_changed_field', type: 'text', nullable: true })\n primaryChangedField: string | null = null\n\n @Property({ name: 'context_json', type: 'jsonb', nullable: true })\n contextJson: Record<string, unknown> | null = null\n\n @Property({ name: 'source_key', type: 'text', nullable: true })\n sourceKey: ActionLogSourceKey | null = null\n\n @Property({ name: 'related_resource_kind', type: 'text', nullable: true })\n relatedResourceKind: string | null = null\n\n @Property({ name: 'related_resource_id', type: 'text', nullable: true })\n relatedResourceId: string | null = null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })\n updatedAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt: Date | null = null\n}\n\n@Entity({ tableName: 'access_logs' })\n@Index({ name: 'access_logs_tenant_idx', properties: ['tenantId', 'createdAt'] })\n@Index({ name: 'access_logs_actor_idx', properties: ['actorUserId', 'createdAt'] })\n@Index({ name: 'access_logs_created_at_idx', properties: ['createdAt'] })\nexport class AccessLog {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId: string | null = null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId: string | null = null\n\n @Property({ name: 'actor_user_id', type: 'uuid', nullable: true })\n actorUserId: string | null = null\n\n @Property({ name: 'resource_kind', type: 'text' })\n resourceKind!: string\n\n @Property({ name: 'resource_id', type: 'text' })\n resourceId!: string\n\n @Property({ name: 'access_type', type: 'text' })\n accessType!: string\n\n @Property({ name: 'fields_json', type: 'jsonb', nullable: true })\n fieldsJson: string[] | null = null\n\n @Property({ name: 'context_json', type: 'jsonb', nullable: true })\n contextJson: Record<string, unknown> | null = null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt: Date | null = null\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;AAAA,SAAS,QAAQ,OAAO,YAAY,gBAAgB;
|
|
4
|
+
"sourcesContent": ["import { Entity, Index, PrimaryKey, Property } from '@mikro-orm/decorators/legacy'\nimport type { ActionLogProjectionType, ActionLogSourceKey } from '@open-mercato/core/modules/audit_logs/lib/projections'\n\nexport type ActionLogExecutionState = 'done' | 'undoing' | 'undone' | 'failed' | 'redone'\n\n@Entity({ tableName: 'action_logs' })\n@Index({ name: 'action_logs_tenant_idx', properties: ['tenantId', 'createdAt'] })\n@Index({ name: 'action_logs_actor_idx', properties: ['actorUserId', 'createdAt'] })\n@Index({ name: 'action_logs_obo_idx', properties: ['onBehalfOfUserId'] })\n@Index({ name: 'action_logs_resource_idx', properties: ['tenantId', 'resourceKind', 'resourceId', 'createdAt'] })\n@Index({ name: 'action_logs_parent_resource_idx', properties: ['tenantId', 'parentResourceKind', 'parentResourceId', 'createdAt'] })\n@Index({ name: 'action_logs_action_type_idx', properties: ['tenantId', 'organizationId', 'actionType', 'createdAt'] })\n@Index({ name: 'action_logs_source_key_idx', properties: ['tenantId', 'organizationId', 'sourceKey', 'createdAt'] })\n@Index({ name: 'action_logs_primary_changed_field_idx', properties: ['tenantId', 'organizationId', 'primaryChangedField', 'createdAt'] })\n@Index({ name: 'action_logs_changed_fields_idx', properties: ['changedFields'], type: 'gin' })\n@Index({ name: 'action_logs_related_resource_idx', properties: ['tenantId', 'relatedResourceKind', 'relatedResourceId', 'createdAt'] })\nexport class ActionLog {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId: string | null = null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId: string | null = null\n\n @Property({ name: 'actor_user_id', type: 'uuid', nullable: true })\n actorUserId: string | null = null\n\n /**\n * The human (or system) principal an agent acted on behalf of. Null for direct\n * human/system/api actions; set to the invoking human's `auth.User` id when the\n * actor (`actorUserId`) is an agent principal running under `runAs` with\n * `sourceKey = 'agent'`. FK id \u2192 `auth.User` (no cross-module ORM relation).\n * Additive, nullable, indexed (`action_logs_obo_idx`); existing rows default null\n * so no existing audit reader breaks (Agent Identity & On-Behalf-Of, Wave 4 P2).\n */\n @Property({ name: 'on_behalf_of_user_id', type: 'uuid', nullable: true })\n onBehalfOfUserId: string | null = null\n\n @Property({ name: 'command_id', type: 'text' })\n commandId!: string\n\n @Property({ name: 'action_label', type: 'text', nullable: true })\n actionLabel: string | null = null\n\n @Property({ name: 'action_type', type: 'text', nullable: true })\n actionType: ActionLogProjectionType | null = null\n\n @Property({ name: 'resource_kind', type: 'text', nullable: true })\n resourceKind: string | null = null\n\n @Property({ name: 'resource_id', type: 'text', nullable: true })\n resourceId: string | null = null\n\n @Property({ name: 'parent_resource_kind', type: 'text', nullable: true })\n parentResourceKind: string | null = null\n\n @Property({ name: 'parent_resource_id', type: 'text', nullable: true })\n parentResourceId: string | null = null\n\n @Property({ name: 'execution_state', type: 'text', default: 'done' })\n executionState: ActionLogExecutionState = 'done'\n\n @Property({ name: 'undo_token', type: 'text', nullable: true })\n undoToken: string | null = null\n\n @Property({ name: 'command_payload', type: 'jsonb', nullable: true })\n commandPayload: unknown | null = null\n\n @Property({ name: 'snapshot_before', type: 'jsonb', nullable: true })\n snapshotBefore: unknown | null = null\n\n @Property({ name: 'snapshot_after', type: 'jsonb', nullable: true })\n snapshotAfter: unknown | null = null\n\n @Property({ name: 'changes_json', type: 'jsonb', nullable: true })\n changesJson: Record<string, unknown> | null = null\n\n @Property({ name: 'changed_fields', type: 'text[]', nullable: true })\n changedFields: string[] | null = null\n\n @Property({ name: 'primary_changed_field', type: 'text', nullable: true })\n primaryChangedField: string | null = null\n\n @Property({ name: 'context_json', type: 'jsonb', nullable: true })\n contextJson: Record<string, unknown> | null = null\n\n @Property({ name: 'source_key', type: 'text', nullable: true })\n sourceKey: ActionLogSourceKey | null = null\n\n @Property({ name: 'related_resource_kind', type: 'text', nullable: true })\n relatedResourceKind: string | null = null\n\n @Property({ name: 'related_resource_id', type: 'text', nullable: true })\n relatedResourceId: string | null = null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })\n updatedAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt: Date | null = null\n}\n\n@Entity({ tableName: 'access_logs' })\n@Index({ name: 'access_logs_tenant_idx', properties: ['tenantId', 'createdAt'] })\n@Index({ name: 'access_logs_actor_idx', properties: ['actorUserId', 'createdAt'] })\n@Index({ name: 'access_logs_created_at_idx', properties: ['createdAt'] })\nexport class AccessLog {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId: string | null = null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId: string | null = null\n\n @Property({ name: 'actor_user_id', type: 'uuid', nullable: true })\n actorUserId: string | null = null\n\n @Property({ name: 'resource_kind', type: 'text' })\n resourceKind!: string\n\n @Property({ name: 'resource_id', type: 'text' })\n resourceId!: string\n\n @Property({ name: 'access_type', type: 'text' })\n accessType!: string\n\n @Property({ name: 'fields_json', type: 'jsonb', nullable: true })\n fieldsJson: string[] | null = null\n\n @Property({ name: 'context_json', type: 'jsonb', nullable: true })\n contextJson: Record<string, unknown> | null = null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt: Date | null = null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -12,6 +12,7 @@ const recordLike = z.union([
|
|
|
12
12
|
]).optional();
|
|
13
13
|
const actionLogCreateSchema = baseScopeSchema.extend({
|
|
14
14
|
commandId: z.string().min(1),
|
|
15
|
+
onBehalfOfUserId: uuid.nullish(),
|
|
15
16
|
actionLabel: z.string().min(1).optional(),
|
|
16
17
|
resourceKind: z.string().min(1).optional(),
|
|
17
18
|
resourceId: z.string().min(1).optional(),
|