< 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
 8414    internal PipelineRunResult(
 8415        IReadOnlyList<IAgentStageResult> stages,
 8416        TimeSpan totalDuration,
 8417        bool succeeded,
 8418        string? errorMessage,
 8419        Exception? exception = null,
 8420        int? plannedStageCount = null)
 21    {
 8422        Stages = stages;
 8423        PlannedStageCount = plannedStageCount ?? stages.Count;
 8424        TotalDuration = totalDuration;
 8425        Succeeded = succeeded;
 8426        ErrorMessage = errorMessage;
 8427        Exception = exception;
 28
 29        // GroupBy handles duplicate agent names (last stage wins).
 8430        _lazyResponses = new Lazy<IReadOnlyDictionary<string, ChatResponse?>>(() =>
 8731            stages
 432                .GroupBy(s => s.AgentName)
 9333                .ToDictionary(g => g.Key, g => g.Last().FinalResponse));
 34
 8435        _lazyAggregateTokenUsage = new Lazy<TokenUsage?>(() =>
 8436        {
 437            var diagnostics = stages
 538                .Select(s => s.Diagnostics)
 539                .Where(d => d is not null)
 440                .ToList();
 8441
 642            if (diagnostics.Count == 0) return null;
 8443
 8444            // AggregateTokenUsage is always non-null on IAgentRunDiagnostics produced by
 8445            // 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));
 8452        });
 8453    }
 54
 5655    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}