< Summary

Information
Class: Elsa.AI.Host.Tools.Workflows.WorkflowProposeCreateTool
Assembly: Elsa.AI.Host
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Workflows/WorkflowProposeCreateTool.cs
Line coverage
96%
Covered lines: 27
Uncovered lines: 1
Coverable lines: 28
Total lines: 41
Line coverage: 96.4%
Branch coverage
50%
Covered branches: 4
Total branches: 8
Branch coverage: 50%
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()50%8894.73%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Workflows/WorkflowProposeCreateTool.cs

#LineLine coverage
 1using Elsa.AI.Abstractions.Contracts;
 2using Elsa.AI.Abstractions.Models;
 3using Elsa.AI.Host.Services;
 4
 5namespace Elsa.AI.Host.Tools.Workflows;
 6
 457public class WorkflowProposeCreateTool(IServiceProvider serviceProvider, WorkflowDraftValidationService validationServic
 8{
 919    public override AIToolDefinition Definition { get; } = ProposalDefinition(
 4510        "workflows.proposeCreate",
 4511        "Propose workflow creation",
 4512        "Create a reviewable AI workflow creation proposal. This never persists a workflow definition.",
 4513        GroundingToolSchemas.WithProperties(
 4514            ("draft", GroundingToolSchemas.Object("Workflow draft JSON payload.")),
 4515            ("rationale", GroundingToolSchemas.String("Why the draft should be created."))));
 16
 17    public override async ValueTask<AIToolResult> ExecuteAsync(AIToolExecutionContext context, CancellationToken cancell
 18    {
 119        var store = serviceProvider.GetService(typeof(IAIProposalStore)) as IAIProposalStore;
 120        if (store == null)
 021            return formatter.Unavailable("AI proposal store");
 22
 123        var draft = GetObject(context.Arguments, "draft") ?? [];
 124        var diagnostics = validationService.Validate(draft);
 125        var proposal = new AIProposal
 126        {
 127            TenantId = context.TenantId,
 128            ConversationId = context.ConversationId,
 129            Kind = AIProposalKind.WorkflowCreate,
 130            Status = diagnostics.Any(x => x.Severity == AIValidationSeverity.Error) ? AIProposalStatus.Blocked : AIPropo
 131            WorkflowPayload = (JsonObject)draft.DeepClone(),
 132            Rationale = GetString(context.Arguments, "rationale") ?? "",
 133            ValidationDiagnostics = diagnostics.ToList(),
 134            GraphDiff = diffService.CreateDiff(draft),
 135            CreatedBy = context.ActorId
 136        };
 137        await store.SaveAsync(proposal, cancellationToken);
 38
 139        return formatter.CreateResult($"Created workflow creation proposal {proposal.Id}.", [AIGroundingJson.ToJsonObjec
 140    }
 41}