< Summary

Information
Class: NexusLabs.Needlr.AgentFramework.Diagnostics.PipelineRunResult
Assembly: NexusLabs.Needlr.AgentFramework
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.AgentFramework/Diagnostics/PipelineRunResult.cs
Line coverage
100%
Covered lines: 44
Uncovered lines: 0
Coverable lines: 44
Total lines: 70
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

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

File(s)

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

#LineLine coverage
 1using Microsoft.Extensions.AI;
 2
 3namespace NexusLabs.Needlr.AgentFramework.Diagnostics;
 4
 5/// <summary>
 6/// Default implementation of <see cref="IPipelineRunResult"/>.
 7/// </summary>
 8[DoNotAutoRegister]
 9internal sealed class PipelineRunResult : IPipelineRunResult
 10{
 11    private readonly Lazy<IReadOnlyDictionary<string, ChatResponse?>> _lazyResponses;
 12    private readonly Lazy<TokenUsage?> _lazyAggregateTokenUsage;
 13
 10114    internal PipelineRunResult(
 10115        IReadOnlyList<IAgentStageResult> stages,
 10116        TimeSpan totalDuration,
 10117        bool succeeded,
 10118        string? errorMessage,
 10119        Exception? exception = null,
 10120        int? plannedStageCount = null)
 21    {
 10122        Stages = stages;
 10123        PlannedStageCount = plannedStageCount ?? stages.Count;
 10124        TotalDuration = totalDuration;
 10125        Succeeded = succeeded;
 10126        ErrorMessage = errorMessage;
 10127        Exception = exception;
 28
 29        // GroupBy handles duplicate agent names (last stage wins).
 10130        _lazyResponses = new Lazy<IReadOnlyDictionary<string, ChatResponse?>>(() =>
 10431            stages
 432                .GroupBy(s => s.AgentName)
 11033                .ToDictionary(g => g.Key, g => g.Last().FinalResponse));
 34
 10135        _lazyAggregateTokenUsage = new Lazy<TokenUsage?>(() =>
 10136        {
 437            var diagnostics = stages
 538                .Select(s => s.Diagnostics)
 539                .Where(d => d is not null)
 440                .ToList();
 10141
 642            if (diagnostics.Count == 0) return null;
 10143
 10144            // AggregateTokenUsage is always non-null on IAgentRunDiagnostics produced by
 10145            // AgentRunDiagnosticsBuilder.Build() — the ! suppression is safe.
 246            return new TokenUsage(
 347                InputTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.InputTokens),
 348                OutputTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.OutputTokens),
 349                TotalTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.TotalTokens),
 350                CachedInputTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.CachedInputTokens),
 551                ReasoningTokens: diagnostics.Sum(d => d!.AggregateTokenUsage.ReasoningTokens));
 10152        });
 10153    }
 54
 7155    public IReadOnlyList<IAgentStageResult> Stages { get; }
 56
 557    public int PlannedStageCount { get; }
 58
 659    public IReadOnlyDictionary<string, ChatResponse?> FinalResponses => _lazyResponses.Value;
 60
 261    public TimeSpan TotalDuration { get; }
 62
 863    public TokenUsage? AggregateTokenUsage => _lazyAggregateTokenUsage.Value;
 64
 3165    public bool Succeeded { get; }
 66
 1167    public string? ErrorMessage { get; }
 68
 869    public Exception? Exception { get; }
 70}