< Summary

Information
Class: Elsa.AI.Host.Tools.Runtime.WorkflowInstanceActivityStateTool
Assembly: Elsa.AI.Host
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Runtime/WorkflowInstanceActivityStateTool.cs
Line coverage
26%
Covered lines: 9
Uncovered lines: 25
Coverable lines: 34
Total lines: 49
Line coverage: 26.4%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Definition()100%11100%
ExecuteAsync()0%2040%
Matches(...)0%2040%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Runtime/WorkflowInstanceActivityStateTool.cs

#LineLine coverage
 1using Elsa.AI.Abstractions.Models;
 2using Elsa.AI.Host.Services;
 3
 4namespace Elsa.AI.Host.Tools.Runtime;
 5
 456public class WorkflowInstanceActivityStateTool(IServiceProvider serviceProvider, AIGroundingResultFormatter formatter) :
 7{
 908    public override AIToolDefinition Definition { get; } = ReadOnlyDefinition(
 459        "instances.getActivityState",
 4510        "Get instance activity state",
 4511        "Get bounded state for a specific activity in a workflow instance.",
 4512        GroundingToolSchemas.WithProperties(
 4513            ("instanceId", GroundingToolSchemas.String("Workflow instance ID.")),
 4514            ("activityId", GroundingToolSchemas.String("Activity ID.")),
 4515            ("activityNodeId", GroundingToolSchemas.String("Activity node ID."))));
 16
 17    public override async ValueTask<AIToolResult> ExecuteAsync(AIToolExecutionContext context, CancellationToken cancell
 18    {
 019        if (WorkflowInstanceStore == null)
 020            return InstanceStoreUnavailable();
 21
 022        var instance = await FindAuthorizedInstanceAsync(context.Arguments, context.TenantId, cancellationToken);
 023        if (instance == null)
 024            return new AIToolResult { Status = AIToolInvocationStatus.Failed, Error = "Workflow instance was not found."
 25
 026        var activityId = GetString(context.Arguments, "activityId");
 027        var activityNodeId = GetString(context.Arguments, "activityNodeId");
 028        var item = new JsonObject
 029        {
 030            ["instanceId"] = instance.Id,
 031            ["activityId"] = activityId,
 032            ["activityNodeId"] = activityNodeId,
 033            ["incidents"] = AIGroundingJson.ToJsonArray(instance.WorkflowState.Incidents
 034                .Where(x => Matches(x.ActivityId, activityId) || Matches(x.ActivityNodeId, activityNodeId))
 035                .Select(x => new { x.ActivityId, x.ActivityNodeId, x.ActivityType, x.Message, x.Timestamp })),
 036            ["scheduledActivities"] = AIGroundingJson.ToJsonArray(instance.WorkflowState.ScheduledActivities
 037                .Where(x => Matches(x.ActivityNodeId, activityNodeId) || Matches(x.ActivityNodeId, activityId))
 038                .Select(x => new { x.ActivityNodeId, x.OwnerContextId, x.ExistingActivityExecutionContextId })),
 039            ["bookmarks"] = AIGroundingJson.ToJsonArray(instance.WorkflowState.Bookmarks
 040                .Where(x => Matches(x.ActivityId, activityId))
 041                .Select(x => new { x.Id, x.Name, x.ActivityId }))
 042        };
 43
 044        return Formatter.CreateResult($"Resolved activity state for workflow instance {instance.Id}.", [Formatter.Redact
 045    }
 46
 47    private static bool Matches(string? value, string? expected) =>
 048        !string.IsNullOrWhiteSpace(value) && !string.IsNullOrWhiteSpace(expected) && string.Equals(value, expected, Stri
 49}