< Summary

Information
Class: NexusLabs.Needlr.AgentFramework.Diagnostics.DagRunResult
Assembly: NexusLabs.Needlr.AgentFramework
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.AgentFramework/Diagnostics/DagRunResult.cs
Line coverage
97%
Covered lines: 47
Uncovered lines: 1
Coverable lines: 48
Total lines: 75
Line coverage: 97.9%
Branch coverage
75%
Covered branches: 3
Total branches: 4
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)75%44100%
get_Stages()100%11100%
get_PlannedStageCount()100%210%
get_FinalResponses()100%11100%
get_TotalDuration()100%11100%
get_AggregateTokenUsage()100%11100%
get_Succeeded()100%11100%
get_ErrorMessage()100%11100%
get_Exception()100%11100%
get_NodeResults()100%11100%
get_BranchResults()100%11100%

File(s)

/home/runner/work/needlr/needlr/src/NexusLabs.Needlr.AgentFramework/Diagnostics/DagRunResult.cs

#LineLine coverage
 1using Microsoft.Extensions.AI;
 2
 3namespace NexusLabs.Needlr.AgentFramework.Diagnostics;
 4
 5/// <summary>
 6/// Default implementation of <see cref="IDagRunResult"/>.
 7/// </summary>
 8[DoNotAutoRegister]
 9internal sealed class DagRunResult : IDagRunResult
 10{
 11    private readonly Lazy<IReadOnlyDictionary<string, ChatResponse?>> _lazyResponses;
 12    private readonly Lazy<TokenUsage?> _lazyAggregateTokenUsage;
 13
 3914    internal DagRunResult(
 3915        IReadOnlyList<IAgentStageResult> stages,
 3916        IReadOnlyDictionary<string, IDagNodeResult> nodeResults,
 3917        IReadOnlyDictionary<string, IReadOnlyList<IAgentStageResult>> branchResults,
 3918        TimeSpan totalDuration,
 3919        bool succeeded,
 3920        string? errorMessage,
 3921        Exception? exception = null,
 3922        int? plannedStageCount = null)
 23    {
 3924        Stages = stages;
 3925        PlannedStageCount = plannedStageCount ?? stages.Count;
 3926        NodeResults = nodeResults;
 3927        BranchResults = branchResults;
 3928        TotalDuration = totalDuration;
 3929        Succeeded = succeeded;
 3930        ErrorMessage = errorMessage;
 3931        Exception = exception;
 32
 3933        _lazyResponses = new Lazy<IReadOnlyDictionary<string, ChatResponse?>>(() =>
 4134            stages
 235                .GroupBy(s => s.AgentName)
 4536                .ToDictionary(g => g.Key, g => g.Last().FinalResponse));
 37
 3938        _lazyAggregateTokenUsage = new Lazy<TokenUsage?>(() =>
 3939        {
 340            var diagnostics = stages
 341                .Select(s => s.Diagnostics)
 342                .Where(d => d is not null)
 343                .ToList();
 3944
 545            if (diagnostics.Count == 0) return null;
 3946
 147            return new TokenUsage(
 248                InputTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.InputTokens),
 249                OutputTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.OutputTokens),
 250                TotalTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.TotalTokens),
 251                CachedInputTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.CachedInputTokens),
 352                ReasoningTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.ReasoningTokens));
 3953        });
 3954    }
 55
 256    public IReadOnlyList<IAgentStageResult> Stages { get; }
 57
 058    public int PlannedStageCount { get; }
 59
 460    public IReadOnlyDictionary<string, ChatResponse?> FinalResponses => _lazyResponses.Value;
 61
 362    public TimeSpan TotalDuration { get; }
 63
 664    public TokenUsage? AggregateTokenUsage => _lazyAggregateTokenUsage.Value;
 65
 3166    public bool Succeeded { get; }
 67
 3168    public string? ErrorMessage { get; }
 69
 170    public Exception? Exception { get; }
 71
 1172    public IReadOnlyDictionary<string, IDagNodeResult> NodeResults { get; }
 73
 574    public IReadOnlyDictionary<string, IReadOnlyList<IAgentStageResult>> BranchResults { get; }
 75}