< Summary

Information
Class: Elsa.AI.Host.Tools.Workflows.WorkflowProposeUpdateTool
Assembly: Elsa.AI.Host
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Workflows/WorkflowProposeUpdateTool.cs
Line coverage
23%
Covered lines: 10
Uncovered lines: 32
Coverable lines: 42
Total lines: 57
Line coverage: 23.8%
Branch coverage
0%
Covered branches: 0
Total branches: 18
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%342180%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.AI.Host/Tools/Workflows/WorkflowProposeUpdateTool.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 WorkflowProposeUpdateTool(IServiceProvider serviceProvider, WorkflowDraftValidationService validationServic
 8{
 909    public override AIToolDefinition Definition { get; } = ProposalDefinition(
 4510        "workflows.proposeUpdate",
 4511        "Propose workflow update",
 4512        "Create a reviewable AI workflow update proposal against a baseline workflow version. This never persists a work
 4513        GroundingToolSchemas.WithProperties(
 4514            ("definitionId", GroundingToolSchemas.String("Logical workflow definition ID.")),
 4515            ("baselineVersionId", GroundingToolSchemas.String("Baseline workflow version ID.")),
 4516            ("draft", GroundingToolSchemas.Object("Workflow draft JSON payload.")),
 4517            ("rationale", GroundingToolSchemas.String("Why the draft should update the workflow."))));
 18
 19    public override async ValueTask<AIToolResult> ExecuteAsync(AIToolExecutionContext context, CancellationToken cancell
 20    {
 021        var proposalStore = ServiceProvider.GetService(typeof(IAIProposalStore)) as IAIProposalStore;
 022        if (proposalStore == null)
 023            return Formatter.Unavailable("AI proposal store");
 24
 025        var workflowStore = WorkflowDefinitionStore;
 026        if (workflowStore == null)
 027            return WorkflowStoreUnavailable();
 28
 029        var baselineVersionId = GetString(context.Arguments, "baselineVersionId");
 030        var baseline = string.IsNullOrWhiteSpace(baselineVersionId)
 031            ? null
 032            : await workflowStore.FindAsync(new() { Id = baselineVersionId }, cancellationToken);
 033        if (baseline == null || !IsTenantAllowed(baseline, context.TenantId))
 034            return new AIToolResult { Status = AIToolInvocationStatus.Failed, Error = "Baseline workflow definition was 
 35
 036        var latest = await workflowStore.FindAsync(new() { DefinitionId = baseline.DefinitionId, VersionOptions = Elsa.C
 037        var draft = GetObject(context.Arguments, "draft") ?? [];
 038        var diagnostics = validationService.Validate(draft, baselineVersionId, latest?.Id);
 039        var proposal = new AIProposal
 040        {
 041            TenantId = context.TenantId,
 042            ConversationId = context.ConversationId,
 043            Kind = AIProposalKind.WorkflowUpdate,
 044            Status = diagnostics.Any(x => x.Severity == AIValidationSeverity.Error) ? AIProposalStatus.Blocked : AIPropo
 045            BaselineWorkflowDefinitionId = baseline.DefinitionId,
 046            BaselineVersionId = baseline.Id,
 047            WorkflowPayload = (JsonObject)draft.DeepClone(),
 048            Rationale = GetString(context.Arguments, "rationale") ?? "",
 049            ValidationDiagnostics = diagnostics.ToList(),
 050            GraphDiff = diffService.CreateDiff(draft, workflowMapper.MapGraph(baseline)),
 051            CreatedBy = context.ActorId
 052        };
 053        await proposalStore.SaveAsync(proposal, cancellationToken);
 54
 055        return Formatter.CreateResult($"Created workflow update proposal {proposal.Id}.", [AIGroundingJson.ToJsonObject(
 056    }
 57}