| | | 1 | | namespace NexusLabs.Needlr.AgentFramework.Progress; |
| | | 2 | | |
| | | 3 | | /// <summary> |
| | | 4 | | /// Default <see cref="IProgressReporterFactory"/> that creates reporters with |
| | | 5 | | /// DI-registered default sinks or caller-provided per-orchestration sinks. |
| | | 6 | | /// </summary> |
| | | 7 | | /// <remarks> |
| | | 8 | | /// <para> |
| | | 9 | | /// Default sinks are resolved once at factory construction from all |
| | | 10 | | /// <see cref="IProgressSink"/> instances registered in DI. This includes |
| | | 11 | | /// sinks auto-discovered by Needlr and any added manually via |
| | | 12 | | /// <c>services.AddSingleton<IProgressSink, T>()</c>. |
| | | 13 | | /// </para> |
| | | 14 | | /// <para> |
| | | 15 | | /// The per-orchestration overload (<see cref="IProgressReporterFactory.Create(string, IEnumerable{IProgressSink})"/>) |
| | | 16 | | /// bypasses defaults entirely, giving callers full control. |
| | | 17 | | /// </para> |
| | | 18 | | /// </remarks> |
| | | 19 | | [DoNotAutoRegister] |
| | | 20 | | internal sealed class ProgressReporterFactory : IProgressReporterFactory |
| | | 21 | | { |
| | | 22 | | private readonly IReadOnlyList<IProgressSink> _defaultSinks; |
| | | 23 | | private readonly IProgressSequence _sequence; |
| | | 24 | | private readonly IProgressReporterErrorHandler _errorHandler; |
| | | 25 | | |
| | 21 | 26 | | internal ProgressReporterFactory( |
| | 21 | 27 | | IEnumerable<IProgressSink> defaultSinks, |
| | 21 | 28 | | IProgressSequence sequence, |
| | 21 | 29 | | IProgressReporterErrorHandler? errorHandler = null) |
| | | 30 | | { |
| | 21 | 31 | | _defaultSinks = defaultSinks.ToArray(); |
| | 21 | 32 | | _sequence = sequence; |
| | 21 | 33 | | _errorHandler = errorHandler ?? new NullProgressReporterErrorHandler(); |
| | 21 | 34 | | } |
| | | 35 | | |
| | | 36 | | /// <inheritdoc /> |
| | | 37 | | public IProgressReporter Create(string workflowId) |
| | | 38 | | { |
| | 4 | 39 | | if (_defaultSinks.Count == 0) |
| | 2 | 40 | | return NullProgressReporter.Instance; |
| | | 41 | | |
| | 2 | 42 | | return new ProgressReporter(workflowId, _defaultSinks, _sequence, _errorHandler); |
| | | 43 | | } |
| | | 44 | | |
| | | 45 | | /// <inheritdoc /> |
| | | 46 | | public IProgressReporter Create(string workflowId, IEnumerable<IProgressSink> sinks) |
| | | 47 | | { |
| | 13 | 48 | | var sinkList = sinks as IReadOnlyList<IProgressSink> ?? sinks.ToArray(); |
| | 13 | 49 | | if (sinkList.Count == 0) |
| | 1 | 50 | | return NullProgressReporter.Instance; |
| | | 51 | | |
| | 12 | 52 | | return new ProgressReporter(workflowId, sinkList, _sequence, _errorHandler); |
| | | 53 | | } |
| | | 54 | | } |