| | | 1 | | using Elsa.AI.Abstractions.Models; |
| | | 2 | | using Elsa.AI.Host.Services; |
| | | 3 | | using Elsa.AI.Host.Tools; |
| | | 4 | | using Elsa.Common.Models; |
| | | 5 | | using Elsa.Workflows; |
| | | 6 | | using Elsa.Workflows.Management.Enums; |
| | | 7 | | using Elsa.Workflows.Management; |
| | | 8 | | using Elsa.Workflows.Management.Entities; |
| | | 9 | | using Elsa.Workflows.Management.Filters; |
| | | 10 | | using Elsa.Workflows.Management.Models; |
| | | 11 | | |
| | | 12 | | namespace Elsa.AI.Host.Tools.Runtime; |
| | | 13 | | |
| | 270 | 14 | | public abstract class RuntimeToolBase(IServiceProvider serviceProvider, AIGroundingResultFormatter formatter) : Groundin |
| | | 15 | | { |
| | 271 | 16 | | protected AIGroundingResultFormatter Formatter { get; } = formatter; |
| | 1 | 17 | | protected IWorkflowInstanceStore? WorkflowInstanceStore => serviceProvider.GetService(typeof(IWorkflowInstanceStore) |
| | | 18 | | |
| | | 19 | | protected AIToolResult InstanceStoreUnavailable() => |
| | 0 | 20 | | Formatter.Unavailable("Workflow instance store"); |
| | | 21 | | |
| | | 22 | | protected static bool IsTenantAllowed(WorkflowInstance instance, string? tenantId) => |
| | 1 | 23 | | string.Equals(NormalizeTenant(instance.TenantId), NormalizeTenant(tenantId), StringComparison.Ordinal); |
| | | 24 | | |
| | | 25 | | protected static WorkflowInstanceFilter CreateInstanceFilter(JsonObject arguments) |
| | | 26 | | { |
| | 1 | 27 | | var filter = new WorkflowInstanceFilter |
| | 1 | 28 | | { |
| | 1 | 29 | | Id = GetString(arguments, "instanceId") ?? GetString(arguments, "id"), |
| | 1 | 30 | | DefinitionId = GetString(arguments, "definitionId"), |
| | 1 | 31 | | DefinitionVersionId = GetString(arguments, "definitionVersionId"), |
| | 1 | 32 | | CorrelationId = GetString(arguments, "correlationId"), |
| | 1 | 33 | | SearchTerm = GetString(arguments, "query") ?? GetString(arguments, "searchTerm"), |
| | 1 | 34 | | HasIncidents = GetBool(arguments, "hasIncidents") |
| | 1 | 35 | | }; |
| | | 36 | | |
| | 1 | 37 | | if (Enum.TryParse<WorkflowStatus>(GetString(arguments, "status"), true, out var status)) |
| | 0 | 38 | | filter.WorkflowStatus = status; |
| | | 39 | | |
| | 1 | 40 | | if (Enum.TryParse<WorkflowSubStatus>(GetString(arguments, "subStatus"), true, out var subStatus)) |
| | 0 | 41 | | filter.WorkflowSubStatus = subStatus; |
| | | 42 | | |
| | 1 | 43 | | var from = GetDateTimeOffset(arguments, "from"); |
| | 1 | 44 | | var to = GetDateTimeOffset(arguments, "to"); |
| | 1 | 45 | | var timestampFilters = new List<TimestampFilter>(); |
| | 1 | 46 | | if (from != null) |
| | 0 | 47 | | timestampFilters.Add(new TimestampFilter |
| | 0 | 48 | | { |
| | 0 | 49 | | Column = nameof(WorkflowInstance.UpdatedAt), |
| | 0 | 50 | | Operator = TimestampFilterOperator.GreaterThanOrEqual, |
| | 0 | 51 | | Timestamp = from.Value |
| | 0 | 52 | | }); |
| | 1 | 53 | | if (to != null) |
| | 0 | 54 | | timestampFilters.Add(new TimestampFilter |
| | 0 | 55 | | { |
| | 0 | 56 | | Column = nameof(WorkflowInstance.UpdatedAt), |
| | 0 | 57 | | Operator = TimestampFilterOperator.LessThanOrEqual, |
| | 0 | 58 | | Timestamp = to.Value |
| | 0 | 59 | | }); |
| | 1 | 60 | | if (timestampFilters.Count > 0) |
| | 0 | 61 | | filter.TimestampFilters = timestampFilters; |
| | | 62 | | |
| | 1 | 63 | | return filter; |
| | | 64 | | } |
| | | 65 | | |
| | | 66 | | protected async ValueTask<WorkflowInstance?> FindAuthorizedInstanceAsync(JsonObject arguments, string? tenantId, Can |
| | | 67 | | { |
| | 0 | 68 | | var store = WorkflowInstanceStore; |
| | 0 | 69 | | if (store == null) |
| | 0 | 70 | | return null; |
| | | 71 | | |
| | 0 | 72 | | var instance = await store.FindAsync(CreateInstanceFilter(arguments), cancellationToken); |
| | 0 | 73 | | return instance != null && IsTenantAllowed(instance, tenantId) ? instance : null; |
| | 0 | 74 | | } |
| | | 75 | | |
| | | 76 | | private static DateTimeOffset? GetDateTimeOffset(JsonObject arguments, string name) => |
| | 2 | 77 | | arguments.TryGetPropertyValue(name, out var node) && node is JsonValue value && value.TryGetValue<DateTimeOffset |
| | 2 | 78 | | ? result |
| | 2 | 79 | | : null; |
| | | 80 | | |
| | | 81 | | private static string NormalizeTenant(string? tenantId) => |
| | 2 | 82 | | string.IsNullOrWhiteSpace(tenantId) ? "" : tenantId; |
| | | 83 | | } |