@open-mercato/core 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7195.1.b5efd1d51a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -2
- package/AGENTS.md +4 -3
- package/agentic/standalone-guide.md +1 -1
- package/build.mjs +16 -0
- package/dist/bootstrap.js +7 -3
- package/dist/bootstrap.js.map +2 -2
- package/dist/generated/entities/action_log/index.js +2 -0
- package/dist/generated/entities/action_log/index.js.map +2 -2
- package/dist/generated/entities/user/index.js +2 -0
- package/dist/generated/entities/user/index.js.map +2 -2
- package/dist/generated/entities/user_task/index.js +14 -0
- package/dist/generated/entities/user_task/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition/index.js +6 -0
- package/dist/generated/entities/workflow_definition/index.js.map +2 -2
- package/dist/generated/entities/workflow_definition_draft/index.js +25 -0
- package/dist/generated/entities/workflow_definition_draft/index.js.map +7 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js +23 -0
- package/dist/generated/entities/workflow_definition_metric_rollup/index.js.map +7 -0
- package/dist/generated/entities/workflow_instance/index.js +4 -0
- package/dist/generated/entities/workflow_instance/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +4 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +39 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/workflowsFixtures.js +477 -2
- package/dist/helpers/integration/workflowsFixtures.js.map +2 -2
- package/dist/helpers/integration/workflowsUi.js +148 -0
- package/dist/helpers/integration/workflowsUi.js.map +7 -0
- package/dist/modules/attachments/lib/createFromBuffer.js +79 -0
- package/dist/modules/attachments/lib/createFromBuffer.js.map +7 -0
- package/dist/modules/audit_logs/data/entities.js +5 -0
- package/dist/modules/audit_logs/data/entities.js.map +2 -2
- package/dist/modules/audit_logs/data/validators.js +1 -0
- package/dist/modules/audit_logs/data/validators.js.map +2 -2
- package/dist/modules/audit_logs/lib/projections.js +2 -1
- package/dist/modules/audit_logs/lib/projections.js.map +2 -2
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js +15 -0
- package/dist/modules/audit_logs/migrations/Migration20260625120000.js.map +7 -0
- package/dist/modules/audit_logs/services/actionLogService.js +3 -0
- package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
- package/dist/modules/auth/data/entities.js +6 -0
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/lib/executionPrincipal.js +140 -0
- package/dist/modules/auth/lib/executionPrincipal.js.map +7 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js +13 -0
- package/dist/modules/auth/migrations/Migration20260625050000.js.map +7 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js +154 -0
- package/dist/modules/business_rules/components/InlineRuleEditor.js.map +7 -0
- package/dist/modules/business_rules/data/validators.js +6 -0
- package/dist/modules/business_rules/data/validators.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-engine.js +5 -3
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +5 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/workflows.js +19 -0
- package/dist/modules/catalog/workflows.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/cli.js +80 -0
- package/dist/modules/customer_accounts/cli.js.map +7 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js +59 -0
- package/dist/modules/customer_accounts/lib/customerRoleAclSync.js.map +7 -0
- package/dist/modules/customer_accounts/setup.js +4 -2
- package/dist/modules/customer_accounts/setup.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +4 -0
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js +1 -1
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +2 -0
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/events.js +13 -2
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/link-workflow-task-handler.js +64 -0
- package/dist/modules/customers/lib/link-workflow-task-handler.js.map +7 -0
- package/dist/modules/customers/lib/todoCompatibility.js +1 -1
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/customers/lib/workflowTaskLink.js +9 -0
- package/dist/modules/customers/lib/workflowTaskLink.js.map +7 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js +12 -0
- package/dist/modules/customers/subscribers/link-workflow-task.js.map +7 -0
- package/dist/modules/customers/workflows.js +29 -0
- package/dist/modules/customers/workflows.js.map +7 -0
- package/dist/modules/entities/api/records.js +13 -33
- package/dist/modules/entities/api/records.js.map +3 -3
- package/dist/modules/entities/lib/entityClassification.js +60 -0
- package/dist/modules/entities/lib/entityClassification.js.map +7 -0
- package/dist/modules/sales/commands/documents.js +31 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/events.js +12 -1
- package/dist/modules/sales/events.js.map +2 -2
- package/dist/modules/sales/workflows.js +12 -1
- package/dist/modules/sales/workflows.js.map +2 -2
- package/dist/modules/seeds/cli.js +199 -0
- package/dist/modules/seeds/cli.js.map +7 -0
- package/dist/modules/seeds/examples/sample-seed.json +26 -0
- package/dist/modules/seeds/index.js +12 -0
- package/dist/modules/seeds/index.js.map +7 -0
- package/dist/modules/workflows/acl.js +96 -0
- package/dist/modules/workflows/acl.js.map +2 -2
- package/dist/modules/workflows/ai-agents.js +50 -0
- package/dist/modules/workflows/ai-agents.js.map +7 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js +582 -0
- package/dist/modules/workflows/ai-tools/authoring-pack.js.map +7 -0
- package/dist/modules/workflows/ai-tools/types.js +43 -0
- package/dist/modules/workflows/ai-tools/types.js.map +7 -0
- package/dist/modules/workflows/ai-tools.js +10 -0
- package/dist/modules/workflows/ai-tools.js.map +7 -0
- package/dist/modules/workflows/api/command-settings/route.js +137 -0
- package/dist/modules/workflows/api/command-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/commands/route.js +72 -0
- package/dist/modules/workflows/api/commands/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js +76 -0
- package/dist/modules/workflows/api/definitions/[id]/callers/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js +134 -0
- package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js +5 -1
- package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js +286 -0
- package/dist/modules/workflows/api/definitions/[id]/draft/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js +207 -0
- package/dist/modules/workflows/api/definitions/[id]/publish/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +5 -0
- package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/[id]/route.js +93 -9
- package/dist/modules/workflows/api/definitions/[id]/route.js.map +3 -3
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js +210 -0
- package/dist/modules/workflows/api/definitions/[id]/test-step/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/generate/route.js +233 -0
- package/dist/modules/workflows/api/definitions/generate/route.js.map +7 -0
- package/dist/modules/workflows/api/definitions/route.js +61 -113
- package/dist/modules/workflows/api/definitions/route.js.map +2 -2
- package/dist/modules/workflows/api/definitions/serialize.js +9 -0
- package/dist/modules/workflows/api/definitions/serialize.js.map +2 -2
- package/dist/modules/workflows/api/endpoints/route.js +69 -0
- package/dist/modules/workflows/api/endpoints/route.js.map +7 -0
- package/dist/modules/workflows/api/functions/route.js +73 -0
- package/dist/modules/workflows/api/functions/route.js.map +7 -0
- package/dist/modules/workflows/api/grantable-features/route.js +75 -0
- package/dist/modules/workflows/api/grantable-features/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js +180 -0
- package/dist/modules/workflows/api/instances/[id]/context/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js +184 -0
- package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/retry/route.js +12 -2
- package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js +148 -0
- package/dist/modules/workflows/api/instances/[id]/step-through/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js +123 -0
- package/dist/modules/workflows/api/instances/[id]/steps/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js +172 -0
- package/dist/modules/workflows/api/instances/[id]/would-do/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js +117 -0
- package/dist/modules/workflows/api/instances/bulk-replay/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js +165 -0
- package/dist/modules/workflows/api/instances/failure-queue/route.js.map +7 -0
- package/dist/modules/workflows/api/instances/route.js +94 -3
- package/dist/modules/workflows/api/instances/route.js.map +2 -2
- package/dist/modules/workflows/api/metrics/definitions/route.js +188 -0
- package/dist/modules/workflows/api/metrics/definitions/route.js.map +7 -0
- package/dist/modules/workflows/api/openapi.js +415 -4
- package/dist/modules/workflows/api/openapi.js.map +2 -2
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js +132 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js +97 -0
- package/dist/modules/workflows/api/portal/tasks/[id]/route.js.map +7 -0
- package/dist/modules/workflows/api/portal/tasks/route.js +126 -0
- package/dist/modules/workflows/api/portal/tasks/route.js.map +7 -0
- package/dist/modules/workflows/api/rule-usage/route.js +80 -0
- package/dist/modules/workflows/api/rule-usage/route.js.map +7 -0
- package/dist/modules/workflows/api/task-settings/route.js +107 -0
- package/dist/modules/workflows/api/task-settings/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js +27 -16
- package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js +40 -16
- package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js +150 -0
- package/dist/modules/workflows/api/tasks/[id]/reassign/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/[id]/route.js +39 -6
- package/dist/modules/workflows/api/tasks/[id]/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js +100 -0
- package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js.map +7 -0
- package/dist/modules/workflows/api/tasks/route.js +37 -6
- package/dist/modules/workflows/api/tasks/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/serialize.js +83 -0
- package/dist/modules/workflows/api/tasks/serialize.js.map +7 -0
- package/dist/modules/workflows/api/templates/route.js +69 -0
- package/dist/modules/workflows/api/templates/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js +129 -0
- package/dist/modules/workflows/api/work-inbox/next/route.js.map +7 -0
- package/dist/modules/workflows/api/work-inbox/route.js +119 -0
- package/dist/modules/workflows/api/work-inbox/route.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.js +10 -0
- package/dist/modules/workflows/backend/config/workflows/page.js.map +7 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js +35 -0
- package/dist/modules/workflows/backend/config/workflows/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/[id]/page.js +6 -271
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/definitions/create/page.js +7 -56
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +131 -51
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2606 -677
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +3 -3
- package/dist/modules/workflows/backend/instances/[id]/page.js +532 -421
- package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/instances/failure-queue/page.js +211 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.js.map +7 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js +20 -0
- package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js.map +7 -0
- package/dist/modules/workflows/backend/instances/page.js +159 -22
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.meta.js +1 -1
- package/dist/modules/workflows/backend/instances/page.meta.js.map +1 -1
- package/dist/modules/workflows/backend/tasks/[id]/page.js +553 -392
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/page.js +8 -250
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.meta.js +1 -0
- package/dist/modules/workflows/backend/tasks/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/work-inbox/page.js +399 -0
- package/dist/modules/workflows/backend/work-inbox/page.js.map +7 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js +19 -0
- package/dist/modules/workflows/backend/work-inbox/page.meta.js.map +7 -0
- package/dist/modules/workflows/cli.js +1 -1
- package/dist/modules/workflows/cli.js.map +2 -2
- package/dist/modules/workflows/commands/tasks.js +81 -0
- package/dist/modules/workflows/commands/tasks.js.map +7 -0
- package/dist/modules/workflows/components/ActivitiesEditor.js +281 -287
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
- package/dist/modules/workflows/components/ActivityEditDialog.js +220 -0
- package/dist/modules/workflows/components/ActivityEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/AgentSelector.js +115 -0
- package/dist/modules/workflows/components/AgentSelector.js.map +7 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js +110 -0
- package/dist/modules/workflows/components/AnnotationEditDialog.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js +71 -0
- package/dist/modules/workflows/components/BusinessRuleUsagePanel.js.map +7 -0
- package/dist/modules/workflows/components/BusinessRulesSelector.js +151 -93
- package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
- package/dist/modules/workflows/components/ConfigJsonTextarea.js +85 -0
- package/dist/modules/workflows/components/ConfigJsonTextarea.js.map +7 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js +150 -0
- package/dist/modules/workflows/components/ContextSchemaEditor.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js +102 -0
- package/dist/modules/workflows/components/DefinitionErrorHandlerField.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js +377 -0
- package/dist/modules/workflows/components/DefinitionMetadataDrawer.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js +132 -0
- package/dist/modules/workflows/components/DefinitionMetricsCells.js.map +7 -0
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +307 -216
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialog.js +11 -18
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +112 -72
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/InputDataPanel.js +128 -0
- package/dist/modules/workflows/components/InputDataPanel.js.map +7 -0
- package/dist/modules/workflows/components/InspectorPanel.js +161 -0
- package/dist/modules/workflows/components/InspectorPanel.js.map +7 -0
- package/dist/modules/workflows/components/NodeEditDialog.js +363 -41
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +714 -159
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TemplateGalleryDialog.js +148 -0
- package/dist/modules/workflows/components/TemplateGalleryDialog.js.map +7 -0
- package/dist/modules/workflows/components/TransitionsEditor.js +80 -74
- package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TriggersDialog.js +53 -0
- package/dist/modules/workflows/components/TriggersDialog.js.map +7 -0
- package/dist/modules/workflows/components/TriggersEditor.js +331 -0
- package/dist/modules/workflows/components/TriggersEditor.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js +278 -0
- package/dist/modules/workflows/components/WorkflowAiDraftDialog.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js +173 -0
- package/dist/modules/workflows/components/WorkflowCodeView.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js +62 -0
- package/dist/modules/workflows/components/WorkflowCommandPalette.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js +70 -0
- package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js +36 -0
- package/dist/modules/workflows/components/WorkflowDataMappingEdge.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowGraph.js +4 -2
- package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowGraphImpl.js +324 -86
- package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +3 -3
- package/dist/modules/workflows/components/WorkflowIconPicker.js +109 -0
- package/dist/modules/workflows/components/WorkflowIconPicker.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowLegend.js +45 -29
- package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowNodeCard.js +221 -22
- package/dist/modules/workflows/components/WorkflowNodeCard.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowRouteChips.js +111 -0
- package/dist/modules/workflows/components/WorkflowRouteChips.js.map +7 -0
- package/dist/modules/workflows/components/WorkflowSelector.js +108 -88
- package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js +61 -11
- package/dist/modules/workflows/components/WorkflowTransitionEdge.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js +15 -5
- package/dist/modules/workflows/components/WorkflowTransitionLabel.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +88 -21
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js +615 -0
- package/dist/modules/workflows/components/fields/ActivityConfigFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js +191 -0
- package/dist/modules/workflows/components/fields/ActivityTestPanel.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js +488 -0
- package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js.map +7 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js +61 -0
- package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js.map +7 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js +227 -0
- package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +37 -4
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/CommandPicker.js +111 -0
- package/dist/modules/workflows/components/fields/CommandPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js +235 -0
- package/dist/modules/workflows/components/fields/EndpointPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FunctionPicker.js +55 -0
- package/dist/modules/workflows/components/fields/FunctionPicker.js.map +7 -0
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js +38 -15
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js +206 -0
- package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js +53 -0
- package/dist/modules/workflows/components/fields/RolesMultiSelect.js.map +7 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js +130 -0
- package/dist/modules/workflows/components/fields/RouteOrderEditor.js.map +7 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js +104 -0
- package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js.map +7 -0
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +2 -2
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js +210 -0
- package/dist/modules/workflows/components/fields/TaskAssignmentField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js +126 -0
- package/dist/modules/workflows/components/fields/TaskDeadlineFields.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js +218 -0
- package/dist/modules/workflows/components/fields/TaskDecisionsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js +114 -0
- package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js.map +7 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js +64 -0
- package/dist/modules/workflows/components/fields/TemplateTextControl.js.map +7 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js +121 -0
- package/dist/modules/workflows/components/fields/VariablePickerButton.js.map +7 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js +35 -0
- package/dist/modules/workflows/components/fields/ledgerDropTarget.js.map +7 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js +16 -0
- package/dist/modules/workflows/components/fields/useActivityTypeOptions.js.map +7 -0
- package/dist/modules/workflows/components/formConfig.js +39 -10
- package/dist/modules/workflows/components/formConfig.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileMetadataSheet.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +29 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +64 -65
- package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +2 -2
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js +64 -0
- package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/AutomatedNode.js +24 -16
- package/dist/modules/workflows/components/nodes/AutomatedNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/EndNode.js +13 -12
- package/dist/modules/workflows/components/nodes/EndNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js +29 -0
- package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js.map +7 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js +51 -0
- package/dist/modules/workflows/components/nodes/IfElseNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js +122 -0
- package/dist/modules/workflows/components/nodes/InvokeAgentNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js +100 -0
- package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js.map +7 -0
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelForkNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js +18 -14
- package/dist/modules/workflows/components/nodes/ParallelJoinNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StartNode.js +66 -15
- package/dist/modules/workflows/components/nodes/StartNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js +54 -0
- package/dist/modules/workflows/components/nodes/StickyNoteNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js +107 -41
- package/dist/modules/workflows/components/nodes/SubWorkflowNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/SwitchNode.js +51 -0
- package/dist/modules/workflows/components/nodes/SwitchNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js +65 -0
- package/dist/modules/workflows/components/nodes/TriggerCap.js.map +7 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js +111 -0
- package/dist/modules/workflows/components/nodes/TriggerNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/UserTaskNode.js +43 -17
- package/dist/modules/workflows/components/nodes/UserTaskNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js +53 -0
- package/dist/modules/workflows/components/nodes/WaitForConditionNode.js.map +7 -0
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForSignalNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js +21 -15
- package/dist/modules/workflows/components/nodes/WaitForTimerNode.js.map +2 -2
- package/dist/modules/workflows/components/nodes/index.js +14 -0
- package/dist/modules/workflows/components/nodes/index.js.map +2 -2
- package/dist/modules/workflows/components/portal/PortalTaskForm.js +196 -0
- package/dist/modules/workflows/components/portal/PortalTaskForm.js.map +7 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js +22 -0
- package/dist/modules/workflows/components/run/AgentActivityPanel.js.map +7 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js +106 -0
- package/dist/modules/workflows/components/run/RerunStepDialog.js.map +7 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js +30 -0
- package/dist/modules/workflows/components/run/RunEventBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunGantt.js +130 -0
- package/dist/modules/workflows/components/run/RunGantt.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js +82 -0
- package/dist/modules/workflows/components/run/RunStatusBadge.js.map +7 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js +116 -0
- package/dist/modules/workflows/components/run/RunStepInspector.js.map +7 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js +52 -0
- package/dist/modules/workflows/components/run/WouldDoReport.js.map +7 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js +28 -0
- package/dist/modules/workflows/components/run/useAgentLabels.js.map +7 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js +89 -0
- package/dist/modules/workflows/components/run/useLastRunOverlay.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js +41 -0
- package/dist/modules/workflows/components/run/useLiveAgentActions.js.map +7 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js +57 -0
- package/dist/modules/workflows/components/run/useLiveRunUpdates.js.map +7 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js +156 -0
- package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js +72 -0
- package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js +156 -0
- package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js +46 -0
- package/dist/modules/workflows/components/work-inbox/StatusChip.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js +53 -0
- package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js +261 -0
- package/dist/modules/workflows/components/work-inbox/TaskFormFields.js.map +7 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js +27 -0
- package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-schemas.js +191 -0
- package/dist/modules/workflows/data/activity-config-schemas.js.map +7 -0
- package/dist/modules/workflows/data/activity-config-warnings.js +42 -0
- package/dist/modules/workflows/data/activity-config-warnings.js.map +7 -0
- package/dist/modules/workflows/data/branching-route-warnings.js +65 -0
- package/dist/modules/workflows/data/branching-route-warnings.js.map +7 -0
- package/dist/modules/workflows/data/entities.js +144 -4
- package/dist/modules/workflows/data/entities.js.map +2 -2
- package/dist/modules/workflows/data/metrics-validators.js +35 -0
- package/dist/modules/workflows/data/metrics-validators.js.map +7 -0
- package/dist/modules/workflows/data/task-primitives.js +14 -0
- package/dist/modules/workflows/data/task-primitives.js.map +7 -0
- package/dist/modules/workflows/data/validators.js +504 -61
- package/dist/modules/workflows/data/validators.js.map +3 -3
- package/dist/modules/workflows/di.js +16 -1
- package/dist/modules/workflows/di.js.map +2 -2
- package/dist/modules/workflows/events.js +66 -8
- package/dist/modules/workflows/events.js.map +2 -2
- package/dist/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/dist/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/dist/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/dist/modules/workflows/examples/templates/order-approval.json +230 -0
- package/dist/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/dist/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/dist/modules/workflows/extension-points.js +1 -1
- package/dist/modules/workflows/extension-points.js.map +2 -2
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js +144 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js +12 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js +114 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js.map +7 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js +18 -0
- package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js.map +7 -0
- package/dist/modules/workflows/lib/activity-executor.js +505 -137
- package/dist/modules/workflows/lib/activity-executor.js.map +3 -3
- package/dist/modules/workflows/lib/activity-queue-types.js +3 -1
- package/dist/modules/workflows/lib/activity-queue-types.js.map +2 -2
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js +2 -0
- package/dist/modules/workflows/lib/activity-registry-bootstrap.js.map +7 -0
- package/dist/modules/workflows/lib/activity-registry.js +27 -0
- package/dist/modules/workflows/lib/activity-registry.js.map +7 -0
- package/dist/modules/workflows/lib/activity-types.js +291 -0
- package/dist/modules/workflows/lib/activity-types.js.map +7 -0
- package/dist/modules/workflows/lib/activity-worker-handler.js +456 -32
- package/dist/modules/workflows/lib/activity-worker-handler.js.map +3 -3
- package/dist/modules/workflows/lib/advanced-config.js +31 -0
- package/dist/modules/workflows/lib/advanced-config.js.map +7 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js +198 -0
- package/dist/modules/workflows/lib/agent-disposition-task.js.map +7 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js +82 -0
- package/dist/modules/workflows/lib/agent-outcome-paths.js.map +7 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js +54 -0
- package/dist/modules/workflows/lib/agent-result-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js +61 -0
- package/dist/modules/workflows/lib/agent-review-inspector.js.map +7 -0
- package/dist/modules/workflows/lib/agent-review.js +66 -0
- package/dist/modules/workflows/lib/agent-review.js.map +7 -0
- package/dist/modules/workflows/lib/ai-authoring.js +155 -0
- package/dist/modules/workflows/lib/ai-authoring.js.map +7 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js +43 -0
- package/dist/modules/workflows/lib/ai-draft-runner.js.map +7 -0
- package/dist/modules/workflows/lib/annotation-events.js +10 -0
- package/dist/modules/workflows/lib/annotation-events.js.map +7 -0
- package/dist/modules/workflows/lib/branching-routes.js +182 -0
- package/dist/modules/workflows/lib/branching-routes.js.map +7 -0
- package/dist/modules/workflows/lib/breach-routing.js +50 -0
- package/dist/modules/workflows/lib/breach-routing.js.map +7 -0
- package/dist/modules/workflows/lib/bulk-replay.js +101 -0
- package/dist/modules/workflows/lib/bulk-replay.js.map +7 -0
- package/dist/modules/workflows/lib/business-rule-usage.js +91 -0
- package/dist/modules/workflows/lib/business-rule-usage.js.map +7 -0
- package/dist/modules/workflows/lib/caller-graph.js +53 -0
- package/dist/modules/workflows/lib/caller-graph.js.map +7 -0
- package/dist/modules/workflows/lib/code-view-apply.js +86 -0
- package/dist/modules/workflows/lib/code-view-apply.js.map +7 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js +164 -0
- package/dist/modules/workflows/lib/collect-validation-issues.js.map +7 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js +72 -0
- package/dist/modules/workflows/lib/compensation-ghosts.js.map +7 -0
- package/dist/modules/workflows/lib/component-guard.js +7 -0
- package/dist/modules/workflows/lib/component-guard.js.map +7 -0
- package/dist/modules/workflows/lib/condition-handler.js +443 -0
- package/dist/modules/workflows/lib/condition-handler.js.map +7 -0
- package/dist/modules/workflows/lib/context-ledger.js +448 -0
- package/dist/modules/workflows/lib/context-ledger.js.map +7 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js +8 -0
- package/dist/modules/workflows/lib/crud-form-dialogs-flag.js.map +7 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js +63 -0
- package/dist/modules/workflows/lib/data-edge-mapping.js.map +7 -0
- package/dist/modules/workflows/lib/definition-context-schema.js +56 -0
- package/dist/modules/workflows/lib/definition-context-schema.js.map +7 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js +123 -0
- package/dist/modules/workflows/lib/definition-edit-safety.js.map +7 -0
- package/dist/modules/workflows/lib/definition-error-body.js +33 -0
- package/dist/modules/workflows/lib/definition-error-body.js.map +7 -0
- package/dist/modules/workflows/lib/definition-evaluation.js +79 -0
- package/dist/modules/workflows/lib/definition-evaluation.js.map +7 -0
- package/dist/modules/workflows/lib/definition-grant.js +90 -0
- package/dist/modules/workflows/lib/definition-grant.js.map +7 -0
- package/dist/modules/workflows/lib/definition-json-locations.js +139 -0
- package/dist/modules/workflows/lib/definition-json-locations.js.map +7 -0
- package/dist/modules/workflows/lib/definition-payload.js +31 -0
- package/dist/modules/workflows/lib/definition-payload.js.map +7 -0
- package/dist/modules/workflows/lib/draft-restore.js +49 -0
- package/dist/modules/workflows/lib/draft-restore.js.map +7 -0
- package/dist/modules/workflows/lib/dry-run.js +106 -0
- package/dist/modules/workflows/lib/dry-run.js.map +7 -0
- package/dist/modules/workflows/lib/duration.js +66 -17
- package/dist/modules/workflows/lib/duration.js.map +2 -2
- package/dist/modules/workflows/lib/edge-reattachment.js +79 -0
- package/dist/modules/workflows/lib/edge-reattachment.js.map +7 -0
- package/dist/modules/workflows/lib/edgeFormTransforms.js +7 -11
- package/dist/modules/workflows/lib/edgeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/editor-annotations.js +195 -0
- package/dist/modules/workflows/lib/editor-annotations.js.map +7 -0
- package/dist/modules/workflows/lib/editor-commands.js +103 -0
- package/dist/modules/workflows/lib/editor-commands.js.map +7 -0
- package/dist/modules/workflows/lib/editor-history.js +51 -0
- package/dist/modules/workflows/lib/editor-history.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js +181 -0
- package/dist/modules/workflows/lib/endpoint-catalog.js.map +7 -0
- package/dist/modules/workflows/lib/endpoint-path.js +90 -0
- package/dist/modules/workflows/lib/endpoint-path.js.map +7 -0
- package/dist/modules/workflows/lib/engine-version.js +42 -0
- package/dist/modules/workflows/lib/engine-version.js.map +7 -0
- package/dist/modules/workflows/lib/error-handler.js +132 -0
- package/dist/modules/workflows/lib/error-handler.js.map +7 -0
- package/dist/modules/workflows/lib/error-routing.js +104 -0
- package/dist/modules/workflows/lib/error-routing.js.map +7 -0
- package/dist/modules/workflows/lib/event-logger.js +23 -0
- package/dist/modules/workflows/lib/event-logger.js.map +2 -2
- package/dist/modules/workflows/lib/expression-refs.js +168 -0
- package/dist/modules/workflows/lib/expression-refs.js.map +7 -0
- package/dist/modules/workflows/lib/failure-grouping.js +62 -0
- package/dist/modules/workflows/lib/failure-grouping.js.map +7 -0
- package/dist/modules/workflows/lib/find-definition.js +1 -0
- package/dist/modules/workflows/lib/find-definition.js.map +2 -2
- package/dist/modules/workflows/lib/flow-logic-warnings.js +338 -0
- package/dist/modules/workflows/lib/flow-logic-warnings.js.map +7 -0
- package/dist/modules/workflows/lib/graph-utils.js +328 -77
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/dist/modules/workflows/lib/icon-search.js +32 -0
- package/dist/modules/workflows/lib/icon-search.js.map +7 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js +26 -0
- package/dist/modules/workflows/lib/insert-at-cursor.js.map +7 -0
- package/dist/modules/workflows/lib/instance-date-filter.js +28 -0
- package/dist/modules/workflows/lib/instance-date-filter.js.map +7 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js +271 -0
- package/dist/modules/workflows/lib/interpolation-pipeline.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-drag.js +28 -0
- package/dist/modules/workflows/lib/ledger-drag.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js +66 -0
- package/dist/modules/workflows/lib/ledger-entry-display.js.map +7 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js +82 -0
- package/dist/modules/workflows/lib/ledger-schema-flatten.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js +110 -0
- package/dist/modules/workflows/lib/metrics/definition-metrics.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js +26 -0
- package/dist/modules/workflows/lib/metrics/metrics-display.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-schedule.js.map +7 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js +160 -0
- package/dist/modules/workflows/lib/metrics/rollup-service.js.map +7 -0
- package/dist/modules/workflows/lib/node-config-summary.js +128 -0
- package/dist/modules/workflows/lib/node-config-summary.js.map +7 -0
- package/dist/modules/workflows/lib/node-geometry.js +53 -0
- package/dist/modules/workflows/lib/node-geometry.js.map +7 -0
- package/dist/modules/workflows/lib/node-nudge.js +44 -0
- package/dist/modules/workflows/lib/node-nudge.js.map +7 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js +88 -0
- package/dist/modules/workflows/lib/node-outcome-rows.js.map +7 -0
- package/dist/modules/workflows/lib/node-placement.js +55 -0
- package/dist/modules/workflows/lib/node-placement.js.map +7 -0
- package/dist/modules/workflows/lib/node-type-icons.js +54 -13
- package/dist/modules/workflows/lib/node-type-icons.js.map +2 -2
- package/dist/modules/workflows/lib/nodeFormTransforms.js +329 -19
- package/dist/modules/workflows/lib/nodeFormTransforms.js.map +2 -2
- package/dist/modules/workflows/lib/outcome-routing.js +158 -0
- package/dist/modules/workflows/lib/outcome-routing.js.map +7 -0
- package/dist/modules/workflows/lib/owned-definition.js +107 -0
- package/dist/modules/workflows/lib/owned-definition.js.map +7 -0
- package/dist/modules/workflows/lib/owned-node-changes.js +10 -0
- package/dist/modules/workflows/lib/owned-node-changes.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drag.js +36 -0
- package/dist/modules/workflows/lib/palette-drag.js.map +7 -0
- package/dist/modules/workflows/lib/palette-drop.js +45 -0
- package/dist/modules/workflows/lib/palette-drop.js.map +7 -0
- package/dist/modules/workflows/lib/parallel-handler.js +57 -2
- package/dist/modules/workflows/lib/parallel-handler.js.map +2 -2
- package/dist/modules/workflows/lib/port-contract.js +54 -0
- package/dist/modules/workflows/lib/port-contract.js.map +7 -0
- package/dist/modules/workflows/lib/portal-task-access.js +89 -0
- package/dist/modules/workflows/lib/portal-task-access.js.map +7 -0
- package/dist/modules/workflows/lib/rerun-from-step.js +65 -0
- package/dist/modules/workflows/lib/rerun-from-step.js.map +7 -0
- package/dist/modules/workflows/lib/route-chip-events.js +23 -0
- package/dist/modules/workflows/lib/route-chip-events.js.map +7 -0
- package/dist/modules/workflows/lib/route-chips.js +91 -0
- package/dist/modules/workflows/lib/route-chips.js.map +7 -0
- package/dist/modules/workflows/lib/route-edge.js +17 -0
- package/dist/modules/workflows/lib/route-edge.js.map +7 -0
- package/dist/modules/workflows/lib/route-kinds.js +67 -0
- package/dist/modules/workflows/lib/route-kinds.js.map +7 -0
- package/dist/modules/workflows/lib/route-priority.js +104 -0
- package/dist/modules/workflows/lib/route-priority.js.map +7 -0
- package/dist/modules/workflows/lib/run-duration.js +44 -0
- package/dist/modules/workflows/lib/run-duration.js.map +7 -0
- package/dist/modules/workflows/lib/run-event-tone.js +25 -0
- package/dist/modules/workflows/lib/run-event-tone.js.map +7 -0
- package/dist/modules/workflows/lib/run-execution.js +305 -0
- package/dist/modules/workflows/lib/run-execution.js.map +7 -0
- package/dist/modules/workflows/lib/run-gantt.js +180 -0
- package/dist/modules/workflows/lib/run-gantt.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js +33 -0
- package/dist/modules/workflows/lib/run-outcome-evidence.js.map +7 -0
- package/dist/modules/workflows/lib/run-outcome.js +48 -0
- package/dist/modules/workflows/lib/run-outcome.js.map +7 -0
- package/dist/modules/workflows/lib/sample-resolver.js +71 -0
- package/dist/modules/workflows/lib/sample-resolver.js.map +7 -0
- package/dist/modules/workflows/lib/seeds.js +1 -1
- package/dist/modules/workflows/lib/seeds.js.map +2 -2
- package/dist/modules/workflows/lib/server-output-contract.js +65 -0
- package/dist/modules/workflows/lib/server-output-contract.js.map +7 -0
- package/dist/modules/workflows/lib/set-variable.js +47 -0
- package/dist/modules/workflows/lib/set-variable.js.map +7 -0
- package/dist/modules/workflows/lib/signal-handler.js +63 -4
- package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
- package/dist/modules/workflows/lib/start-fixtures.js +42 -0
- package/dist/modules/workflows/lib/start-fixtures.js.map +7 -0
- package/dist/modules/workflows/lib/status-colors.js +153 -22
- package/dist/modules/workflows/lib/status-colors.js.map +2 -2
- package/dist/modules/workflows/lib/step-handler.js +529 -53
- package/dist/modules/workflows/lib/step-handler.js.map +3 -3
- package/dist/modules/workflows/lib/step-presentation.js +147 -0
- package/dist/modules/workflows/lib/step-presentation.js.map +7 -0
- package/dist/modules/workflows/lib/step-through.js +26 -0
- package/dist/modules/workflows/lib/step-through.js.map +7 -0
- package/dist/modules/workflows/lib/step-type-conversion.js +167 -0
- package/dist/modules/workflows/lib/step-type-conversion.js.map +7 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js +114 -0
- package/dist/modules/workflows/lib/subgraph-clipboard.js.map +7 -0
- package/dist/modules/workflows/lib/task-decision-context.js +38 -0
- package/dist/modules/workflows/lib/task-decision-context.js.map +7 -0
- package/dist/modules/workflows/lib/task-decisions.js +49 -0
- package/dist/modules/workflows/lib/task-decisions.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-access.js +62 -0
- package/dist/modules/workflows/lib/task-entity-access.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js +39 -0
- package/dist/modules/workflows/lib/task-entity-aliases.js.map +7 -0
- package/dist/modules/workflows/lib/task-entity-types.js +36 -0
- package/dist/modules/workflows/lib/task-entity-types.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-registry.js +33 -0
- package/dist/modules/workflows/lib/task-form-registry.js.map +7 -0
- package/dist/modules/workflows/lib/task-form-schema.js +75 -0
- package/dist/modules/workflows/lib/task-form-schema.js.map +7 -0
- package/dist/modules/workflows/lib/task-handler.js +251 -32
- package/dist/modules/workflows/lib/task-handler.js.map +2 -2
- package/dist/modules/workflows/lib/task-inspector-config.js +182 -0
- package/dist/modules/workflows/lib/task-inspector-config.js.map +7 -0
- package/dist/modules/workflows/lib/task-list-query.js +19 -0
- package/dist/modules/workflows/lib/task-list-query.js.map +7 -0
- package/dist/modules/workflows/lib/task-notifications.js +119 -0
- package/dist/modules/workflows/lib/task-notifications.js.map +7 -0
- package/dist/modules/workflows/lib/task-permission-settings.js +43 -0
- package/dist/modules/workflows/lib/task-permission-settings.js.map +7 -0
- package/dist/modules/workflows/lib/task-presets.js +35 -0
- package/dist/modules/workflows/lib/task-presets.js.map +7 -0
- package/dist/modules/workflows/lib/task-quick-action.js +45 -0
- package/dist/modules/workflows/lib/task-quick-action.js.map +7 -0
- package/dist/modules/workflows/lib/task-resolution.js +120 -0
- package/dist/modules/workflows/lib/task-resolution.js.map +7 -0
- package/dist/modules/workflows/lib/task-sla.js +357 -0
- package/dist/modules/workflows/lib/task-sla.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility-request.js +266 -0
- package/dist/modules/workflows/lib/task-visibility-request.js.map +7 -0
- package/dist/modules/workflows/lib/task-visibility.js +194 -0
- package/dist/modules/workflows/lib/task-visibility.js.map +7 -0
- package/dist/modules/workflows/lib/timer-handler.js +3 -1
- package/dist/modules/workflows/lib/timer-handler.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +148 -20
- package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
- package/dist/modules/workflows/lib/trigger-node.js +121 -0
- package/dist/modules/workflows/lib/trigger-node.js.map +7 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js +14 -0
- package/dist/modules/workflows/lib/visual-editor-navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js +52 -0
- package/dist/modules/workflows/lib/work-inbox/empty-state.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js +63 -0
- package/dist/modules/workflows/lib/work-inbox/entity-links.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js +11 -0
- package/dist/modules/workflows/lib/work-inbox/navigation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js +90 -0
- package/dist/modules/workflows/lib/work-inbox/presentation.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js +118 -0
- package/dist/modules/workflows/lib/work-inbox/provider.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/query.js +70 -0
- package/dist/modules/workflows/lib/work-inbox/query.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/service.js +56 -0
- package/dist/modules/workflows/lib/work-inbox/service.js.map +7 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js +149 -0
- package/dist/modules/workflows/lib/work-inbox/user-task-source.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js +57 -0
- package/dist/modules/workflows/lib/workflow-command-enablement.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js +54 -0
- package/dist/modules/workflows/lib/workflow-command-settings.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-executor.js +658 -6
- package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-function-registry.js +40 -0
- package/dist/modules/workflows/lib/workflow-function-registry.js.map +7 -0
- package/dist/modules/workflows/lib/workflow-safe-commands.js +11 -1
- package/dist/modules/workflows/lib/workflow-safe-commands.js.map +2 -2
- package/dist/modules/workflows/lib/workflow-templates.js +69 -0
- package/dist/modules/workflows/lib/workflow-templates.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js +17 -0
- package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js +15 -0
- package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js +12 -0
- package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js.map +7 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js +13 -0
- package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js.map +7 -0
- package/dist/modules/workflows/notifications.js +38 -10
- package/dist/modules/workflows/notifications.js.map +2 -2
- package/dist/modules/workflows/setup.js +81 -1
- package/dist/modules/workflows/setup.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-assigned-notification.js +19 -27
- package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +2 -2
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js.map +7 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js +24 -0
- package/dist/modules/workflows/subscribers/task-reminder-notification.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js +73 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js +17 -0
- package/dist/modules/workflows/widgets/injection/pending-work/widget.js.map +7 -0
- package/dist/modules/workflows/widgets/injection-table.js +26 -0
- package/dist/modules/workflows/widgets/injection-table.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-activities.worker.js +61 -39
- package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js +40 -0
- package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js +43 -0
- package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js.map +7 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js +30 -0
- package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js.map +7 -0
- package/generated/entities/action_log/index.ts +1 -0
- package/generated/entities/user/index.ts +1 -0
- package/generated/entities/user_task/index.ts +7 -0
- package/generated/entities/workflow_definition/index.ts +3 -0
- package/generated/entities/workflow_definition_draft/index.ts +11 -0
- package/generated/entities/workflow_definition_metric_rollup/index.ts +10 -0
- package/generated/entities/workflow_instance/index.ts +2 -0
- package/generated/entities.ids.generated.ts +4 -1
- package/generated/entity-fields-registry.ts +39 -0
- package/jest.setup.ts +13 -0
- package/package.json +8 -7
- package/src/bootstrap.ts +13 -3
- package/src/helpers/integration/workflowsFixtures.ts +765 -5
- package/src/helpers/integration/workflowsUi.ts +318 -0
- package/src/modules/attachments/lib/createFromBuffer.ts +120 -0
- package/src/modules/audit_logs/data/entities.ts +12 -0
- package/src/modules/audit_logs/data/validators.ts +1 -0
- package/src/modules/audit_logs/lib/projections.ts +5 -1
- package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +26 -0
- package/src/modules/audit_logs/migrations/Migration20260625120000.ts +15 -0
- package/src/modules/audit_logs/services/actionLogService.ts +3 -0
- package/src/modules/auth/data/entities.ts +21 -0
- package/src/modules/auth/i18n/de.json +31 -0
- package/src/modules/auth/i18n/en.json +31 -0
- package/src/modules/auth/i18n/es.json +31 -0
- package/src/modules/auth/i18n/ko.json +31 -0
- package/src/modules/auth/i18n/pl.json +31 -0
- package/src/modules/auth/lib/executionPrincipal.ts +235 -0
- package/src/modules/auth/migrations/.snapshot-open-mercato.json +16 -0
- package/src/modules/auth/migrations/Migration20260625050000.ts +21 -0
- package/src/modules/business_rules/components/InlineRuleEditor.tsx +231 -0
- package/src/modules/business_rules/data/validators.ts +6 -0
- package/src/modules/business_rules/i18n/de.json +4 -0
- package/src/modules/business_rules/i18n/en.json +4 -0
- package/src/modules/business_rules/i18n/es.json +4 -0
- package/src/modules/business_rules/i18n/ko.json +4 -0
- package/src/modules/business_rules/i18n/pl.json +4 -0
- package/src/modules/business_rules/lib/rule-engine.ts +15 -1
- package/src/modules/catalog/commands/products.ts +12 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/workflows.ts +35 -0
- package/src/modules/customer_accounts/AGENTS.md +11 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +2 -0
- package/src/modules/customer_accounts/cli.ts +96 -0
- package/src/modules/customer_accounts/i18n/de.json +5 -0
- package/src/modules/customer_accounts/i18n/en.json +5 -0
- package/src/modules/customer_accounts/i18n/es.json +5 -0
- package/src/modules/customer_accounts/i18n/ko.json +5 -0
- package/src/modules/customer_accounts/i18n/pl.json +5 -0
- package/src/modules/customer_accounts/lib/customerRoleAclSync.ts +92 -0
- package/src/modules/customer_accounts/setup.ts +15 -3
- package/src/modules/customers/commands/deals.ts +5 -0
- package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +4 -2
- package/src/modules/customers/components/detail/utils.ts +2 -0
- package/src/modules/customers/events.ts +21 -3
- package/src/modules/customers/i18n/de.json +4 -0
- package/src/modules/customers/i18n/en.json +4 -0
- package/src/modules/customers/i18n/es.json +4 -0
- package/src/modules/customers/i18n/ko.json +4 -0
- package/src/modules/customers/i18n/pl.json +4 -0
- package/src/modules/customers/lib/link-workflow-task-handler.ts +136 -0
- package/src/modules/customers/lib/todoCompatibility.ts +4 -1
- package/src/modules/customers/lib/workflowTaskLink.ts +23 -0
- package/src/modules/customers/subscribers/link-workflow-task.ts +19 -0
- package/src/modules/customers/workflows.ts +57 -0
- package/src/modules/entities/api/records.ts +18 -62
- package/src/modules/entities/lib/entityClassification.ts +102 -0
- package/src/modules/sales/commands/documents.ts +46 -0
- package/src/modules/sales/events.ts +20 -2
- package/src/modules/sales/i18n/de.json +2 -1
- package/src/modules/sales/i18n/en.json +2 -1
- package/src/modules/sales/i18n/es.json +2 -1
- package/src/modules/sales/i18n/ko.json +2 -1
- package/src/modules/sales/i18n/pl.json +2 -1
- package/src/modules/sales/workflows.ts +12 -1
- package/src/modules/seeds/README.md +86 -0
- package/src/modules/seeds/cli.ts +220 -0
- package/src/modules/seeds/examples/sample-seed.json +26 -0
- package/src/modules/seeds/index.ts +11 -0
- package/src/modules/workflows/AGENTS.md +851 -10
- package/src/modules/workflows/acl.ts +96 -0
- package/src/modules/workflows/ai-agents.ts +80 -0
- package/src/modules/workflows/ai-tools/authoring-pack.ts +798 -0
- package/src/modules/workflows/ai-tools/types.ts +117 -0
- package/src/modules/workflows/ai-tools.ts +20 -0
- package/src/modules/workflows/api/command-settings/route.ts +171 -0
- package/src/modules/workflows/api/commands/route.ts +109 -0
- package/src/modules/workflows/api/definitions/[id]/callers/route.ts +95 -0
- package/src/modules/workflows/api/definitions/[id]/context-schema/route.ts +187 -0
- package/src/modules/workflows/api/definitions/[id]/customize/route.ts +6 -1
- package/src/modules/workflows/api/definitions/[id]/draft/route.ts +395 -0
- package/src/modules/workflows/api/definitions/[id]/publish/route.ts +250 -0
- package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +5 -0
- package/src/modules/workflows/api/definitions/[id]/route.ts +107 -7
- package/src/modules/workflows/api/definitions/[id]/test-step/route.ts +288 -0
- package/src/modules/workflows/api/definitions/generate/route.ts +335 -0
- package/src/modules/workflows/api/definitions/route.ts +88 -113
- package/src/modules/workflows/api/definitions/serialize.ts +9 -0
- package/src/modules/workflows/api/endpoints/route.ts +88 -0
- package/src/modules/workflows/api/functions/route.ts +91 -0
- package/src/modules/workflows/api/grantable-features/route.ts +102 -0
- package/src/modules/workflows/api/instances/[id]/context/route.ts +214 -0
- package/src/modules/workflows/api/instances/[id]/rerun-step/route.ts +226 -0
- package/src/modules/workflows/api/instances/[id]/retry/route.ts +18 -2
- package/src/modules/workflows/api/instances/[id]/step-through/route.ts +195 -0
- package/src/modules/workflows/api/instances/[id]/steps/route.ts +160 -0
- package/src/modules/workflows/api/instances/[id]/would-do/route.ts +216 -0
- package/src/modules/workflows/api/instances/bulk-replay/route.ts +141 -0
- package/src/modules/workflows/api/instances/failure-queue/route.ts +197 -0
- package/src/modules/workflows/api/instances/route.ts +135 -3
- package/src/modules/workflows/api/metrics/definitions/route.ts +262 -0
- package/src/modules/workflows/api/openapi.ts +549 -2
- package/src/modules/workflows/api/portal/tasks/[id]/complete/route.ts +160 -0
- package/src/modules/workflows/api/portal/tasks/[id]/route.ts +124 -0
- package/src/modules/workflows/api/portal/tasks/route.ts +157 -0
- package/src/modules/workflows/api/rule-usage/route.ts +94 -0
- package/src/modules/workflows/api/task-settings/route.ts +138 -0
- package/src/modules/workflows/api/tasks/[id]/claim/route.ts +42 -17
- package/src/modules/workflows/api/tasks/[id]/complete/route.ts +47 -15
- package/src/modules/workflows/api/tasks/[id]/reassign/route.ts +197 -0
- package/src/modules/workflows/api/tasks/[id]/route.ts +57 -6
- package/src/modules/workflows/api/tasks/[id]/unclaim/route.ts +132 -0
- package/src/modules/workflows/api/tasks/route.ts +60 -5
- package/src/modules/workflows/api/tasks/serialize.ts +119 -0
- package/src/modules/workflows/api/templates/route.ts +87 -0
- package/src/modules/workflows/api/work-inbox/next/route.ts +170 -0
- package/src/modules/workflows/api/work-inbox/route.ts +153 -0
- package/src/modules/workflows/backend/config/workflows/page.meta.ts +33 -0
- package/src/modules/workflows/backend/config/workflows/page.tsx +12 -0
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +19 -343
- package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/create/page.tsx +19 -59
- package/src/modules/workflows/backend/definitions/page.tsx +156 -76
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +3129 -584
- package/src/modules/workflows/backend/instances/[id]/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/[id]/page.tsx +711 -539
- package/src/modules/workflows/backend/instances/failure-queue/page.meta.ts +16 -0
- package/src/modules/workflows/backend/instances/failure-queue/page.tsx +311 -0
- package/src/modules/workflows/backend/instances/page.meta.ts +1 -1
- package/src/modules/workflows/backend/instances/page.tsx +218 -38
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +639 -400
- package/src/modules/workflows/backend/tasks/page.meta.ts +7 -0
- package/src/modules/workflows/backend/tasks/page.tsx +20 -333
- package/src/modules/workflows/backend/work-inbox/page.meta.ts +15 -0
- package/src/modules/workflows/backend/work-inbox/page.tsx +506 -0
- package/src/modules/workflows/cli.ts +1 -1
- package/src/modules/workflows/commands/tasks.ts +146 -0
- package/src/modules/workflows/components/ActivitiesEditor.tsx +91 -114
- package/src/modules/workflows/components/ActivityEditDialog.tsx +244 -0
- package/src/modules/workflows/components/AgentSelector.tsx +200 -0
- package/src/modules/workflows/components/AnnotationEditDialog.tsx +157 -0
- package/src/modules/workflows/components/BusinessRuleUsagePanel.tsx +106 -0
- package/src/modules/workflows/components/BusinessRulesSelector.tsx +71 -17
- package/src/modules/workflows/components/ConfigJsonTextarea.tsx +111 -0
- package/src/modules/workflows/components/ContextSchemaEditor.tsx +165 -0
- package/src/modules/workflows/components/DefinitionErrorHandlerField.tsx +133 -0
- package/src/modules/workflows/components/DefinitionMetadataDrawer.tsx +456 -0
- package/src/modules/workflows/components/DefinitionMetricsCells.tsx +212 -0
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +196 -95
- package/src/modules/workflows/components/EdgeEditDialog.tsx +15 -16
- package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +130 -80
- package/src/modules/workflows/components/InputDataPanel.tsx +177 -0
- package/src/modules/workflows/components/InspectorPanel.tsx +250 -0
- package/src/modules/workflows/components/NodeEditDialog.tsx +444 -38
- package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +848 -178
- package/src/modules/workflows/components/StepsEditor.tsx +9 -2
- package/src/modules/workflows/components/TemplateGalleryDialog.tsx +205 -0
- package/src/modules/workflows/components/TransitionsEditor.tsx +98 -89
- package/src/modules/workflows/components/TriggersDialog.tsx +83 -0
- package/src/modules/workflows/components/TriggersEditor.tsx +363 -0
- package/src/modules/workflows/components/WorkflowAiDraftDialog.tsx +383 -0
- package/src/modules/workflows/components/WorkflowCodeView.tsx +257 -0
- package/src/modules/workflows/components/WorkflowCommandPalette.tsx +82 -0
- package/src/modules/workflows/components/WorkflowCompensationGhostEdge.tsx +78 -0
- package/src/modules/workflows/components/WorkflowDataMappingEdge.tsx +46 -0
- package/src/modules/workflows/components/WorkflowGraph.tsx +54 -1
- package/src/modules/workflows/components/WorkflowGraphImpl.tsx +463 -37
- package/src/modules/workflows/components/WorkflowIconPicker.tsx +144 -0
- package/src/modules/workflows/components/WorkflowLegend.tsx +59 -33
- package/src/modules/workflows/components/WorkflowNodeCard.tsx +355 -28
- package/src/modules/workflows/components/WorkflowRouteChips.tsx +145 -0
- package/src/modules/workflows/components/WorkflowSelector.tsx +33 -14
- package/src/modules/workflows/components/WorkflowTransitionEdge.tsx +83 -10
- package/src/modules/workflows/components/WorkflowTransitionLabel.tsx +13 -2
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +120 -30
- package/src/modules/workflows/components/fields/ActivityConfigFields.tsx +675 -0
- package/src/modules/workflows/components/fields/ActivityTestPanel.tsx +250 -0
- package/src/modules/workflows/components/fields/AgentInvokeConfigField.tsx +580 -0
- package/src/modules/workflows/components/fields/AgentReviewOnBreachField.tsx +88 -0
- package/src/modules/workflows/components/fields/BranchingRoutesEditor.tsx +323 -0
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +36 -4
- package/src/modules/workflows/components/fields/CommandPicker.tsx +158 -0
- package/src/modules/workflows/components/fields/EndpointPicker.tsx +330 -0
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/FunctionPicker.tsx +68 -0
- package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +46 -12
- package/src/modules/workflows/components/fields/PortFieldArrayEditor.tsx +255 -0
- package/src/modules/workflows/components/fields/RolesMultiSelect.tsx +68 -0
- package/src/modules/workflows/components/fields/RouteOrderEditor.tsx +169 -0
- package/src/modules/workflows/components/fields/SchemaBuilderDialog.tsx +139 -0
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +2 -2
- package/src/modules/workflows/components/fields/TaskAssignmentField.tsx +355 -0
- package/src/modules/workflows/components/fields/TaskDeadlineFields.tsx +172 -0
- package/src/modules/workflows/components/fields/TaskDecisionsField.tsx +294 -0
- package/src/modules/workflows/components/fields/TaskEntityBindingsField.tsx +156 -0
- package/src/modules/workflows/components/fields/TemplateTextControl.tsx +85 -0
- package/src/modules/workflows/components/fields/VariablePickerButton.tsx +177 -0
- package/src/modules/workflows/components/fields/ledgerDropTarget.ts +55 -0
- package/src/modules/workflows/components/fields/useActivityTypeOptions.ts +19 -0
- package/src/modules/workflows/components/formConfig.tsx +84 -10
- package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +5 -0
- package/src/modules/workflows/components/mobile/MobileMetadataSheet.tsx +10 -0
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +55 -19
- package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +49 -40
- package/src/modules/workflows/components/nodes/AnnotationGroupNode.tsx +81 -0
- package/src/modules/workflows/components/nodes/AutomatedNode.tsx +34 -17
- package/src/modules/workflows/components/nodes/EndNode.tsx +15 -14
- package/src/modules/workflows/components/nodes/ErrorOutputHandle.tsx +32 -0
- package/src/modules/workflows/components/nodes/IfElseNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/InvokeAgentNode.tsx +180 -0
- package/src/modules/workflows/components/nodes/NodeOutcomeRows.tsx +143 -0
- package/src/modules/workflows/components/nodes/ParallelForkNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/ParallelJoinNode.tsx +28 -15
- package/src/modules/workflows/components/nodes/StartNode.tsx +78 -18
- package/src/modules/workflows/components/nodes/StickyNoteNode.tsx +65 -0
- package/src/modules/workflows/components/nodes/SubWorkflowNode.tsx +124 -23
- package/src/modules/workflows/components/nodes/SwitchNode.tsx +64 -0
- package/src/modules/workflows/components/nodes/TriggerCap.tsx +103 -0
- package/src/modules/workflows/components/nodes/TriggerNode.tsx +151 -0
- package/src/modules/workflows/components/nodes/UserTaskNode.tsx +67 -22
- package/src/modules/workflows/components/nodes/WaitForConditionNode.tsx +74 -0
- package/src/modules/workflows/components/nodes/WaitForSignalNode.tsx +31 -17
- package/src/modules/workflows/components/nodes/WaitForTimerNode.tsx +31 -16
- package/src/modules/workflows/components/nodes/index.ts +17 -0
- package/src/modules/workflows/components/portal/PortalTaskForm.tsx +280 -0
- package/src/modules/workflows/components/run/AgentActivityPanel.tsx +48 -0
- package/src/modules/workflows/components/run/RerunStepDialog.tsx +133 -0
- package/src/modules/workflows/components/run/RunEventBadge.tsx +37 -0
- package/src/modules/workflows/components/run/RunGantt.tsx +180 -0
- package/src/modules/workflows/components/run/RunStatusBadge.tsx +112 -0
- package/src/modules/workflows/components/run/RunStepInspector.tsx +176 -0
- package/src/modules/workflows/components/run/WouldDoReport.tsx +93 -0
- package/src/modules/workflows/components/run/useAgentLabels.ts +42 -0
- package/src/modules/workflows/components/run/useLastRunOverlay.ts +150 -0
- package/src/modules/workflows/components/run/useLiveAgentActions.ts +70 -0
- package/src/modules/workflows/components/run/useLiveRunUpdates.ts +89 -0
- package/src/modules/workflows/components/settings/CommandSettingsPageClient.tsx +228 -0
- package/src/modules/workflows/components/work-inbox/EntityContextPanel.tsx +179 -0
- package/src/modules/workflows/components/work-inbox/ReassignTaskDialog.tsx +203 -0
- package/src/modules/workflows/components/work-inbox/StatusChip.tsx +61 -0
- package/src/modules/workflows/components/work-inbox/TaskActionNotice.tsx +77 -0
- package/src/modules/workflows/components/work-inbox/TaskFormFields.tsx +322 -0
- package/src/modules/workflows/components/work-inbox/WorkInboxEmptyState.tsx +43 -0
- package/src/modules/workflows/data/activity-config-schemas.ts +249 -0
- package/src/modules/workflows/data/activity-config-warnings.ts +71 -0
- package/src/modules/workflows/data/branching-route-warnings.ts +129 -0
- package/src/modules/workflows/data/entities.ts +397 -4
- package/src/modules/workflows/data/metrics-validators.ts +51 -0
- package/src/modules/workflows/data/task-primitives.ts +36 -0
- package/src/modules/workflows/data/types.ts +81 -2
- package/src/modules/workflows/data/validators.ts +729 -60
- package/src/modules/workflows/di.ts +22 -0
- package/src/modules/workflows/events.ts +68 -8
- package/src/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
- package/src/modules/workflows/examples/sales-pipeline-definition.json +35 -35
- package/src/modules/workflows/examples/templates/lead-to-install.json +160 -0
- package/src/modules/workflows/examples/templates/order-approval.json +230 -0
- package/src/modules/workflows/examples/templates/task-escalation.json +110 -0
- package/src/modules/workflows/examples/templates/webhook-integration.json +113 -0
- package/src/modules/workflows/extension-points.ts +1 -1
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.ts +21 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.tsx +212 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.ts +25 -0
- package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.tsx +185 -0
- package/src/modules/workflows/i18n/de.json +1083 -24
- package/src/modules/workflows/i18n/en.json +1081 -22
- package/src/modules/workflows/i18n/es.json +1083 -24
- package/src/modules/workflows/i18n/ko.json +1072 -13
- package/src/modules/workflows/i18n/pl.json +1082 -23
- package/src/modules/workflows/lib/activity-executor.ts +855 -186
- package/src/modules/workflows/lib/activity-queue-types.ts +120 -1
- package/src/modules/workflows/lib/activity-registry-bootstrap.ts +7 -0
- package/src/modules/workflows/lib/activity-registry.ts +89 -0
- package/src/modules/workflows/lib/activity-types.ts +415 -0
- package/src/modules/workflows/lib/activity-worker-handler.ts +744 -35
- package/src/modules/workflows/lib/advanced-config.ts +41 -0
- package/src/modules/workflows/lib/agent-disposition-task.ts +343 -0
- package/src/modules/workflows/lib/agent-outcome-paths.ts +153 -0
- package/src/modules/workflows/lib/agent-result-mapping.ts +88 -0
- package/src/modules/workflows/lib/agent-review-inspector.ts +125 -0
- package/src/modules/workflows/lib/agent-review.ts +171 -0
- package/src/modules/workflows/lib/ai-authoring.ts +402 -0
- package/src/modules/workflows/lib/ai-draft-runner.ts +105 -0
- package/src/modules/workflows/lib/annotation-events.ts +15 -0
- package/src/modules/workflows/lib/branching-routes.ts +280 -0
- package/src/modules/workflows/lib/breach-routing.ts +142 -0
- package/src/modules/workflows/lib/bulk-replay.ts +185 -0
- package/src/modules/workflows/lib/business-rule-usage.ts +154 -0
- package/src/modules/workflows/lib/caller-graph.ts +104 -0
- package/src/modules/workflows/lib/code-view-apply.ts +178 -0
- package/src/modules/workflows/lib/collect-validation-issues.ts +239 -0
- package/src/modules/workflows/lib/compensation-ghosts.ts +134 -0
- package/src/modules/workflows/lib/component-guard.ts +13 -0
- package/src/modules/workflows/lib/condition-handler.ts +658 -0
- package/src/modules/workflows/lib/context-ledger.ts +814 -0
- package/src/modules/workflows/lib/crud-form-dialogs-flag.ts +5 -0
- package/src/modules/workflows/lib/data-edge-mapping.ts +112 -0
- package/src/modules/workflows/lib/definition-context-schema.ts +103 -0
- package/src/modules/workflows/lib/definition-edit-safety.ts +228 -0
- package/src/modules/workflows/lib/definition-error-body.ts +43 -0
- package/src/modules/workflows/lib/definition-evaluation.ts +156 -0
- package/src/modules/workflows/lib/definition-grant.ts +211 -0
- package/src/modules/workflows/lib/definition-json-locations.ts +226 -0
- package/src/modules/workflows/lib/definition-payload.ts +81 -0
- package/src/modules/workflows/lib/draft-restore.ts +72 -0
- package/src/modules/workflows/lib/dry-run.ts +203 -0
- package/src/modules/workflows/lib/duration.ts +138 -24
- package/src/modules/workflows/lib/edge-reattachment.ts +186 -0
- package/src/modules/workflows/lib/edgeFormTransforms.ts +15 -14
- package/src/modules/workflows/lib/editor-annotations.ts +301 -0
- package/src/modules/workflows/lib/editor-commands.ts +205 -0
- package/src/modules/workflows/lib/editor-history.ts +151 -0
- package/src/modules/workflows/lib/endpoint-catalog.ts +283 -0
- package/src/modules/workflows/lib/endpoint-path.ts +134 -0
- package/src/modules/workflows/lib/engine-version.ts +67 -0
- package/src/modules/workflows/lib/error-handler.ts +192 -0
- package/src/modules/workflows/lib/error-routing.ts +236 -0
- package/src/modules/workflows/lib/event-logger.ts +27 -0
- package/src/modules/workflows/lib/expression-refs.ts +291 -0
- package/src/modules/workflows/lib/failure-grouping.ts +134 -0
- package/src/modules/workflows/lib/find-definition.ts +4 -0
- package/src/modules/workflows/lib/flow-logic-warnings.ts +591 -0
- package/src/modules/workflows/lib/graph-utils.ts +620 -110
- package/src/modules/workflows/lib/icon-search.ts +65 -0
- package/src/modules/workflows/lib/insert-at-cursor.ts +53 -0
- package/src/modules/workflows/lib/instance-date-filter.ts +56 -0
- package/src/modules/workflows/lib/interpolation-pipeline.ts +351 -0
- package/src/modules/workflows/lib/ledger-drag.ts +61 -0
- package/src/modules/workflows/lib/ledger-entry-display.ts +89 -0
- package/src/modules/workflows/lib/ledger-schema-flatten.ts +137 -0
- package/src/modules/workflows/lib/metrics/definition-metrics.ts +268 -0
- package/src/modules/workflows/lib/metrics/metrics-display.ts +57 -0
- package/src/modules/workflows/lib/metrics/rollup-schedule.ts +26 -0
- package/src/modules/workflows/lib/metrics/rollup-service.ts +292 -0
- package/src/modules/workflows/lib/node-config-summary.ts +235 -0
- package/src/modules/workflows/lib/node-geometry.ts +168 -0
- package/src/modules/workflows/lib/node-nudge.ts +63 -0
- package/src/modules/workflows/lib/node-outcome-rows.ts +195 -0
- package/src/modules/workflows/lib/node-placement.ts +104 -0
- package/src/modules/workflows/lib/node-type-icons.ts +71 -10
- package/src/modules/workflows/lib/nodeFormTransforms.ts +519 -28
- package/src/modules/workflows/lib/outcome-routing.ts +346 -0
- package/src/modules/workflows/lib/owned-definition.ts +188 -0
- package/src/modules/workflows/lib/owned-node-changes.ts +29 -0
- package/src/modules/workflows/lib/palette-drag.ts +68 -0
- package/src/modules/workflows/lib/palette-drop.ts +114 -0
- package/src/modules/workflows/lib/parallel-handler.ts +79 -2
- package/src/modules/workflows/lib/port-contract.ts +107 -0
- package/src/modules/workflows/lib/portal-task-access.ts +220 -0
- package/src/modules/workflows/lib/rerun-from-step.ts +140 -0
- package/src/modules/workflows/lib/route-chip-events.ts +45 -0
- package/src/modules/workflows/lib/route-chips.ts +177 -0
- package/src/modules/workflows/lib/route-edge.ts +57 -0
- package/src/modules/workflows/lib/route-kinds.ts +166 -0
- package/src/modules/workflows/lib/route-priority.ts +197 -0
- package/src/modules/workflows/lib/run-duration.ts +70 -0
- package/src/modules/workflows/lib/run-event-tone.ts +46 -0
- package/src/modules/workflows/lib/run-execution.ts +598 -0
- package/src/modules/workflows/lib/run-gantt.ts +311 -0
- package/src/modules/workflows/lib/run-outcome-evidence.ts +60 -0
- package/src/modules/workflows/lib/run-outcome.ts +142 -0
- package/src/modules/workflows/lib/sample-resolver.ts +113 -0
- package/src/modules/workflows/lib/seeds.ts +3 -1
- package/src/modules/workflows/lib/server-output-contract.ts +120 -0
- package/src/modules/workflows/lib/set-variable.ts +94 -0
- package/src/modules/workflows/lib/signal-handler.ts +134 -4
- package/src/modules/workflows/lib/start-fixtures.ts +93 -0
- package/src/modules/workflows/lib/status-colors.ts +220 -21
- package/src/modules/workflows/lib/step-handler.ts +744 -68
- package/src/modules/workflows/lib/step-presentation.ts +295 -0
- package/src/modules/workflows/lib/step-through.ts +71 -0
- package/src/modules/workflows/lib/step-type-conversion.ts +263 -0
- package/src/modules/workflows/lib/subgraph-clipboard.ts +214 -0
- package/src/modules/workflows/lib/task-decision-context.ts +76 -0
- package/src/modules/workflows/lib/task-decisions.ts +117 -0
- package/src/modules/workflows/lib/task-entity-access.ts +181 -0
- package/src/modules/workflows/lib/task-entity-aliases.ts +77 -0
- package/src/modules/workflows/lib/task-entity-types.ts +66 -0
- package/src/modules/workflows/lib/task-form-registry.ts +123 -0
- package/src/modules/workflows/lib/task-form-schema.ts +129 -0
- package/src/modules/workflows/lib/task-handler.ts +492 -51
- package/src/modules/workflows/lib/task-inspector-config.ts +348 -0
- package/src/modules/workflows/lib/task-list-query.ts +46 -0
- package/src/modules/workflows/lib/task-notifications.ts +218 -0
- package/src/modules/workflows/lib/task-permission-settings.ts +117 -0
- package/src/modules/workflows/lib/task-presets.ts +95 -0
- package/src/modules/workflows/lib/task-quick-action.ts +111 -0
- package/src/modules/workflows/lib/task-resolution.ts +270 -0
- package/src/modules/workflows/lib/task-sla.ts +628 -0
- package/src/modules/workflows/lib/task-visibility-request.ts +668 -0
- package/src/modules/workflows/lib/task-visibility.ts +627 -0
- package/src/modules/workflows/lib/timer-handler.ts +8 -1
- package/src/modules/workflows/lib/transition-handler.ts +228 -20
- package/src/modules/workflows/lib/trigger-node.ts +272 -0
- package/src/modules/workflows/lib/visual-editor-navigation.ts +29 -0
- package/src/modules/workflows/lib/work-inbox/empty-state.ts +150 -0
- package/src/modules/workflows/lib/work-inbox/entity-links.ts +99 -0
- package/src/modules/workflows/lib/work-inbox/navigation.ts +28 -0
- package/src/modules/workflows/lib/work-inbox/presentation.ts +163 -0
- package/src/modules/workflows/lib/work-inbox/provider.ts +390 -0
- package/src/modules/workflows/lib/work-inbox/query.ts +103 -0
- package/src/modules/workflows/lib/work-inbox/service.ts +122 -0
- package/src/modules/workflows/lib/work-inbox/user-task-source.ts +240 -0
- package/src/modules/workflows/lib/workflow-command-enablement.ts +188 -0
- package/src/modules/workflows/lib/workflow-command-settings.ts +124 -0
- package/src/modules/workflows/lib/workflow-executor.ts +1036 -10
- package/src/modules/workflows/lib/workflow-function-registry.ts +44 -0
- package/src/modules/workflows/lib/workflow-safe-commands.ts +42 -1
- package/src/modules/workflows/lib/workflow-templates.ts +91 -0
- package/src/modules/workflows/migrations/.snapshot-open-mercato.json +2321 -698
- package/src/modules/workflows/migrations/Migration20260626214855_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260626222424_workflows.ts +17 -0
- package/src/modules/workflows/migrations/Migration20260727074335_workflows.ts +15 -0
- package/src/modules/workflows/migrations/Migration20260728104038_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260728163001_workflows.ts +36 -0
- package/src/modules/workflows/migrations/Migration20260729061736_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260729192652_workflows.ts +11 -0
- package/src/modules/workflows/migrations/Migration20260730085000_workflows.ts +13 -0
- package/src/modules/workflows/migrations/Migration20260730092706_workflows.ts +13 -0
- package/src/modules/workflows/notifications.ts +40 -10
- package/src/modules/workflows/setup.ts +128 -0
- package/src/modules/workflows/subscribers/task-assigned-notification.ts +36 -45
- package/src/modules/workflows/subscribers/task-deadline-breached-notification.ts +31 -0
- package/src/modules/workflows/subscribers/task-reminder-notification.ts +31 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.client.tsx +119 -0
- package/src/modules/workflows/widgets/injection/pending-work/widget.ts +27 -0
- package/src/modules/workflows/widgets/injection-table.ts +52 -2
- package/src/modules/workflows/workers/workflow-activities.worker.ts +95 -42
- package/src/modules/workflows/workers/workflow-definition-metric-rollup.worker.ts +71 -0
- package/src/modules/workflows/workers/workflow-instance-bulk-replay.ts +51 -0
- package/src/modules/workflows/workers/workflow-invoke-agent.worker.ts +72 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
const CONVERTIBLE_STEP_TYPES = [
|
|
2
|
+
"userTask",
|
|
3
|
+
"automated",
|
|
4
|
+
"invokeAgent",
|
|
5
|
+
"subWorkflow",
|
|
6
|
+
"waitForSignal",
|
|
7
|
+
"waitForTimer",
|
|
8
|
+
"waitForCondition",
|
|
9
|
+
"ifElse",
|
|
10
|
+
"switch",
|
|
11
|
+
"parallelFork",
|
|
12
|
+
"parallelJoin"
|
|
13
|
+
];
|
|
14
|
+
const SHARED_DATA_KEYS = [
|
|
15
|
+
"label",
|
|
16
|
+
"stepName",
|
|
17
|
+
"description",
|
|
18
|
+
"timeout",
|
|
19
|
+
"retryPolicy",
|
|
20
|
+
"errorDirective",
|
|
21
|
+
"status",
|
|
22
|
+
"stepNumber",
|
|
23
|
+
"stepMetadata"
|
|
24
|
+
];
|
|
25
|
+
const TYPE_DATA_KEYS = {
|
|
26
|
+
userTask: ["assignedTo", "assignedToRoles", "formKey", "userTaskConfig"],
|
|
27
|
+
automated: ["activityType", "activityId", "activities"],
|
|
28
|
+
invokeAgent: ["activityType", "activityId", "activities", "agentId", "signalConfig"],
|
|
29
|
+
subWorkflow: [],
|
|
30
|
+
waitForSignal: ["signalConfig"],
|
|
31
|
+
waitForTimer: [],
|
|
32
|
+
waitForCondition: [],
|
|
33
|
+
parallelFork: [],
|
|
34
|
+
parallelJoin: [],
|
|
35
|
+
ifElse: [],
|
|
36
|
+
switch: []
|
|
37
|
+
};
|
|
38
|
+
const TYPE_CONFIG_KEYS = {
|
|
39
|
+
userTask: [],
|
|
40
|
+
automated: [],
|
|
41
|
+
invokeAgent: [],
|
|
42
|
+
subWorkflow: ["subWorkflowId", "version", "inputMapping", "outputMapping"],
|
|
43
|
+
waitForSignal: [],
|
|
44
|
+
waitForTimer: ["duration", "until"],
|
|
45
|
+
waitForCondition: ["condition", "timeout", "onTimeout", "pollIntervalMs"],
|
|
46
|
+
parallelFork: ["joinStepId"],
|
|
47
|
+
parallelJoin: ["forkStepId"],
|
|
48
|
+
ifElse: [],
|
|
49
|
+
switch: []
|
|
50
|
+
};
|
|
51
|
+
const DEADLINE_SLOTS = {
|
|
52
|
+
waitForSignal: { container: "data", parent: "signalConfig", key: "timeout" },
|
|
53
|
+
waitForCondition: { container: "config", key: "timeout" }
|
|
54
|
+
};
|
|
55
|
+
function isConvertibleStepType(type) {
|
|
56
|
+
return typeof type === "string" && CONVERTIBLE_STEP_TYPES.includes(type);
|
|
57
|
+
}
|
|
58
|
+
function listStepTypeConversionTargets(sourceType) {
|
|
59
|
+
if (!isConvertibleStepType(sourceType)) return [];
|
|
60
|
+
return CONVERTIBLE_STEP_TYPES.filter((candidate) => candidate !== sourceType);
|
|
61
|
+
}
|
|
62
|
+
function listStepTypeConversionOptions(sourceType) {
|
|
63
|
+
if (!isConvertibleStepType(sourceType)) return [];
|
|
64
|
+
return [...CONVERTIBLE_STEP_TYPES];
|
|
65
|
+
}
|
|
66
|
+
function isRecord(value) {
|
|
67
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
68
|
+
}
|
|
69
|
+
function hasKeys(value) {
|
|
70
|
+
return Object.keys(value).length > 0;
|
|
71
|
+
}
|
|
72
|
+
function readDeadline(type, data) {
|
|
73
|
+
const slot = DEADLINE_SLOTS[type];
|
|
74
|
+
if (!slot) return void 0;
|
|
75
|
+
const container = slot.container === "config" ? data.config : slot.parent ? data[slot.parent] : data;
|
|
76
|
+
if (!isRecord(container)) return void 0;
|
|
77
|
+
const value = container[slot.key];
|
|
78
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
79
|
+
}
|
|
80
|
+
function isDeadlineKey(type, container, parent, key) {
|
|
81
|
+
const slot = DEADLINE_SLOTS[type];
|
|
82
|
+
if (!slot) return false;
|
|
83
|
+
return slot.container === container && slot.parent === parent && slot.key === key;
|
|
84
|
+
}
|
|
85
|
+
function writeDeadline(type, data, config, value) {
|
|
86
|
+
const slot = DEADLINE_SLOTS[type];
|
|
87
|
+
if (!slot || value === void 0) return;
|
|
88
|
+
if (slot.container === "config") {
|
|
89
|
+
config[slot.key] = value;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!slot.parent) {
|
|
93
|
+
data[slot.key] = value;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const parent = isRecord(data[slot.parent]) ? { ...data[slot.parent] } : {};
|
|
97
|
+
parent[slot.key] = value;
|
|
98
|
+
data[slot.parent] = parent;
|
|
99
|
+
}
|
|
100
|
+
function convertStepType(step, targetType) {
|
|
101
|
+
const sourceType = step.type;
|
|
102
|
+
if (!isConvertibleStepType(sourceType)) return { ok: false, code: "unsupportedSource" };
|
|
103
|
+
if (!isConvertibleStepType(targetType)) return { ok: false, code: "unsupportedTarget" };
|
|
104
|
+
if (sourceType === targetType) return { ok: false, code: "sameType" };
|
|
105
|
+
const sourceData = isRecord(step.data) ? step.data : {};
|
|
106
|
+
const acceptedDataKeys = /* @__PURE__ */ new Set([...SHARED_DATA_KEYS, ...TYPE_DATA_KEYS[targetType]]);
|
|
107
|
+
const acceptedConfigKeys = new Set(TYPE_CONFIG_KEYS[targetType]);
|
|
108
|
+
const nextData = {};
|
|
109
|
+
const nextConfig = {};
|
|
110
|
+
const quarantine = isRecord(sourceData.unmappedConfig) ? { ...sourceData.unmappedConfig } : {};
|
|
111
|
+
const quarantinedConfig = isRecord(quarantine.config) ? { ...quarantine.config } : {};
|
|
112
|
+
const quarantined = [];
|
|
113
|
+
const deadline = readDeadline(sourceType, sourceData);
|
|
114
|
+
for (const [key, value] of Object.entries(sourceData)) {
|
|
115
|
+
if (key === "unmappedConfig" || key === "badge") continue;
|
|
116
|
+
if (value === void 0) continue;
|
|
117
|
+
if (key === "config") {
|
|
118
|
+
if (!isRecord(value)) continue;
|
|
119
|
+
for (const [configKey, configValue] of Object.entries(value)) {
|
|
120
|
+
if (configValue === void 0) continue;
|
|
121
|
+
if (acceptedConfigKeys.has(configKey)) {
|
|
122
|
+
nextConfig[configKey] = configValue;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (isDeadlineKey(sourceType, "config", void 0, configKey) && DEADLINE_SLOTS[targetType]) continue;
|
|
126
|
+
quarantinedConfig[configKey] = configValue;
|
|
127
|
+
quarantined.push(`config.${configKey}`);
|
|
128
|
+
}
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (acceptedDataKeys.has(key)) {
|
|
132
|
+
nextData[key] = value;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const deadlineSlot = DEADLINE_SLOTS[sourceType];
|
|
136
|
+
if (deadlineSlot && deadlineSlot.container === "data" && deadlineSlot.parent === key && DEADLINE_SLOTS[targetType] && isRecord(value)) {
|
|
137
|
+
const remainder = { ...value };
|
|
138
|
+
delete remainder[deadlineSlot.key];
|
|
139
|
+
if (hasKeys(remainder)) {
|
|
140
|
+
quarantine[key] = remainder;
|
|
141
|
+
quarantined.push(key);
|
|
142
|
+
}
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
quarantine[key] = value;
|
|
146
|
+
quarantined.push(key);
|
|
147
|
+
}
|
|
148
|
+
writeDeadline(targetType, nextData, nextConfig, deadline);
|
|
149
|
+
if (hasKeys(nextConfig)) nextData.config = nextConfig;
|
|
150
|
+
if (hasKeys(quarantinedConfig)) quarantine.config = quarantinedConfig;
|
|
151
|
+
if (hasKeys(quarantine)) nextData.unmappedConfig = quarantine;
|
|
152
|
+
return { ok: true, type: targetType, data: nextData, quarantined };
|
|
153
|
+
}
|
|
154
|
+
function readUnmappedStepConfig(data) {
|
|
155
|
+
if (!isRecord(data)) return null;
|
|
156
|
+
const unmapped = data.unmappedConfig;
|
|
157
|
+
return isRecord(unmapped) && hasKeys(unmapped) ? unmapped : null;
|
|
158
|
+
}
|
|
159
|
+
export {
|
|
160
|
+
CONVERTIBLE_STEP_TYPES,
|
|
161
|
+
convertStepType,
|
|
162
|
+
isConvertibleStepType,
|
|
163
|
+
listStepTypeConversionOptions,
|
|
164
|
+
listStepTypeConversionTargets,
|
|
165
|
+
readUnmappedStepConfig
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=step-type-conversion.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/step-type-conversion.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * In-place step type conversion (spec section 4.5, issue #4237 A9a).\n *\n * \"Change type\u2026\" keeps the step's id, name, position and wiring; config the\n * target type genuinely shares is mapped across, and config it cannot execute\n * is quarantined under `unmappedConfig` \u2014 visible in the inspector, flagged in\n * Problems, never dropped. Restoring a quarantined value is a matter of\n * converting back, which is exactly why nothing may be discarded here.\n *\n * PURE: plain step data in, plain step data out. No React, no ORM, no DI, no\n * xyflow. The editor page owns the actual node mutation.\n *\n * The vocabulary is the editor's node types rather than the definition's\n * `stepType` enum, because that is the granularity an author changes: an\n * `invokeAgent` node compiles to an AUTOMATED step, and converting between the\n * two is a real, meaningful conversion the enum cannot express.\n */\n\nexport type ConvertibleStepType =\n | 'userTask'\n | 'automated'\n | 'invokeAgent'\n | 'subWorkflow'\n | 'waitForSignal'\n | 'waitForTimer'\n | 'waitForCondition'\n | 'parallelFork'\n | 'parallelJoin'\n | 'ifElse'\n | 'switch'\n\n/**\n * START and END are deliberately absent: `validateWorkflowGraph` requires\n * exactly one START and at least one END, so converting either one (or into\n * one) breaks an invariant the author cannot see from the inspector.\n */\nexport const CONVERTIBLE_STEP_TYPES: ConvertibleStepType[] = [\n 'userTask',\n 'automated',\n 'invokeAgent',\n 'subWorkflow',\n 'waitForSignal',\n 'waitForTimer',\n 'waitForCondition',\n 'ifElse',\n 'switch',\n 'parallelFork',\n 'parallelJoin',\n]\n\n/** Step data that describes the step itself, never a single type's behaviour. */\nconst SHARED_DATA_KEYS = [\n 'label',\n 'stepName',\n 'description',\n 'timeout',\n 'retryPolicy',\n 'errorDirective',\n 'status',\n 'stepNumber',\n 'stepMetadata',\n] as const\n\n/** Top-level `node.data` keys each type actually executes. */\nconst TYPE_DATA_KEYS: Record<ConvertibleStepType, readonly string[]> = {\n userTask: ['assignedTo', 'assignedToRoles', 'formKey', 'userTaskConfig'],\n automated: ['activityType', 'activityId', 'activities'],\n invokeAgent: ['activityType', 'activityId', 'activities', 'agentId', 'signalConfig'],\n subWorkflow: [],\n waitForSignal: ['signalConfig'],\n waitForTimer: [],\n waitForCondition: [],\n parallelFork: [],\n parallelJoin: [],\n ifElse: [],\n switch: [],\n}\n\n/** `node.data.config` keys each type actually executes. */\nconst TYPE_CONFIG_KEYS: Record<ConvertibleStepType, readonly string[]> = {\n userTask: [],\n automated: [],\n invokeAgent: [],\n subWorkflow: ['subWorkflowId', 'version', 'inputMapping', 'outputMapping'],\n waitForSignal: [],\n waitForTimer: ['duration', 'until'],\n waitForCondition: ['condition', 'timeout', 'onTimeout', 'pollIntervalMs'],\n parallelFork: ['joinStepId'],\n parallelJoin: ['forkStepId'],\n ifElse: [],\n switch: [],\n}\n\n/**\n * Where a type keeps its \"give up after\" deadline. The two waiting types spell\n * the same ISO-8601 duration differently, so the value travels between them\n * instead of being quarantined. WAIT_FOR_TIMER's `duration` is deliberately not\n * part of this: it is how long to wait ON PURPOSE, not when to give up.\n */\nconst DEADLINE_SLOTS: Partial<Record<ConvertibleStepType, { container: 'data' | 'config'; parent?: string; key: string }>> = {\n waitForSignal: { container: 'data', parent: 'signalConfig', key: 'timeout' },\n waitForCondition: { container: 'config', key: 'timeout' },\n}\n\nexport interface ConvertibleStep {\n type?: string | null\n data?: Record<string, unknown> | null\n}\n\nexport type StepTypeConversionResult =\n | {\n ok: true\n type: ConvertibleStepType\n data: Record<string, unknown>\n /** Config keys moved to `unmappedConfig` by THIS conversion. */\n quarantined: string[]\n }\n | { ok: false; code: 'sameType' | 'unsupportedSource' | 'unsupportedTarget' }\n\nexport function isConvertibleStepType(type: string | null | undefined): type is ConvertibleStepType {\n return typeof type === 'string' && (CONVERTIBLE_STEP_TYPES as string[]).includes(type)\n}\n\n/** Types a step of `sourceType` may be converted into (never itself). */\nexport function listStepTypeConversionTargets(sourceType: string | null | undefined): ConvertibleStepType[] {\n if (!isConvertibleStepType(sourceType)) return []\n return CONVERTIBLE_STEP_TYPES.filter((candidate) => candidate !== sourceType)\n}\n\n/**\n * Every type the inspector's step-type control lists, INCLUDING the step's\n * current one. The control states what the step is today and changes it by\n * picking something else, so an options list that omitted the current type\n * could never render a value for it.\n */\nexport function listStepTypeConversionOptions(sourceType: string | null | undefined): ConvertibleStepType[] {\n if (!isConvertibleStepType(sourceType)) return []\n return [...CONVERTIBLE_STEP_TYPES]\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction hasKeys(value: Record<string, unknown>): boolean {\n return Object.keys(value).length > 0\n}\n\nfunction readDeadline(type: ConvertibleStepType, data: Record<string, unknown>): unknown {\n const slot = DEADLINE_SLOTS[type]\n if (!slot) return undefined\n const container = slot.container === 'config' ? data.config : slot.parent ? data[slot.parent] : data\n if (!isRecord(container)) return undefined\n const value = container[slot.key]\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction isDeadlineKey(type: ConvertibleStepType, container: 'data' | 'config', parent: string | undefined, key: string): boolean {\n const slot = DEADLINE_SLOTS[type]\n if (!slot) return false\n return slot.container === container && slot.parent === parent && slot.key === key\n}\n\nfunction writeDeadline(type: ConvertibleStepType, data: Record<string, unknown>, config: Record<string, unknown>, value: unknown): void {\n const slot = DEADLINE_SLOTS[type]\n if (!slot || value === undefined) return\n if (slot.container === 'config') {\n config[slot.key] = value\n return\n }\n if (!slot.parent) {\n data[slot.key] = value\n return\n }\n const parent = isRecord(data[slot.parent]) ? { ...(data[slot.parent] as Record<string, unknown>) } : {}\n parent[slot.key] = value\n data[slot.parent] = parent\n}\n\n/**\n * Convert one step to another type.\n *\n * Everything the target type executes is carried across, the shared deadline\n * moves between the two waiting types, and every remaining key lands in\n * `data.unmappedConfig` (merged with anything an earlier conversion already\n * quarantined) so a later conversion back can pick it up.\n */\nexport function convertStepType(step: ConvertibleStep, targetType: string): StepTypeConversionResult {\n const sourceType = step.type\n if (!isConvertibleStepType(sourceType)) return { ok: false, code: 'unsupportedSource' }\n if (!isConvertibleStepType(targetType)) return { ok: false, code: 'unsupportedTarget' }\n if (sourceType === targetType) return { ok: false, code: 'sameType' }\n\n const sourceData = isRecord(step.data) ? step.data : {}\n const acceptedDataKeys = new Set<string>([...SHARED_DATA_KEYS, ...TYPE_DATA_KEYS[targetType]])\n const acceptedConfigKeys = new Set<string>(TYPE_CONFIG_KEYS[targetType])\n\n const nextData: Record<string, unknown> = {}\n const nextConfig: Record<string, unknown> = {}\n const quarantine: Record<string, unknown> = isRecord(sourceData.unmappedConfig)\n ? { ...(sourceData.unmappedConfig as Record<string, unknown>) }\n : {}\n const quarantinedConfig: Record<string, unknown> = isRecord(quarantine.config)\n ? { ...(quarantine.config as Record<string, unknown>) }\n : {}\n const quarantined: string[] = []\n\n const deadline = readDeadline(sourceType, sourceData)\n\n for (const [key, value] of Object.entries(sourceData)) {\n if (key === 'unmappedConfig' || key === 'badge') continue\n if (value === undefined) continue\n\n if (key === 'config') {\n if (!isRecord(value)) continue\n for (const [configKey, configValue] of Object.entries(value)) {\n if (configValue === undefined) continue\n if (acceptedConfigKeys.has(configKey)) {\n nextConfig[configKey] = configValue\n continue\n }\n if (isDeadlineKey(sourceType, 'config', undefined, configKey) && DEADLINE_SLOTS[targetType]) continue\n quarantinedConfig[configKey] = configValue\n quarantined.push(`config.${configKey}`)\n }\n continue\n }\n\n if (acceptedDataKeys.has(key)) {\n nextData[key] = value\n continue\n }\n\n const deadlineSlot = DEADLINE_SLOTS[sourceType]\n if (deadlineSlot && deadlineSlot.container === 'data' && deadlineSlot.parent === key && DEADLINE_SLOTS[targetType] && isRecord(value)) {\n const remainder = { ...value }\n delete remainder[deadlineSlot.key]\n if (hasKeys(remainder)) {\n quarantine[key] = remainder\n quarantined.push(key)\n }\n continue\n }\n\n quarantine[key] = value\n quarantined.push(key)\n }\n\n writeDeadline(targetType, nextData, nextConfig, deadline)\n\n if (hasKeys(nextConfig)) nextData.config = nextConfig\n if (hasKeys(quarantinedConfig)) quarantine.config = quarantinedConfig\n if (hasKeys(quarantine)) nextData.unmappedConfig = quarantine\n\n return { ok: true, type: targetType, data: nextData, quarantined }\n}\n\n/** True when a step carries quarantined config the Problems panel should flag. */\nexport function readUnmappedStepConfig(data: unknown): Record<string, unknown> | null {\n if (!isRecord(data)) return null\n const unmapped = data.unmappedConfig\n return isRecord(unmapped) && hasKeys(unmapped) ? unmapped : null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { definitionToGraph, generateStepId, generateTransitionId, graphToDefinition } from "./graph-utils.js";
|
|
2
|
+
import { isDataMappingEdge } from "./data-edge-mapping.js";
|
|
3
|
+
import { isAnnotationNode } from "./editor-annotations.js";
|
|
4
|
+
const WORKFLOW_SUBGRAPH_CLIPBOARD_KIND = "open-mercato.workflow-subgraph";
|
|
5
|
+
const WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION = 1;
|
|
6
|
+
const SUBGRAPH_PASTE_OFFSET = { x: 48, y: 48 };
|
|
7
|
+
function serializeWorkflowSubgraph(nodes, edges, selectedNodeIds) {
|
|
8
|
+
const selected = new Set(selectedNodeIds);
|
|
9
|
+
const selectedNodes = nodes.filter((node) => selected.has(node.id) && !isAnnotationNode(node));
|
|
10
|
+
if (selectedNodes.length === 0) return null;
|
|
11
|
+
const internalEdges = edges.filter(
|
|
12
|
+
(edge) => selected.has(edge.source) && selected.has(edge.target) && !isDataMappingEdge(edge)
|
|
13
|
+
);
|
|
14
|
+
const definition = graphToDefinition(selectedNodes, internalEdges, { includePositions: true });
|
|
15
|
+
return {
|
|
16
|
+
kind: WORKFLOW_SUBGRAPH_CLIPBOARD_KIND,
|
|
17
|
+
version: WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION,
|
|
18
|
+
steps: definition.steps,
|
|
19
|
+
transitions: definition.transitions
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function stringifyWorkflowSubgraph(payload) {
|
|
23
|
+
return JSON.stringify(payload, null, 2);
|
|
24
|
+
}
|
|
25
|
+
function parseWorkflowSubgraph(text) {
|
|
26
|
+
let parsed;
|
|
27
|
+
try {
|
|
28
|
+
parsed = JSON.parse(text);
|
|
29
|
+
} catch {
|
|
30
|
+
return { ok: false, code: "invalidJson" };
|
|
31
|
+
}
|
|
32
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
33
|
+
return { ok: false, code: "unsupportedFormat" };
|
|
34
|
+
}
|
|
35
|
+
const candidate = parsed;
|
|
36
|
+
if (candidate.kind !== WORKFLOW_SUBGRAPH_CLIPBOARD_KIND) {
|
|
37
|
+
return { ok: false, code: "unsupportedFormat" };
|
|
38
|
+
}
|
|
39
|
+
if (candidate.version !== WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION) {
|
|
40
|
+
return { ok: false, code: "unsupportedFormat" };
|
|
41
|
+
}
|
|
42
|
+
const steps = candidate.steps;
|
|
43
|
+
const transitions = candidate.transitions;
|
|
44
|
+
if (!Array.isArray(steps) || !Array.isArray(transitions)) {
|
|
45
|
+
return { ok: false, code: "unsupportedFormat" };
|
|
46
|
+
}
|
|
47
|
+
if (steps.length === 0) return { ok: false, code: "empty" };
|
|
48
|
+
return {
|
|
49
|
+
ok: true,
|
|
50
|
+
payload: {
|
|
51
|
+
kind: WORKFLOW_SUBGRAPH_CLIPBOARD_KIND,
|
|
52
|
+
version: WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION,
|
|
53
|
+
steps,
|
|
54
|
+
transitions
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function deriveStepIdPrefix(stepId) {
|
|
59
|
+
const withoutGeneratedSuffix = stepId.replace(/_\d{9,}_[a-z0-9]+$/i, "");
|
|
60
|
+
const prefix = withoutGeneratedSuffix.trim();
|
|
61
|
+
return prefix.length > 0 ? prefix : "step";
|
|
62
|
+
}
|
|
63
|
+
function pasteWorkflowSubgraph(nodes, edges, payload, options = {}) {
|
|
64
|
+
const offset = options.offset ?? SUBGRAPH_PASTE_OFFSET;
|
|
65
|
+
const existingIds = new Set(nodes.map((node) => node.id));
|
|
66
|
+
const stepIdMap = /* @__PURE__ */ new Map();
|
|
67
|
+
for (const step of payload.steps) {
|
|
68
|
+
let nextId = generateStepId(deriveStepIdPrefix(step.stepId));
|
|
69
|
+
while (existingIds.has(nextId) || stepIdMap.has(nextId)) {
|
|
70
|
+
nextId = generateStepId(deriveStepIdPrefix(step.stepId));
|
|
71
|
+
}
|
|
72
|
+
existingIds.add(nextId);
|
|
73
|
+
stepIdMap.set(step.stepId, nextId);
|
|
74
|
+
}
|
|
75
|
+
const rebasedSteps = payload.steps.map((step) => ({
|
|
76
|
+
...step,
|
|
77
|
+
stepId: stepIdMap.get(step.stepId)
|
|
78
|
+
}));
|
|
79
|
+
const rebasedTransitions = payload.transitions.filter((transition) => stepIdMap.has(transition.fromStepId) && stepIdMap.has(transition.toStepId)).map((transition) => ({
|
|
80
|
+
...transition,
|
|
81
|
+
transitionId: generateTransitionId(),
|
|
82
|
+
fromStepId: stepIdMap.get(transition.fromStepId),
|
|
83
|
+
toStepId: stepIdMap.get(transition.toStepId)
|
|
84
|
+
}));
|
|
85
|
+
const graph = definitionToGraph({
|
|
86
|
+
steps: rebasedSteps,
|
|
87
|
+
transitions: rebasedTransitions
|
|
88
|
+
});
|
|
89
|
+
const pastedNodes = graph.nodes.map((node) => {
|
|
90
|
+
const data = { ...node.data };
|
|
91
|
+
delete data.stepNumber;
|
|
92
|
+
return {
|
|
93
|
+
...node,
|
|
94
|
+
position: { x: node.position.x + offset.x, y: node.position.y + offset.y },
|
|
95
|
+
selected: true,
|
|
96
|
+
data
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
return {
|
|
100
|
+
nodes: [...nodes.map((node) => node.selected ? { ...node, selected: false } : node), ...pastedNodes],
|
|
101
|
+
edges: [...edges, ...graph.edges],
|
|
102
|
+
pastedNodeIds: pastedNodes.map((node) => node.id)
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export {
|
|
106
|
+
SUBGRAPH_PASTE_OFFSET,
|
|
107
|
+
WORKFLOW_SUBGRAPH_CLIPBOARD_KIND,
|
|
108
|
+
WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION,
|
|
109
|
+
parseWorkflowSubgraph,
|
|
110
|
+
pasteWorkflowSubgraph,
|
|
111
|
+
serializeWorkflowSubgraph,
|
|
112
|
+
stringifyWorkflowSubgraph
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=subgraph-clipboard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/subgraph-clipboard.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Portable-JSON subgraph clipboard (spec section 4.5).\n *\n * \"Multi-select \u2192 portable-JSON subgraph on the clipboard; paste re-IDs and\n * splices; works across workflows and into the Code view.\"\n *\n * The payload speaks the DEFINITION vocabulary (`steps` + `transitions`), not\n * React Flow's nodes and edges: the Code view renders the definition JSON, so a\n * fragment copied from the canvas has to be the same shape a fragment copied out\n * of the Code view is \u2014 otherwise the two surfaces could not exchange anything.\n * Positions ride along as `_editorPosition`, exactly as a saved definition\n * carries them.\n *\n * Only transitions INTERNAL to the selection travel. A route with one endpoint\n * outside the selection describes a connection to a step that is not in the\n * payload, so pasting it could only invent a dangling id.\n *\n * PURE: plain data in, plain data out. Clipboard access, translation and flash\n * messages belong to the page.\n */\n\nimport type { Node, Edge } from '@xyflow/react'\nimport type { WorkflowDefinition } from '../data/entities'\nimport { definitionToGraph, generateStepId, generateTransitionId, graphToDefinition } from './graph-utils'\nimport { isDataMappingEdge } from './data-edge-mapping'\nimport { isAnnotationNode } from './editor-annotations'\n\n/** Format discriminator. Written by the canvas and by the Code view alike. */\nexport const WORKFLOW_SUBGRAPH_CLIPBOARD_KIND = 'open-mercato.workflow-subgraph'\n\n/** Bumped only for a breaking payload change; readers refuse what they do not know. */\nexport const WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION = 1\n\n/** How far a pasted copy lands from the original, in flow units. */\nexport const SUBGRAPH_PASTE_OFFSET = { x: 48, y: 48 }\n\ntype DefinitionStep = WorkflowDefinition['definition']['steps'][number]\ntype DefinitionTransition = WorkflowDefinition['definition']['transitions'][number]\n\nexport interface WorkflowSubgraphClipboard {\n kind: typeof WORKFLOW_SUBGRAPH_CLIPBOARD_KIND\n version: typeof WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION\n steps: DefinitionStep[]\n transitions: DefinitionTransition[]\n}\n\nexport type SubgraphClipboardParseFailure =\n | { ok: false; code: 'invalidJson' }\n | { ok: false; code: 'unsupportedFormat' }\n | { ok: false; code: 'empty' }\n\nexport type SubgraphClipboardParseResult =\n | { ok: true; payload: WorkflowSubgraphClipboard }\n | SubgraphClipboardParseFailure\n\nexport interface SubgraphPasteResult {\n nodes: Node[]\n edges: Edge[]\n /** Ids of the freshly minted steps, so the caller can select what it pasted. */\n pastedNodeIds: string[]\n}\n\n/**\n * Serialize the selected steps and the routes strictly between them.\n *\n * Returns `null` when the selection holds no step: a clipboard payload with no\n * steps has nothing to splice, and writing one would silently clear whatever the\n * author copied earlier.\n */\nexport function serializeWorkflowSubgraph(\n nodes: Node[],\n edges: Edge[],\n selectedNodeIds: string[],\n): WorkflowSubgraphClipboard | null {\n const selected = new Set(selectedNodeIds)\n // Annotations never travel on the clipboard: the payload speaks the definition\n // vocabulary, and a note has no definition form to speak.\n const selectedNodes = nodes.filter((node) => selected.has(node.id) && !isAnnotationNode(node))\n if (selectedNodes.length === 0) return null\n\n const internalEdges = edges.filter(\n (edge) => selected.has(edge.source) && selected.has(edge.target) && !isDataMappingEdge(edge),\n )\n const definition = graphToDefinition(selectedNodes, internalEdges, { includePositions: true })\n\n return {\n kind: WORKFLOW_SUBGRAPH_CLIPBOARD_KIND,\n version: WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION,\n steps: definition.steps,\n transitions: definition.transitions,\n }\n}\n\nexport function stringifyWorkflowSubgraph(payload: WorkflowSubgraphClipboard): string {\n return JSON.stringify(payload, null, 2)\n}\n\n/** Read a clipboard payload, refusing anything that is not this exact format. */\nexport function parseWorkflowSubgraph(text: string): SubgraphClipboardParseResult {\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n return { ok: false, code: 'invalidJson' }\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { ok: false, code: 'unsupportedFormat' }\n }\n const candidate = parsed as Record<string, unknown>\n if (candidate.kind !== WORKFLOW_SUBGRAPH_CLIPBOARD_KIND) {\n return { ok: false, code: 'unsupportedFormat' }\n }\n if (candidate.version !== WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION) {\n return { ok: false, code: 'unsupportedFormat' }\n }\n const steps = candidate.steps\n const transitions = candidate.transitions\n if (!Array.isArray(steps) || !Array.isArray(transitions)) {\n return { ok: false, code: 'unsupportedFormat' }\n }\n if (steps.length === 0) return { ok: false, code: 'empty' }\n\n return {\n ok: true,\n payload: {\n kind: WORKFLOW_SUBGRAPH_CLIPBOARD_KIND,\n version: WORKFLOW_SUBGRAPH_CLIPBOARD_VERSION,\n steps: steps as DefinitionStep[],\n transitions: transitions as DefinitionTransition[],\n },\n }\n}\n\n/**\n * Keep the meaningful part of a generated step id so a paste of `userTask_1753\u2026`\n * stays recognisably a user task instead of turning into `step_\u2026`, without the\n * id growing a suffix on every paste.\n */\nfunction deriveStepIdPrefix(stepId: string): string {\n const withoutGeneratedSuffix = stepId.replace(/_\\d{9,}_[a-z0-9]+$/i, '')\n const prefix = withoutGeneratedSuffix.trim()\n return prefix.length > 0 ? prefix : 'step'\n}\n\nexport interface SubgraphPasteOptions {\n /** Flow-space translation applied to every pasted step. */\n offset?: { x: number; y: number }\n}\n\n/**\n * Splice a clipboard payload into the graph.\n *\n * Every step and every transition is re-IDed, so pasting into the workflow the\n * fragment came from can never collide with \u2014 or silently merge into \u2014 the\n * original. Internal routes are rewired onto the new ids; the copies land offset\n * from the originals so the paste is visible rather than hidden underneath them.\n */\nexport function pasteWorkflowSubgraph(\n nodes: Node[],\n edges: Edge[],\n payload: WorkflowSubgraphClipboard,\n options: SubgraphPasteOptions = {},\n): SubgraphPasteResult {\n const offset = options.offset ?? SUBGRAPH_PASTE_OFFSET\n const existingIds = new Set(nodes.map((node) => node.id))\n\n const stepIdMap = new Map<string, string>()\n for (const step of payload.steps) {\n let nextId = generateStepId(deriveStepIdPrefix(step.stepId))\n while (existingIds.has(nextId) || stepIdMap.has(nextId)) {\n nextId = generateStepId(deriveStepIdPrefix(step.stepId))\n }\n existingIds.add(nextId)\n stepIdMap.set(step.stepId, nextId)\n }\n\n const rebasedSteps = payload.steps.map((step) => ({\n ...step,\n stepId: stepIdMap.get(step.stepId) as string,\n }))\n\n const rebasedTransitions = payload.transitions\n .filter((transition) => stepIdMap.has(transition.fromStepId) && stepIdMap.has(transition.toStepId))\n .map((transition) => ({\n ...transition,\n transitionId: generateTransitionId(),\n fromStepId: stepIdMap.get(transition.fromStepId) as string,\n toStepId: stepIdMap.get(transition.toStepId) as string,\n }))\n\n const graph = definitionToGraph({\n steps: rebasedSteps,\n transitions: rebasedTransitions,\n } as WorkflowDefinition['definition'])\n\n const pastedNodes = graph.nodes.map((node) => {\n // The running step number is derived from a node's index in the whole graph,\n // so a fragment's own numbering would be a lie once it is spliced in.\n const data = { ...(node.data as Record<string, unknown>) }\n delete data.stepNumber\n return {\n ...node,\n position: { x: node.position.x + offset.x, y: node.position.y + offset.y },\n selected: true,\n data,\n }\n })\n\n return {\n nodes: [...nodes.map((node) => (node.selected ? { ...node, selected: false } : node)), ...pastedNodes],\n edges: [...edges, ...graph.edges],\n pastedNodeIds: pastedNodes.map((node) => node.id),\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { StepInstance, WorkflowInstance } from "../data/entities.js";
|
|
2
|
+
import { findDefinitionForInstance } from "./find-definition.js";
|
|
3
|
+
import { readAuthoredTaskDecisions } from "./task-decisions.js";
|
|
4
|
+
import { resolveTaskDecisions } from "./task-resolution.js";
|
|
5
|
+
const EMPTY_TASK_DECISION_CONTEXT = {
|
|
6
|
+
stepId: null,
|
|
7
|
+
decisions: [],
|
|
8
|
+
formKey: null
|
|
9
|
+
};
|
|
10
|
+
async function loadTaskDecisionContext(em, task) {
|
|
11
|
+
const instance = await em.findOne(WorkflowInstance, { id: task.workflowInstanceId });
|
|
12
|
+
if (!instance) return EMPTY_TASK_DECISION_CONTEXT;
|
|
13
|
+
const stepInstance = await em.findOne(StepInstance, { id: task.stepInstanceId });
|
|
14
|
+
if (!stepInstance) return EMPTY_TASK_DECISION_CONTEXT;
|
|
15
|
+
const definition = await findDefinitionForInstance(em, instance);
|
|
16
|
+
if (!definition) return { stepId: stepInstance.stepId, decisions: [], formKey: null };
|
|
17
|
+
const formKey = readAuthoredTaskFormKey(definition.definition, stepInstance.stepId);
|
|
18
|
+
const authored = readAuthoredTaskDecisions(definition.definition, stepInstance.stepId);
|
|
19
|
+
if (!authored.length) return { stepId: stepInstance.stepId, decisions: [], formKey };
|
|
20
|
+
const { interpolateVariables } = await import("./activity-executor.js");
|
|
21
|
+
const interpolate = (value) => interpolateVariables(value, instance.context ?? {}, instance);
|
|
22
|
+
return {
|
|
23
|
+
stepId: stepInstance.stepId,
|
|
24
|
+
decisions: resolveTaskDecisions(authored, interpolate),
|
|
25
|
+
formKey
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function readAuthoredTaskFormKey(definition, stepId) {
|
|
29
|
+
const steps = definition?.steps;
|
|
30
|
+
const step = (steps ?? []).find((candidate) => candidate.stepId === stepId);
|
|
31
|
+
const formKey = step?.userTaskConfig?.formKey;
|
|
32
|
+
return typeof formKey === "string" && formKey.length > 0 ? formKey : null;
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
EMPTY_TASK_DECISION_CONTEXT,
|
|
36
|
+
loadTaskDecisionContext
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=task-decision-context.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/task-decision-context.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Re-resolving a task's decision buttons from its instance's pinned definition.\n *\n * Separated from the pure `lib/task-decisions.ts` because it needs the ORM: the\n * task surfaces (a client page, a record-page widget) import the pure half, and\n * only the server imports this one.\n */\n\nimport type { EntityManager } from '@mikro-orm/core'\nimport { StepInstance, WorkflowInstance } from '../data/entities'\nimport type { UserTask } from '../data/entities'\nimport { findDefinitionForInstance } from './find-definition'\nimport { readAuthoredTaskDecisions } from './task-decisions'\nimport { resolveTaskDecisions } from './task-resolution'\nimport type { ResolvedTaskDecision, TaskInterpolate } from './task-resolution'\n\nexport type TaskDecisionContext = {\n stepId: string | null\n decisions: ResolvedTaskDecision[]\n /**\n * Authored `userTaskConfig.formKey`, resolved the same way the decisions are:\n * from the instance's PINNED definition, never from a column. A task form is\n * a rendering choice, so re-reading it per request is what lets a definition\n * that gains a renderer key start using it \u2014 and it needs no migration.\n */\n formKey: string | null\n}\n\nexport const EMPTY_TASK_DECISION_CONTEXT: TaskDecisionContext = {\n stepId: null,\n decisions: [],\n formKey: null,\n}\n\n/**\n * Re-resolve a task's decision buttons from its instance's pinned definition.\n *\n * Degrades to an empty list at every step \u2014 a task whose instance, step or\n * definition has gone missing still completes through the plain form, which is\n * exactly how every task behaved before decisions existed.\n */\nexport async function loadTaskDecisionContext(\n em: EntityManager,\n task: Pick<UserTask, 'workflowInstanceId' | 'stepInstanceId'>,\n): Promise<TaskDecisionContext> {\n const instance = await em.findOne(WorkflowInstance, { id: task.workflowInstanceId })\n if (!instance) return EMPTY_TASK_DECISION_CONTEXT\n\n const stepInstance = await em.findOne(StepInstance, { id: task.stepInstanceId })\n if (!stepInstance) return EMPTY_TASK_DECISION_CONTEXT\n\n const definition = await findDefinitionForInstance(em, instance)\n if (!definition) return { stepId: stepInstance.stepId, decisions: [], formKey: null }\n\n const formKey = readAuthoredTaskFormKey(definition.definition, stepInstance.stepId)\n const authored = readAuthoredTaskDecisions(definition.definition, stepInstance.stepId)\n if (!authored.length) return { stepId: stepInstance.stepId, decisions: [], formKey }\n\n const { interpolateVariables } = await import('./activity-executor')\n const interpolate: TaskInterpolate = (value) =>\n interpolateVariables(value, instance.context ?? {}, instance)\n\n return {\n stepId: stepInstance.stepId,\n decisions: resolveTaskDecisions(authored, interpolate),\n formKey,\n }\n}\n\nfunction readAuthoredTaskFormKey(definition: unknown, stepId: string): string | null {\n const steps = (definition as { steps?: { stepId?: string; userTaskConfig?: { formKey?: unknown } }[] })\n ?.steps\n const step = (steps ?? []).find((candidate) => candidate.stepId === stepId)\n const formKey = step?.userTaskConfig?.formKey\n return typeof formKey === 'string' && formKey.length > 0 ? formKey : null\n}\n"],
|
|
5
|
+
"mappings": "AASA,SAAS,cAAc,wBAAwB;AAE/C,SAAS,iCAAiC;AAC1C,SAAS,iCAAiC;AAC1C,SAAS,4BAA4B;AAe9B,MAAM,8BAAmD;AAAA,EAC9D,QAAQ;AAAA,EACR,WAAW,CAAC;AAAA,EACZ,SAAS;AACX;AASA,eAAsB,wBACpB,IACA,MAC8B;AAC9B,QAAM,WAAW,MAAM,GAAG,QAAQ,kBAAkB,EAAE,IAAI,KAAK,mBAAmB,CAAC;AACnF,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,eAAe,MAAM,GAAG,QAAQ,cAAc,EAAE,IAAI,KAAK,eAAe,CAAC;AAC/E,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,aAAa,MAAM,0BAA0B,IAAI,QAAQ;AAC/D,MAAI,CAAC,WAAY,QAAO,EAAE,QAAQ,aAAa,QAAQ,WAAW,CAAC,GAAG,SAAS,KAAK;AAEpF,QAAM,UAAU,wBAAwB,WAAW,YAAY,aAAa,MAAM;AAClF,QAAM,WAAW,0BAA0B,WAAW,YAAY,aAAa,MAAM;AACrF,MAAI,CAAC,SAAS,OAAQ,QAAO,EAAE,QAAQ,aAAa,QAAQ,WAAW,CAAC,GAAG,QAAQ;AAEnF,QAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,qBAAqB;AACnE,QAAM,cAA+B,CAAC,UACpC,qBAAqB,OAAO,SAAS,WAAW,CAAC,GAAG,QAAQ;AAE9D,SAAO;AAAA,IACL,QAAQ,aAAa;AAAA,IACrB,WAAW,qBAAqB,UAAU,WAAW;AAAA,IACrD;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,YAAqB,QAA+B;AACnF,QAAM,QAAS,YACX;AACJ,QAAM,QAAQ,SAAS,CAAC,GAAG,KAAK,CAAC,cAAc,UAAU,WAAW,MAAM;AAC1E,QAAM,UAAU,MAAM,gBAAgB;AACtC,SAAO,OAAO,YAAY,YAAY,QAAQ,SAAS,IAAI,UAAU;AACvE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { excludeNonNormalTransitions } from "./route-kinds.js";
|
|
2
|
+
const TASK_DECISION_FORM_KEY = "__decision";
|
|
3
|
+
function findTaskDecision(decisions, decisionId) {
|
|
4
|
+
return decisions.find((decision) => decision.id === decisionId) ?? null;
|
|
5
|
+
}
|
|
6
|
+
function findTaskDecisionTransition(transitions, transitionId, fromStepId) {
|
|
7
|
+
if (!transitions?.length) return null;
|
|
8
|
+
const candidates = excludeNonNormalTransitions(transitions);
|
|
9
|
+
return candidates.find(
|
|
10
|
+
(transition) => transition.transitionId === transitionId && transition.fromStepId === fromStepId
|
|
11
|
+
) ?? null;
|
|
12
|
+
}
|
|
13
|
+
function withRecordedDecision(formData, decisionId) {
|
|
14
|
+
if (!decisionId) return formData;
|
|
15
|
+
return { ...formData, [TASK_DECISION_FORM_KEY]: decisionId };
|
|
16
|
+
}
|
|
17
|
+
function readRecordedDecision(formData) {
|
|
18
|
+
if (!formData || typeof formData !== "object" || Array.isArray(formData)) return null;
|
|
19
|
+
const value = formData[TASK_DECISION_FORM_KEY];
|
|
20
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
21
|
+
}
|
|
22
|
+
function readAuthoredTaskDecisions(definitionData, stepId) {
|
|
23
|
+
if (!definitionData || typeof definitionData !== "object") return [];
|
|
24
|
+
const steps = definitionData.steps;
|
|
25
|
+
if (!Array.isArray(steps)) return [];
|
|
26
|
+
const step = steps.find(
|
|
27
|
+
(candidate) => !!candidate && typeof candidate === "object" && candidate.stepId === stepId
|
|
28
|
+
);
|
|
29
|
+
const authored = step?.userTaskConfig?.decisions;
|
|
30
|
+
if (!Array.isArray(authored)) return [];
|
|
31
|
+
const decisions = [];
|
|
32
|
+
for (const entry of authored) {
|
|
33
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) continue;
|
|
34
|
+
const candidate = entry;
|
|
35
|
+
if (typeof candidate.id !== "string" || !candidate.id.length) continue;
|
|
36
|
+
if (typeof candidate.transitionId !== "string" || !candidate.transitionId.length) continue;
|
|
37
|
+
decisions.push(candidate);
|
|
38
|
+
}
|
|
39
|
+
return decisions;
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
TASK_DECISION_FORM_KEY,
|
|
43
|
+
findTaskDecision,
|
|
44
|
+
findTaskDecisionTransition,
|
|
45
|
+
readAuthoredTaskDecisions,
|
|
46
|
+
readRecordedDecision,
|
|
47
|
+
withRecordedDecision
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=task-decisions.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/task-decisions.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Decision buttons on a task: the CHOICE and the routing rules (PURE).\n *\n * Rendering the list and recording the press are two different requirements\n * wearing one name, and they are stored differently on purpose (run checkpoint\n * 2, decision #2):\n *\n * - **The list is derived state.** A task reaches its config through\n * `workflowInstanceId -> definition -> step.userTaskConfig.decisions`, and an\n * instance PINS its definition row, so re-resolving it per request is always\n * correct and needs no column. `lib/task-decision-context.ts` does that\n * resolution (it needs the ORM); everything here stays free of it so the task\n * surfaces can import the reserved key and the readers without dragging the\n * entity graph into a client bundle.\n * - **The choice is an audit fact about the completion**, with a different\n * lifetime from the list. It is written into the completion payload that\n * already exists (`user_tasks.form_data`, under `TASK_DECISION_FORM_KEY`) and\n * into the `USER_TASK_COMPLETED` event, rather than into a new column.\n */\n\nimport type { TaskDecision } from '../data/validators'\nimport { excludeNonNormalTransitions } from './route-kinds'\nimport type { ResolvedTaskDecision } from './task-resolution'\n\n/**\n * Reserved key the chosen decision id is recorded under inside the completion\n * `formData`. Prefixed like the engine's other reserved context key\n * (`context.__error`) so it cannot collide with an authored form field, and so\n * a downstream route condition can branch on the operator's choice once the\n * form data is merged into the run context.\n */\nexport const TASK_DECISION_FORM_KEY = '__decision'\n\nexport type TaskDecisionTransitionLike = {\n transitionId?: string\n fromStepId?: string\n toStepId?: string\n kind?: string\n}\n\nexport function findTaskDecision(\n decisions: ResolvedTaskDecision[],\n decisionId: string,\n): ResolvedTaskDecision | null {\n return decisions.find((decision) => decision.id === decisionId) ?? null\n}\n\n/**\n * The outgoing route a decision selects.\n *\n * Matched on the transition's DURABLE id and constrained to routes leaving the\n * step the task is parked on \u2014 a decision may never send the run down a route\n * that does not start where the run currently is. Error routes are excluded for\n * the same reason every other routing lookup excludes them: they are reachable\n * only from a failure, never from a button.\n */\nexport function findTaskDecisionTransition<T extends TaskDecisionTransitionLike>(\n transitions: T[] | undefined | null,\n transitionId: string,\n fromStepId: string,\n): T | null {\n if (!transitions?.length) return null\n const candidates = excludeNonNormalTransitions(transitions)\n return (\n candidates.find(\n (transition) =>\n transition.transitionId === transitionId && transition.fromStepId === fromStepId,\n ) ?? null\n )\n}\n\n/** Record the chosen decision inside the completion payload that already exists. */\nexport function withRecordedDecision(\n formData: Record<string, unknown>,\n decisionId: string | null | undefined,\n): Record<string, unknown> {\n if (!decisionId) return formData\n return { ...formData, [TASK_DECISION_FORM_KEY]: decisionId }\n}\n\n/** The decision id a completed task recorded, when it recorded one. */\nexport function readRecordedDecision(formData: unknown): string | null {\n if (!formData || typeof formData !== 'object' || Array.isArray(formData)) return null\n const value = (formData as Record<string, unknown>)[TASK_DECISION_FORM_KEY]\n return typeof value === 'string' && value.length > 0 ? value : null\n}\n\n/**\n * Decisions as authored, narrowed structurally.\n *\n * A definition row is validated on save, but code-registry definitions never\n * pass through zod, so an entry missing its id or its route binding is dropped\n * here rather than rendered as a button that can only fail.\n */\nexport function readAuthoredTaskDecisions(definitionData: unknown, stepId: string): TaskDecision[] {\n if (!definitionData || typeof definitionData !== 'object') return []\n const steps = (definitionData as { steps?: unknown }).steps\n if (!Array.isArray(steps)) return []\n const step = steps.find(\n (candidate) =>\n !!candidate &&\n typeof candidate === 'object' &&\n (candidate as { stepId?: unknown }).stepId === stepId,\n ) as { userTaskConfig?: { decisions?: unknown } } | undefined\n const authored = step?.userTaskConfig?.decisions\n if (!Array.isArray(authored)) return []\n\n const decisions: TaskDecision[] = []\n for (const entry of authored) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue\n const candidate = entry as Record<string, unknown>\n if (typeof candidate.id !== 'string' || !candidate.id.length) continue\n if (typeof candidate.transitionId !== 'string' || !candidate.transitionId.length) continue\n decisions.push(candidate as unknown as TaskDecision)\n }\n return decisions\n}\n"],
|
|
5
|
+
"mappings": "AAqBA,SAAS,mCAAmC;AAUrC,MAAM,yBAAyB;AAS/B,SAAS,iBACd,WACA,YAC6B;AAC7B,SAAO,UAAU,KAAK,CAAC,aAAa,SAAS,OAAO,UAAU,KAAK;AACrE;AAWO,SAAS,2BACd,aACA,cACA,YACU;AACV,MAAI,CAAC,aAAa,OAAQ,QAAO;AACjC,QAAM,aAAa,4BAA4B,WAAW;AAC1D,SACE,WAAW;AAAA,IACT,CAAC,eACC,WAAW,iBAAiB,gBAAgB,WAAW,eAAe;AAAA,EAC1E,KAAK;AAET;AAGO,SAAS,qBACd,UACA,YACyB;AACzB,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,EAAE,GAAG,UAAU,CAAC,sBAAsB,GAAG,WAAW;AAC7D;AAGO,SAAS,qBAAqB,UAAkC;AACrE,MAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACjF,QAAM,QAAS,SAAqC,sBAAsB;AAC1E,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AASO,SAAS,0BAA0B,gBAAyB,QAAgC;AACjG,MAAI,CAAC,kBAAkB,OAAO,mBAAmB,SAAU,QAAO,CAAC;AACnE,QAAM,QAAS,eAAuC;AACtD,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,QAAM,OAAO,MAAM;AAAA,IACjB,CAAC,cACC,CAAC,CAAC,aACF,OAAO,cAAc,YACpB,UAAmC,WAAW;AAAA,EACnD;AACA,QAAM,WAAW,MAAM,gBAAgB;AACvC,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO,CAAC;AAEtC,QAAM,YAA4B,CAAC;AACnC,aAAW,SAAS,UAAU;AAC5B,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG;AACjE,UAAM,YAAY;AAClB,QAAI,OAAO,UAAU,OAAO,YAAY,CAAC,UAAU,GAAG,OAAQ;AAC9D,QAAI,OAAO,UAAU,iBAAiB,YAAY,CAAC,UAAU,aAAa,OAAQ;AAClF,cAAU,KAAK,SAAoC;AAAA,EACrD;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { classifyRecordsEntity } from "@open-mercato/core/modules/entities/lib/entityClassification";
|
|
2
|
+
import { resolveEntityAclRequirement } from "@open-mercato/core/modules/entities/lib/entityAcl";
|
|
3
|
+
import {
|
|
4
|
+
RECORDS_VIEW_FEATURE,
|
|
5
|
+
deriveCustomEntityRecordFeature
|
|
6
|
+
} from "@open-mercato/core/modules/entities/lib/recordFeatures";
|
|
7
|
+
import {
|
|
8
|
+
normalizeTaskEntityTypeSpelling,
|
|
9
|
+
normalizeTaskEntityTypeToEntityId
|
|
10
|
+
} from "./task-entity-types.js";
|
|
11
|
+
function collectTaskEntityTypes(tasks) {
|
|
12
|
+
const seen = /* @__PURE__ */ new Set();
|
|
13
|
+
for (const task of tasks) {
|
|
14
|
+
for (const binding of task.entityBindings ?? []) {
|
|
15
|
+
const entityType = binding?.entityType;
|
|
16
|
+
if (typeof entityType === "string" && entityType.length > 0) seen.add(entityType);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return [...seen];
|
|
20
|
+
}
|
|
21
|
+
function customEntityRequirement(entityId, restricted) {
|
|
22
|
+
return restricted ? {
|
|
23
|
+
kind: "requires",
|
|
24
|
+
features: [RECORDS_VIEW_FEATURE, deriveCustomEntityRecordFeature(entityId, "view")]
|
|
25
|
+
} : { kind: "requires", features: [RECORDS_VIEW_FEATURE] };
|
|
26
|
+
}
|
|
27
|
+
async function decideEntityType(entityType, em, scope) {
|
|
28
|
+
const entityId = normalizeTaskEntityTypeToEntityId(entityType);
|
|
29
|
+
if (!entityId) {
|
|
30
|
+
const spelling = normalizeTaskEntityTypeSpelling(entityType);
|
|
31
|
+
const fallback = await classifyRecordsEntity(em, spelling, scope);
|
|
32
|
+
if (fallback.kind !== "custom") return { kind: "unknown-entity-type" };
|
|
33
|
+
return customEntityRequirement(spelling, fallback.restricted);
|
|
34
|
+
}
|
|
35
|
+
const classification = await classifyRecordsEntity(em, entityId, scope);
|
|
36
|
+
if (classification.kind === "custom") return customEntityRequirement(entityId, classification.restricted);
|
|
37
|
+
if (classification.kind === "system") {
|
|
38
|
+
const requirement = resolveEntityAclRequirement(entityId);
|
|
39
|
+
if (!requirement || requirement.platformOnly) return { kind: "unavailable" };
|
|
40
|
+
return { kind: "requires", features: requirement.view };
|
|
41
|
+
}
|
|
42
|
+
return { kind: "unavailable" };
|
|
43
|
+
}
|
|
44
|
+
async function resolveTaskEntityAccess(input) {
|
|
45
|
+
const distinct = [...new Set(input.entityTypes)];
|
|
46
|
+
const acl = await input.rbac.loadAcl(input.userId, input.scope);
|
|
47
|
+
const isSuperAdmin = acl?.isSuperAdmin === true;
|
|
48
|
+
const grantedFeatures = acl?.features ?? [];
|
|
49
|
+
const map = /* @__PURE__ */ new Map();
|
|
50
|
+
for (const entityType of distinct) {
|
|
51
|
+
map.set(
|
|
52
|
+
entityType,
|
|
53
|
+
isSuperAdmin ? { kind: "requires", features: [] } : await decideEntityType(entityType, input.em, input.scope)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return { map, isSuperAdmin, grantedFeatures };
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
collectTaskEntityTypes,
|
|
60
|
+
resolveTaskEntityAccess
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=task-entity-access.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/task-entity-access.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Builds the `TaskEntityAccessMap` the visibility predicate consumes \u2014 the\n * impure half of the entity gate.\n *\n * ## What \"entity access\" means here, exactly\n *\n * **Entity TYPE plus scope. There is no record-level ACL in this platform and\n * this resolver does not add one.** The query engine's public interface is\n * `query(entity, opts)` with no ACL seam anywhere in it, and the only per-record\n * rule in the repo is `assertCanAccessChannel`, a bespoke owner comparison over\n * an already-loaded row. So the guarantee this makes is: *you may see a task\n * about a deal iff you may see deals at all, and the task is inside your tenant\n * and organization.* A user who can see deals can see a task about ANY deal in\n * their organization, including one they would never have opened themselves.\n * Do not read more into it, and do not let a caller document it as row-level.\n *\n * Verifying each BOUND RECORD's own organization would cost one query per\n * (entity type, id) per row, and there is no generic `(entityType, recordId) \u2192\n * record` resolver to do it with. Accepted residual risk, on the review\n * checklist. The portal path does not accept it \u2014 there the record identity is\n * compared directly against the caller's owned ids.\n *\n * ## Cost\n *\n * ONE `loadAcl` and ONE classification pass per REQUEST, keyed on the distinct\n * entity types across the whole page. `assertEntityAclForRequest` calls\n * `rbac.loadAcl` on every invocation, so calling it per binding would issue ~100\n * ACL loads for a 50-row inbox page with two bindings each.\n *\n * ## Failure\n *\n * Nothing here is caught. A resolver that throws must fail the whole request \u2014\n * degrading to an empty map would leave the predicate with no key for any\n * binding, and while that denies today, \"swallow the error and carry on\" is the\n * shape of bug that later becomes \"swallow the error and pass\". Absence of data\n * is not failure: a task with no bindings asks nothing of this map.\n */\n\nimport type { EntityManager } from '@mikro-orm/core'\nimport { classifyRecordsEntity } from '@open-mercato/core/modules/entities/lib/entityClassification'\nimport { resolveEntityAclRequirement } from '@open-mercato/core/modules/entities/lib/entityAcl'\nimport {\n RECORDS_VIEW_FEATURE,\n deriveCustomEntityRecordFeature,\n} from '@open-mercato/core/modules/entities/lib/recordFeatures'\nimport {\n normalizeTaskEntityTypeSpelling,\n normalizeTaskEntityTypeToEntityId,\n} from './task-entity-types'\nimport type { TaskEntityAccessDecision, TaskEntityAccessMap } from './task-visibility'\n\nexport type TaskEntityAccessScope = { tenantId: string | null; organizationId: string | null }\n\nexport type TaskEntityAccessAcl = {\n isSuperAdmin: boolean\n features: string[]\n}\n\n/** The slice of `RbacService` this resolver needs, so tests need no container. */\nexport type TaskEntityAccessRbacService = {\n loadAcl(userId: string, scope: TaskEntityAccessScope): Promise<TaskEntityAccessAcl | null>\n}\n\nexport type ResolveTaskEntityAccessInput = {\n /** Distinct authored `entityType` values across the page. Deduped here. */\n entityTypes: Iterable<string>\n em: EntityManager\n rbac: TaskEntityAccessRbacService\n userId: string\n scope: TaskEntityAccessScope\n}\n\nexport type TaskEntityAccessResult = {\n map: TaskEntityAccessMap\n /**\n * Returned alongside the map because the caller needs both to build the\n * principal, and loading the ACL twice per request is the cost this resolver\n * exists to avoid.\n */\n isSuperAdmin: boolean\n grantedFeatures: string[]\n}\n\ntype BoundTask = { entityBindings?: readonly { entityType?: unknown }[] | null }\n\n/**\n * The distinct authored entity types across a page of tasks, verbatim.\n *\n * Verbatim matters: the map is keyed on exactly the string the binding carries,\n * so the predicate's lookup is an identity match and \"no key\" unambiguously\n * means the resolver never saw that type. Normalization happens INSIDE the\n * resolver, where a normalization failure has a `unknown-entity-type` answer to\n * record.\n */\nexport function collectTaskEntityTypes(tasks: Iterable<BoundTask>): string[] {\n const seen = new Set<string>()\n for (const task of tasks) {\n for (const binding of task.entityBindings ?? []) {\n const entityType = binding?.entityType\n if (typeof entityType === 'string' && entityType.length > 0) seen.add(entityType)\n }\n }\n return [...seen]\n}\n\n/**\n * Mirrors `assertEntityAclForRequest`: an unrestricted custom entity is\n * authorized by the coarse route-level feature alone; a restricted one also\n * needs its synthesized per-entity grant.\n */\nfunction customEntityRequirement(entityId: string, restricted: boolean): TaskEntityAccessDecision {\n return restricted\n ? {\n kind: 'requires',\n features: [RECORDS_VIEW_FEATURE, deriveCustomEntityRecordFeature(entityId, 'view')],\n }\n : { kind: 'requires', features: [RECORDS_VIEW_FEATURE] }\n}\n\nasync function decideEntityType(\n entityType: string,\n em: EntityManager,\n scope: TaskEntityAccessScope,\n): Promise<TaskEntityAccessDecision> {\n const entityId = normalizeTaskEntityTypeToEntityId(entityType)\n\n if (!entityId) {\n // A TENANT-CREATED custom entity (a `custom_entities` row, not a module's\n // `ce.ts`) is absent from the generated registry, so normalization cannot\n // vouch for it and refusing here would hide every task bound to one. Ask the\n // classifier instead: a real registration inside the caller's own scope is\n // proof enough, and anything the classifier does not recognize either is a\n // genuine authored typo \u2014 reported as its own reason so the Problems panel\n // can name it rather than leaving an author staring at an invisible task.\n const spelling = normalizeTaskEntityTypeSpelling(entityType)\n const fallback = await classifyRecordsEntity(em, spelling, scope)\n if (fallback.kind !== 'custom') return { kind: 'unknown-entity-type' }\n return customEntityRequirement(spelling, fallback.restricted)\n }\n\n const classification = await classifyRecordsEntity(em, entityId, scope)\n\n if (classification.kind === 'custom') return customEntityRequirement(entityId, classification.restricted)\n\n if (classification.kind === 'system') {\n const requirement = resolveEntityAclRequirement(entityId)\n // No entry, or a platform-only entity: `entityAcl.ts` answers 403 for both,\n // and so does this.\n if (!requirement || requirement.platformOnly) return { kind: 'unavailable' }\n return { kind: 'requires', features: requirement.view }\n }\n\n return { kind: 'unavailable' }\n}\n\n/**\n * Resolve, once per request, what each bound entity type requires of the caller.\n *\n * The map carries REQUIREMENTS, not verdicts \u2014 the wildcard-aware match happens\n * in the predicate, so there is exactly one place that decides anything. A\n * superadmin is the single exception: they short-circuit the entity gate in\n * `entityAcl.ts` too, so every type resolves to an empty requirement.\n */\nexport async function resolveTaskEntityAccess(\n input: ResolveTaskEntityAccessInput,\n): Promise<TaskEntityAccessResult> {\n const distinct = [...new Set(input.entityTypes)]\n const acl = await input.rbac.loadAcl(input.userId, input.scope)\n const isSuperAdmin = acl?.isSuperAdmin === true\n const grantedFeatures = acl?.features ?? []\n\n const map = new Map<string, TaskEntityAccessDecision>()\n for (const entityType of distinct) {\n map.set(\n entityType,\n isSuperAdmin ? { kind: 'requires', features: [] } : await decideEntityType(entityType, input.em, input.scope),\n )\n }\n\n return { map, isSuperAdmin, grantedFeatures }\n}\n"],
|
|
5
|
+
"mappings": "AAuCA,SAAS,6BAA6B;AACtC,SAAS,mCAAmC;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AA8CA,SAAS,uBAAuB,OAAsC;AAC3E,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,OAAO;AACxB,eAAW,WAAW,KAAK,kBAAkB,CAAC,GAAG;AAC/C,YAAM,aAAa,SAAS;AAC5B,UAAI,OAAO,eAAe,YAAY,WAAW,SAAS,EAAG,MAAK,IAAI,UAAU;AAAA,IAClF;AAAA,EACF;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;AAOA,SAAS,wBAAwB,UAAkB,YAA+C;AAChG,SAAO,aACH;AAAA,IACE,MAAM;AAAA,IACN,UAAU,CAAC,sBAAsB,gCAAgC,UAAU,MAAM,CAAC;AAAA,EACpF,IACA,EAAE,MAAM,YAAY,UAAU,CAAC,oBAAoB,EAAE;AAC3D;AAEA,eAAe,iBACb,YACA,IACA,OACmC;AACnC,QAAM,WAAW,kCAAkC,UAAU;AAE7D,MAAI,CAAC,UAAU;AAQb,UAAM,WAAW,gCAAgC,UAAU;AAC3D,UAAM,WAAW,MAAM,sBAAsB,IAAI,UAAU,KAAK;AAChE,QAAI,SAAS,SAAS,SAAU,QAAO,EAAE,MAAM,sBAAsB;AACrE,WAAO,wBAAwB,UAAU,SAAS,UAAU;AAAA,EAC9D;AAEA,QAAM,iBAAiB,MAAM,sBAAsB,IAAI,UAAU,KAAK;AAEtE,MAAI,eAAe,SAAS,SAAU,QAAO,wBAAwB,UAAU,eAAe,UAAU;AAExG,MAAI,eAAe,SAAS,UAAU;AACpC,UAAM,cAAc,4BAA4B,QAAQ;AAGxD,QAAI,CAAC,eAAe,YAAY,aAAc,QAAO,EAAE,MAAM,cAAc;AAC3E,WAAO,EAAE,MAAM,YAAY,UAAU,YAAY,KAAK;AAAA,EACxD;AAEA,SAAO,EAAE,MAAM,cAAc;AAC/B;AAUA,eAAsB,wBACpB,OACiC;AACjC,QAAM,WAAW,CAAC,GAAG,IAAI,IAAI,MAAM,WAAW,CAAC;AAC/C,QAAM,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM,QAAQ,MAAM,KAAK;AAC9D,QAAM,eAAe,KAAK,iBAAiB;AAC3C,QAAM,kBAAkB,KAAK,YAAY,CAAC;AAE1C,QAAM,MAAM,oBAAI,IAAsC;AACtD,aAAW,cAAc,UAAU;AACjC,QAAI;AAAA,MACF;AAAA,MACA,eAAe,EAAE,MAAM,YAAY,UAAU,CAAC,EAAE,IAAI,MAAM,iBAAiB,YAAY,MAAM,IAAI,MAAM,KAAK;AAAA,IAC9G;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,cAAc,gBAAgB;AAC9C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const TASK_ENTITY_TYPE_ALIAS_GROUPS = [
|
|
2
|
+
{
|
|
3
|
+
entityId: "customers:customer_person_profile",
|
|
4
|
+
spellings: ["customers:person", "customers:people", "customers:customer_person_profile"]
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
entityId: "customers:customer_company_profile",
|
|
8
|
+
spellings: ["customers:company", "customers:companies", "customers:customer_company_profile"]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
entityId: "customers:customer_deal",
|
|
12
|
+
spellings: ["customers:deal", "customers:deals", "customers:customer_deal"]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
entityId: "sales:sales_order",
|
|
16
|
+
spellings: ["sales:order", "sales:orders", "sales:sales_order", "sales:document"]
|
|
17
|
+
}
|
|
18
|
+
];
|
|
19
|
+
const ALIAS_LOOKUP = new Map(
|
|
20
|
+
TASK_ENTITY_TYPE_ALIAS_GROUPS.flatMap(
|
|
21
|
+
(group) => group.spellings.map((spelling) => [spelling, group.entityId])
|
|
22
|
+
)
|
|
23
|
+
);
|
|
24
|
+
function normalizeTaskEntityTypeSpelling(entityType) {
|
|
25
|
+
return entityType.trim().toLowerCase().replace(/\./g, ":");
|
|
26
|
+
}
|
|
27
|
+
function resolveAliasedTaskEntityId(entityType) {
|
|
28
|
+
return ALIAS_LOOKUP.get(normalizeTaskEntityTypeSpelling(entityType)) ?? null;
|
|
29
|
+
}
|
|
30
|
+
function listTaskEntityTypeAliases() {
|
|
31
|
+
return ALIAS_LOOKUP;
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
TASK_ENTITY_TYPE_ALIAS_GROUPS,
|
|
35
|
+
listTaskEntityTypeAliases,
|
|
36
|
+
normalizeTaskEntityTypeSpelling,
|
|
37
|
+
resolveAliasedTaskEntityId
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=task-entity-aliases.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/workflows/lib/task-entity-aliases.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The ONE alias dictionary for authored task `entityType` values (PURE \u2014 zero\n * imports, safe in a client bundle).\n *\n * A binding's `entityType` is free text: the inspector offers `customers:person`\n * as a placeholder and stores whatever the author typed, while the ACL\n * requirement table and the entity registry are keyed on the GENERATED id\n * (`customers:customer_person_profile`). Two consumers need the same spellings \u2014\n * `task-entity-types.ts` resolves them to an entity id for the visibility gate,\n * `work-inbox/entity-links.ts` resolves them to a record deep link \u2014 and they\n * read this table rather than each keeping a copy. The repo already carries\n * divergent alias tables in `customers/ai-agents-context.ts` and the\n * optimistic-lock `resourceKind` readers; a fourth one is not acceptable.\n *\n * It lives in its own module, with nothing imported, so the client-side deep\n * link code never pulls the entity registry in behind it.\n */\n\nexport type TaskEntityTypeAliasGroup = {\n /** The generated entity id every spelling in the group means. */\n entityId: string\n /** Normalized spellings (`module:entity`, lower case) that authors write. */\n spellings: readonly string[]\n}\n\n/**\n * Alternate spellings that unambiguously mean one generated entity id.\n *\n * `customers:customer_entity` is deliberately absent \u2014 it backs both people and\n * companies, so no single id is the right answer and leaving a binding on it\n * unresolvable is the correct outcome.\n */\nexport const TASK_ENTITY_TYPE_ALIAS_GROUPS: readonly TaskEntityTypeAliasGroup[] = [\n {\n entityId: 'customers:customer_person_profile',\n spellings: ['customers:person', 'customers:people', 'customers:customer_person_profile'],\n },\n {\n entityId: 'customers:customer_company_profile',\n spellings: ['customers:company', 'customers:companies', 'customers:customer_company_profile'],\n },\n {\n entityId: 'customers:customer_deal',\n spellings: ['customers:deal', 'customers:deals', 'customers:customer_deal'],\n },\n {\n entityId: 'sales:sales_order',\n spellings: ['sales:order', 'sales:orders', 'sales:sales_order', 'sales:document'],\n },\n]\n\nconst ALIAS_LOOKUP: ReadonlyMap<string, string> = new Map(\n TASK_ENTITY_TYPE_ALIAS_GROUPS.flatMap((group) =>\n group.spellings.map((spelling) => [spelling, group.entityId] as const),\n ),\n)\n\n/**\n * `Customers.Person` / `customers.person` / ` customers:person ` \u2192\n * `customers:person`.\n *\n * Entity ids are written `module:entity` while record-detail injection contexts\n * use `module.entity` (`resourceKind`), and authors type both.\n */\nexport function normalizeTaskEntityTypeSpelling(entityType: string): string {\n return entityType.trim().toLowerCase().replace(/\\./g, ':')\n}\n\n/** The generated entity id an enumerated spelling means, or `null`. */\nexport function resolveAliasedTaskEntityId(entityType: string): string | null {\n return ALIAS_LOOKUP.get(normalizeTaskEntityTypeSpelling(entityType)) ?? null\n}\n\n/** Every enumerated spelling, mapped to its generated entity id. */\nexport function listTaskEntityTypeAliases(): ReadonlyMap<string, string> {\n return ALIAS_LOOKUP\n}\n"],
|
|
5
|
+
"mappings": "AAgCO,MAAM,gCAAqE;AAAA,EAChF;AAAA,IACE,UAAU;AAAA,IACV,WAAW,CAAC,oBAAoB,oBAAoB,mCAAmC;AAAA,EACzF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,WAAW,CAAC,qBAAqB,uBAAuB,oCAAoC;AAAA,EAC9F;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,WAAW,CAAC,kBAAkB,mBAAmB,yBAAyB;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,WAAW,CAAC,eAAe,gBAAgB,qBAAqB,gBAAgB;AAAA,EAClF;AACF;AAEA,MAAM,eAA4C,IAAI;AAAA,EACpD,8BAA8B;AAAA,IAAQ,CAAC,UACrC,MAAM,UAAU,IAAI,CAAC,aAAa,CAAC,UAAU,MAAM,QAAQ,CAAU;AAAA,EACvE;AACF;AASO,SAAS,gCAAgC,YAA4B;AAC1E,SAAO,WAAW,KAAK,EAAE,YAAY,EAAE,QAAQ,OAAO,GAAG;AAC3D;AAGO,SAAS,2BAA2B,YAAmC;AAC5E,SAAO,aAAa,IAAI,gCAAgC,UAAU,CAAC,KAAK;AAC1E;AAGO,SAAS,4BAAyD;AACvE,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|