diff --git a/.editorconfig b/.editorconfig index 3c4b5e5..1e4386a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -81,4 +81,8 @@ dotnet_style_coalesce_expression = true:suggestion dotnet_style_null_propagation = true:suggestion [*.{cs,vb}] -dotnet_sort_system_directives_first = true \ No newline at end of file +dotnet_sort_system_directives_first = true + +[*.cs] +# Some ExcelDna calls are not supported on all platforms: "This call site is reachable on all platforms. '...' is only supported on: 'Windows' 7.0 and later. +dotnet_diagnostic.CA1416.severity = none \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f672865..ae66d91 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,9 +4,11 @@ on: push: branches: - main + - develop pull_request: branches: - main + - develop workflow_dispatch: jobs: @@ -16,6 +18,8 @@ jobs: NUGET_PACKAGES: ${{ github.workspace }}\.nuget\packages steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Setup .NET uses: actions/setup-dotnet@v4 with: diff --git a/src/Cellm.Models/Behaviors/ToolBehavior.cs b/src/Cellm.Models/Behaviors/ToolBehavior.cs index 816be47..506e876 100644 --- a/src/Cellm.Models/Behaviors/ToolBehavior.cs +++ b/src/Cellm.Models/Behaviors/ToolBehavior.cs @@ -13,7 +13,7 @@ public async Task Handle(TRequest request, RequestHandlerDelegate t.Value)) { request.Prompt.Options.Tools = functions - .Where(f => providerConfiguration.CurrentValue.EnableTools[f.Metadata.Name]) + .Where(f => providerConfiguration.CurrentValue.EnableTools[f.Name]) .ToList(); } diff --git a/src/Cellm.Models/Cellm.Models.projitems b/src/Cellm.Models/Cellm.Models.projitems index e5af893..cfa7faa 100644 --- a/src/Cellm.Models/Cellm.Models.projitems +++ b/src/Cellm.Models/Cellm.Models.projitems @@ -20,7 +20,6 @@ - diff --git a/src/Cellm.Models/Providers/Anthropic/AnthropicRequest.cs b/src/Cellm.Models/Providers/Anthropic/AnthropicRequest.cs index 2e44e5d..a104d21 100644 --- a/src/Cellm.Models/Providers/Anthropic/AnthropicRequest.cs +++ b/src/Cellm.Models/Providers/Anthropic/AnthropicRequest.cs @@ -2,4 +2,4 @@ namespace Cellm.Models.Providers.Anthropic; -internal record AnthropicRequest(Prompt Prompt, Uri? BaseAddress = null) : IModelRequest; \ No newline at end of file +internal record AnthropicRequest(Prompt Prompt) : IModelRequest; \ No newline at end of file diff --git a/src/Cellm.Models/Providers/Anthropic/AnthropicRequestHandler.cs b/src/Cellm.Models/Providers/Anthropic/AnthropicRequestHandler.cs index 235d0e8..6396ff2 100644 --- a/src/Cellm.Models/Providers/Anthropic/AnthropicRequestHandler.cs +++ b/src/Cellm.Models/Providers/Anthropic/AnthropicRequestHandler.cs @@ -1,89 +1,26 @@ -using System.Text; -using System.Text.Encodings.Web; -using System.Text.Json; -using System.Text.Json.Serialization; -using Cellm.Models.Exceptions; -using Cellm.Models.Prompts; +using Cellm.Models.Prompts; using Microsoft.Extensions.AI; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Cellm.Models.Providers.Anthropic; -internal class AnthropicRequestHandler : IModelRequestHandler +internal class AnthropicRequestHandler( + [FromKeyedServices(Provider.Anthropic)] IChatClient chatClient, + IOptionsMonitor providerConfiguration) + : IModelRequestHandler { - private readonly AnthropicConfiguration _anthropicConfiguration; - private readonly ProviderConfiguration _providerConfiguration; - private readonly HttpClient _httpClient; - private readonly Serde _serde; - - public AnthropicRequestHandler( - IOptionsMonitor anthropicConfiguration, - IOptionsMonitor providerConfiguration, - HttpClient httpClient, - Serde serde) - { - _anthropicConfiguration = anthropicConfiguration.CurrentValue; - _providerConfiguration = providerConfiguration.CurrentValue; - _httpClient = httpClient; - _serde = serde; - } - public async Task Handle(AnthropicRequest request, CancellationToken cancellationToken) { - const string path = "/v1/messages"; - var address = request.BaseAddress is null ? new Uri(path, UriKind.Relative) : new Uri(request.BaseAddress, path); - - var json = Serialize(request); - var jsonAsStringContent = new StringContent(json, Encoding.UTF8, "application/json"); - jsonAsStringContent.Headers.Add("x-api-key", _anthropicConfiguration.ApiKey); - - var response = await _httpClient.PostAsync(address, jsonAsStringContent, cancellationToken); - var responseBodyAsString = await response.Content.ReadAsStringAsync(cancellationToken); - - if (!response.IsSuccessStatusCode) - { - throw new HttpRequestException($"{nameof(AnthropicRequest)} failed: {responseBodyAsString}", null, response.StatusCode); - } - - return Deserialize(request, responseBodyAsString); - } - - public string Serialize(AnthropicRequest request) - { - var requestBody = new AnthropicRequestBody - { - System = request.Prompt.Messages.Where(x => x.Role == ChatRole.System).First().Text, - Messages = request.Prompt.Messages.Where(x => x.Role != ChatRole.System).Select(x => new AnthropicMessage { Content = x.Text, Role = x.Role.ToString().ToLower() }).ToList(), - Model = request.Prompt.Options.ModelId ?? _anthropicConfiguration.DefaultModel, - Temperature = request.Prompt.Options.Temperature ?? _providerConfiguration.DefaultTemperature, - MaxTokens = 2048 - }; - - return _serde.Serialize(requestBody, new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull - }); - } - - public AnthropicResponse Deserialize(AnthropicRequest request, string response) - { - var responseBody = _serde.Deserialize(response, new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull - }); + // Required by Anthropic API + request.Prompt.Options.MaxOutputTokens ??= providerConfiguration.CurrentValue.MaxOutputTokens; - var assistantMessage = responseBody?.Content?.Last()?.Text ?? throw new CellmModelException("#EMPTY_RESPONSE?"); + var chatResponse = await chatClient.GetResponseAsync(request.Prompt.Messages, request.Prompt.Options, cancellationToken); var prompt = new PromptBuilder(request.Prompt) - .AddAssistantMessage(assistantMessage) + .AddMessage(chatResponse.Messages.First()) .Build(); - var chatCompletion = new ChatCompletion(new ChatMessage(ChatRole.Assistant, assistantMessage)); - - return new AnthropicResponse(prompt, chatCompletion); + return new AnthropicResponse(prompt, chatResponse); } } diff --git a/src/Cellm.Models/Providers/Anthropic/AnthropicResponse.cs b/src/Cellm.Models/Providers/Anthropic/AnthropicResponse.cs index 865aab1..8c91711 100644 --- a/src/Cellm.Models/Providers/Anthropic/AnthropicResponse.cs +++ b/src/Cellm.Models/Providers/Anthropic/AnthropicResponse.cs @@ -3,4 +3,4 @@ namespace Cellm.Models.Providers.Anthropic; -internal record AnthropicResponse(Prompt Prompt, ChatCompletion ChatCompletion) : IModelResponse; \ No newline at end of file +internal record AnthropicResponse(Prompt Prompt, ChatResponse ChatResponse) : IModelResponse; \ No newline at end of file diff --git a/src/Cellm.Models/Providers/Anthropic/Models.cs b/src/Cellm.Models/Providers/Anthropic/Models.cs deleted file mode 100644 index 0d333ee..0000000 --- a/src/Cellm.Models/Providers/Anthropic/Models.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Text.Json.Serialization; - -namespace Cellm.Models.Providers.Anthropic; - -public class AnthropicResponseBody -{ - public List? Content { get; set; } - - public string? Id { get; set; } - - public string? Model { get; set; } - - public string? Role { get; set; } - - [JsonPropertyName("stop_reason")] - public string? StopReason { get; set; } - - [JsonPropertyName("stop_sequence")] - public string? StopSequence { get; set; } - - public string? Type { get; set; } - - public AnthropicUsage? Usage { get; set; } -} - -public class AnthropicRequestBody -{ - public List? Messages { get; set; } - - public string? System { get; set; } - - public string? Model { get; set; } - - [JsonPropertyName("max_tokens")] - public int MaxTokens { get; set; } - - public double Temperature { get; set; } -} - -public class AnthropicMessage -{ - public string? Role { get; set; } - - public string? Content { get; set; } -} - -public class AnthropicContent -{ - public string? Text { get; set; } - - public string? Type { get; set; } -} - -public class AnthropicUsage -{ - public int InputTokens { get; set; } - - public int OutputTokens { get; set; } -} \ No newline at end of file diff --git a/src/Cellm.Models/Providers/IModelResponse.cs b/src/Cellm.Models/Providers/IModelResponse.cs index bfa73ea..09a5c1b 100644 --- a/src/Cellm.Models/Providers/IModelResponse.cs +++ b/src/Cellm.Models/Providers/IModelResponse.cs @@ -7,5 +7,5 @@ public interface IModelResponse { Prompt Prompt { get; } - ChatCompletion ChatCompletion { get; } + ChatResponse ChatResponse { get; } } \ No newline at end of file diff --git a/src/Cellm.Models/Providers/Ollama/OllamaRequestHandler.cs b/src/Cellm.Models/Providers/Ollama/OllamaRequestHandler.cs index 7836f5a..2bca168 100644 --- a/src/Cellm.Models/Providers/Ollama/OllamaRequestHandler.cs +++ b/src/Cellm.Models/Providers/Ollama/OllamaRequestHandler.cs @@ -28,15 +28,15 @@ public async Task Handle(OllamaRequest request, CancellationToke response.EnsureSuccessStatusCode(); } - var chatCompletion = await chatClient.CompleteAsync( + var chatResponse = await chatClient.GetResponseAsync( request.Prompt.Messages, request.Prompt.Options, cancellationToken); var prompt = new PromptBuilder(request.Prompt) - .AddMessage(chatCompletion.Message) + .AddMessage(chatResponse.Messages.First()) .Build(); - return new OllamaResponse(prompt, chatCompletion); + return new OllamaResponse(prompt, chatResponse); } } diff --git a/src/Cellm.Models/Providers/Ollama/OllamaResponse.cs b/src/Cellm.Models/Providers/Ollama/OllamaResponse.cs index 8e008c3..d6c5750 100644 --- a/src/Cellm.Models/Providers/Ollama/OllamaResponse.cs +++ b/src/Cellm.Models/Providers/Ollama/OllamaResponse.cs @@ -3,4 +3,4 @@ namespace Cellm.Models.Providers.Ollama; -internal record OllamaResponse(Prompt Prompt, ChatCompletion ChatCompletion) : IModelResponse; \ No newline at end of file +internal record OllamaResponse(Prompt Prompt, ChatResponse ChatResponse) : IModelResponse; \ No newline at end of file diff --git a/src/Cellm.Models/Providers/OpenAi/OpenAiRequestHandler.cs b/src/Cellm.Models/Providers/OpenAi/OpenAiRequestHandler.cs index 47a5f9b..f42dedd 100644 --- a/src/Cellm.Models/Providers/OpenAi/OpenAiRequestHandler.cs +++ b/src/Cellm.Models/Providers/OpenAi/OpenAiRequestHandler.cs @@ -10,12 +10,12 @@ internal class OpenAiRequestHandler([FromKeyedServices(Provider.OpenAi)] IChatCl public async Task Handle(OpenAiRequest request, CancellationToken cancellationToken) { - var chatCompletion = await chatClient.CompleteAsync(request.Prompt.Messages, request.Prompt.Options, cancellationToken); + var chatResponse = await chatClient.GetResponseAsync(request.Prompt.Messages, request.Prompt.Options, cancellationToken); var prompt = new PromptBuilder(request.Prompt) - .AddMessage(chatCompletion.Message) + .AddMessage(chatResponse.Messages.First()) .Build(); - return new OpenAiResponse(prompt, chatCompletion); + return new OpenAiResponse(prompt, chatResponse); } } diff --git a/src/Cellm.Models/Providers/OpenAi/OpenAiResponse.cs b/src/Cellm.Models/Providers/OpenAi/OpenAiResponse.cs index 7559c6e..0c889b5 100644 --- a/src/Cellm.Models/Providers/OpenAi/OpenAiResponse.cs +++ b/src/Cellm.Models/Providers/OpenAi/OpenAiResponse.cs @@ -3,4 +3,4 @@ namespace Cellm.Models.Providers.OpenAi; -internal record OpenAiResponse(Prompt Prompt, ChatCompletion ChatCompletion) : IModelResponse; +internal record OpenAiResponse(Prompt Prompt, ChatResponse ChatResponse) : IModelResponse; diff --git a/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleRequestHandler.cs b/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleRequestHandler.cs index a82719d..d941d50 100644 --- a/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleRequestHandler.cs +++ b/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleRequestHandler.cs @@ -13,12 +13,12 @@ public async Task Handle(OpenAiCompatibleRequest reque { var chatClient = ServiceLocator.ServiceProvider.GetRequiredKeyedService(request.Provider); - var chatCompletion = await chatClient.CompleteAsync(request.Prompt.Messages, request.Prompt.Options, cancellationToken); + var chatResponse = await chatClient.GetResponseAsync(request.Prompt.Messages, request.Prompt.Options, cancellationToken); var prompt = new PromptBuilder(request.Prompt) - .AddMessage(chatCompletion.Message) + .AddMessage(chatResponse.Messages.First()) .Build(); - return new OpenAiCompatibleResponse(prompt, chatCompletion); + return new OpenAiCompatibleResponse(prompt, chatResponse); } } diff --git a/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleResponse.cs b/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleResponse.cs index ebd2dcd..9442280 100644 --- a/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleResponse.cs +++ b/src/Cellm.Models/Providers/OpenAiCompatible/OpenAiCompatibleResponse.cs @@ -3,4 +3,4 @@ namespace Cellm.Models.Providers.OpenAiCompatible; -internal record OpenAiCompatibleResponse(Prompt Prompt, ChatCompletion ChatCompletion) : IModelResponse; +internal record OpenAiCompatibleResponse(Prompt Prompt, ChatResponse ChatResponse) : IModelResponse; diff --git a/src/Cellm.Models/Providers/ProviderConfiguration.cs b/src/Cellm.Models/Providers/ProviderConfiguration.cs index f9c753c..8ab2e71 100644 --- a/src/Cellm.Models/Providers/ProviderConfiguration.cs +++ b/src/Cellm.Models/Providers/ProviderConfiguration.cs @@ -8,6 +8,8 @@ public class ProviderConfiguration : IProviderConfiguration public double DefaultTemperature { get; init; } + public int MaxOutputTokens { get; init; } = 8192; + public Dictionary EnableTools { get; init; } = []; public bool EnableCache { get; init; } = true; diff --git a/src/Cellm.Models/ServiceCollectionExtensions.cs b/src/Cellm.Models/ServiceCollectionExtensions.cs index 6f46752..c44e5de 100644 --- a/src/Cellm.Models/ServiceCollectionExtensions.cs +++ b/src/Cellm.Models/ServiceCollectionExtensions.cs @@ -1,6 +1,7 @@ using System.ClientModel; using System.ClientModel.Primitives; using System.Threading.RateLimiting; +using Anthropic.SDK; using Cellm.Models.Providers; using Cellm.Models.Providers.Anthropic; using Cellm.Models.Providers.DeepSeek; @@ -10,7 +11,6 @@ using Cellm.Models.Providers.OpenAi; using Cellm.Models.Providers.OpenAiCompatible; using Cellm.Models.Resilience; -using MediatR; using Microsoft.Extensions.AI; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -118,47 +118,18 @@ public static IServiceCollection AddRetryHttpClient(this IServiceCollection serv public static IServiceCollection AddAnthropicChatClient(this IServiceCollection services, IConfiguration configuration) { - var anthropicConfiguration = configuration - .GetSection(nameof(AnthropicConfiguration)) - .Get() - ?? throw new ArgumentException(nameof(AnthropicConfiguration)); - - var resilienceConfiguration = configuration - .GetSection(nameof(ResilienceConfiguration)) - .Get() - ?? throw new ArgumentException(nameof(ResilienceConfiguration)); - services - .AddHttpClient, AnthropicRequestHandler>(anthropicHttpClient => - { - anthropicHttpClient.BaseAddress = anthropicConfiguration.BaseAddress; - anthropicHttpClient.DefaultRequestHeaders.Add("anthropic-version", anthropicConfiguration.Version); - anthropicHttpClient.Timeout = TimeSpan.FromSeconds(resilienceConfiguration.RetryConfiguration.HttpTimeoutInSeconds); - }) - .AddResilienceHandler($"{nameof(AnthropicRequestHandler)}RetryHttpClientHandler", builder => + .AddTransientKeyedChatClient(Provider.Anthropic, serviceProvider => { - _ = builder - .AddRetry(new RetryStrategyOptions - { - ShouldHandle = args => ValueTask.FromResult(RetryHttpClientHelpers.ShouldRetry(args.Outcome)), - BackoffType = DelayBackoffType.Exponential, - UseJitter = true, - MaxRetryAttempts = resilienceConfiguration.RetryConfiguration.MaxRetryAttempts, - Delay = TimeSpan.FromSeconds(resilienceConfiguration.RetryConfiguration.DelayInSeconds), - }) - .AddCircuitBreaker(new CircuitBreakerStrategyOptions - { - ShouldHandle = args => ValueTask.FromResult(RetryHttpClientHelpers.ShouldBreakCircuit(args.Outcome)), - FailureRatio = resilienceConfiguration.CircuitBreakerConfiguration.FailureRatio, - SamplingDuration = TimeSpan.FromSeconds(resilienceConfiguration.CircuitBreakerConfiguration.SamplingDurationInSeconds), - MinimumThroughput = resilienceConfiguration.CircuitBreakerConfiguration.MinimumThroughput, - BreakDuration = TimeSpan.FromSeconds(resilienceConfiguration.CircuitBreakerConfiguration.BreakDurationInSeconds), - }) - .AddTimeout(TimeSpan.FromSeconds(resilienceConfiguration.RetryConfiguration.HttpTimeoutInSeconds)) - .Build(); - }); + var anthropicConfiguration = serviceProvider.GetRequiredService>(); + var resilientHttpClient = serviceProvider.GetKeyedService("ResilientHttpClient") ?? throw new NullReferenceException("ResilientHttpClient"); - // TODO: Add IChatClient-compatible Anthropic client + return new AnthropicClient(anthropicConfiguration.CurrentValue.ApiKey, resilientHttpClient) + .Messages + .AsBuilder() + .Build(); + }) + .UseFunctionInvocation(); return services; } diff --git a/src/Cellm/Cellm.csproj b/src/Cellm/Cellm.csproj index fd74df6..190c17d 100644 --- a/src/Cellm/Cellm.csproj +++ b/src/Cellm/Cellm.csproj @@ -5,6 +5,9 @@ enable enable true + + + false @@ -18,30 +21,35 @@ + - - - - - - - - - - - - - - - - - - - - - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest diff --git a/src/Cellm/Services/ServiceLocator.cs b/src/Cellm/Services/ServiceLocator.cs index 25e3395..111dd37 100644 --- a/src/Cellm/Services/ServiceLocator.cs +++ b/src/Cellm/Services/ServiceLocator.cs @@ -70,12 +70,17 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) services .AddLogging(loggingBuilder => { + var assembly = Assembly.GetExecutingAssembly(); + var gitVersionInformationType = assembly.GetType("GitVersionInformation"); + var assemblyInformationalVersion = gitVersionInformationType?.GetField("AssemblyInformationalVersion"); + loggingBuilder .AddConsole() .AddDebug() .AddSentry(sentryLoggingOptions => { sentryLoggingOptions.InitializeSdk = sentryConfiguration.IsEnabled; + sentryLoggingOptions.Release = GetReleaseVersion(); sentryLoggingOptions.Dsn = sentryConfiguration.Dsn; sentryLoggingOptions.Debug = cellmConfiguration.Debug; sentryLoggingOptions.DiagnosticLevel = SentryLevel.Debug; @@ -129,9 +134,36 @@ private static IServiceCollection ConfigureServices(IServiceCollection services) serviceProvider => AIFunctionFactory.Create(serviceProvider.GetRequiredService().GlobRequest), serviceProvider => AIFunctionFactory.Create(serviceProvider.GetRequiredService().FileReaderRequest)); + // https://github.com/openai/openai-dotnet/issues/297 + var metricsFilterDescriptor = services.FirstOrDefault(descriptor => + descriptor.ImplementationType?.ToString() == $"Microsoft.Extensions.Http.MetricsFactoryHttpMessageHandlerFilter"); + + if (metricsFilterDescriptor is not null) + { + services.Remove(metricsFilterDescriptor); + } + return services; } + public static string GetReleaseVersion() + { + var releaseVersion = "unknown"; + + var value = Assembly + .GetExecutingAssembly() + .GetType("GitVersionInformation")? + .GetField("AssemblyInformationalVersion")? + .GetValue(null); + + if (value is string valueAsString) + { + releaseVersion = valueAsString; + } + + return releaseVersion; + } + public static void Dispose() { if (_serviceProvider.IsValueCreated) diff --git a/src/Cellm/packages.lock.json b/src/Cellm/packages.lock.json index ee5cac9..d56fb25 100644 --- a/src/Cellm/packages.lock.json +++ b/src/Cellm/packages.lock.json @@ -2,6 +2,16 @@ "version": 1, "dependencies": { "net9.0-windows7.0": { + "Anthropic.SDK": { + "type": "Direct", + "requested": "[5.1.1, )", + "resolved": "5.1.1", + "contentHash": "+OHZUBpcYfVoBMUn7aBZ99ziAV/qGbe1fVUq+fpBPoOwk7dPevyFtPFx1t0sIajD/2Fq8TEDX1XEmhPpnrEpiw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.AI.Abstractions": "9.3.0-preview.1.25161.3" + } + }, "ExcelDna.AddIn": { "type": "Direct", "requested": "[1.9.0-alpha3, )", @@ -17,11 +27,20 @@ "resolved": "15.0.1", "contentHash": "CIKPXlw+6C6v2Em8DVFgkTsrMZoz978CtSG722+dwHi3Tt7JTxQ2BmmBH4yJuzcA9EaOC5AMEmioLkLsvhESQw==" }, + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[6.2.0, )", + "resolved": "6.2.0", + "contentHash": "EZoFyY1fgHkYtCz0nizYAXsfNG0OSllMuRQl4fFosDNKz6y/f2nctSCjwhTMh5GSkzRZEnyd+YA540VD7SAm+A==", + "dependencies": { + "System.Collections.Immutable": "9.0.2" + } + }, "MediatR": { "type": "Direct", - "requested": "[12.4.1, )", - "resolved": "12.4.1", - "contentHash": "0tLxCgEC5+r1OCuumR3sWyiVa+BMv3AgiU4+pz8xqTc+2q1WbUEXFOr7Orm96oZ9r9FsldgUtWvB2o7b9jDOaw==", + "requested": "[12.5.0, )", + "resolved": "12.5.0", + "contentHash": "vqm2H8/nqL5NAJHPhsG1JOPwfkmbVrPyh4svdoRzu+uZh6Ex7PRoHBGsLYC0/RWCEJFqD1ohHNpteQvql9OktA==", "dependencies": { "MediatR.Contracts": "[2.0.1, 3.0.0)", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" @@ -29,223 +48,223 @@ }, "Microsoft.Extensions.AI": { "type": "Direct", - "requested": "[9.1.0-preview.1.25064.3, )", - "resolved": "9.1.0-preview.1.25064.3", - "contentHash": "KtVp9GRTRuJFxka6EOik+Hy/riZ7Nwefmxez2moM7zrQz+7vsiLJ9VIVyEWhi9Vz65MNBxnT3jsqLeaXMM73lA==", + "requested": "[9.3.0-preview.1.25161.3, )", + "resolved": "9.3.0-preview.1.25161.3", + "contentHash": "i1LLMJucYogyImy91Fm+eJv+AfsQ3gdpQnDcrsweWg6SWoa/xFlVnqYRtifsHwucRxv2da/JET1RMRiVB6rIug==", "dependencies": { - "Microsoft.Extensions.AI.Abstractions": "9.1.0-preview.1.25064.3", - "Microsoft.Extensions.Caching.Abstractions": "9.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "System.Diagnostics.DiagnosticSource": "9.0.1", - "System.Text.Json": "9.0.1", - "System.Threading.Channels": "9.0.1" + "Microsoft.Extensions.AI.Abstractions": "9.3.0-preview.1.25161.3", + "Microsoft.Extensions.Caching.Abstractions": "9.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "System.Diagnostics.DiagnosticSource": "9.0.3", + "System.Text.Json": "9.0.3", + "System.Threading.Channels": "9.0.3" } }, "Microsoft.Extensions.AI.Abstractions": { "type": "Direct", - "requested": "[9.1.0-preview.1.25064.3, )", - "resolved": "9.1.0-preview.1.25064.3", - "contentHash": "qxGgo8ipnJz9viMQBMrnmYymi9cZWV0kep/wNTHgLhieYBCVvkMnOskaoNzRjCMl9hwEkXnZTQIwYk2WbpmmWA==" + "requested": "[9.3.0-preview.1.25161.3, )", + "resolved": "9.3.0-preview.1.25161.3", + "contentHash": "1BGoGmGQKwDOkf4I5/Ybt3GL5O+/3JPlZ/AM0uLspHn5DpPb2Wpi9HYKEMjTECFvW+pk+vtFaBYQmNdudl26fw==" }, "Microsoft.Extensions.AI.Ollama": { "type": "Direct", - "requested": "[9.1.0-preview.1.25064.3, )", - "resolved": "9.1.0-preview.1.25064.3", - "contentHash": "/0xF8C2xtmKvm1ls94sBV+N4jFWjmW9A/hKUT78tCbzN6dnuL/mjP8FNWVOoXM8OX8Uz/JVSSU6heWAFLv8B/w==", + "requested": "[9.3.0-preview.1.25161.3, )", + "resolved": "9.3.0-preview.1.25161.3", + "contentHash": "9/S/ypCMTpmBiLsmX3lKX1pJ6jZJAXAlI4ur1gUbMLbuyfum7KoQqjwa/o6RrXbX9bMeQmo54VJx6tAXL/YrsQ==", "dependencies": { - "Microsoft.Extensions.AI.Abstractions": "9.1.0-preview.1.25064.3", - "System.Net.Http.Json": "9.0.1", - "System.Text.Json": "9.0.1" + "Microsoft.Extensions.AI.Abstractions": "9.3.0-preview.1.25161.3", + "System.Net.Http.Json": "9.0.3", + "System.Text.Json": "9.0.3" } }, "Microsoft.Extensions.AI.OpenAI": { "type": "Direct", - "requested": "[9.1.0-preview.1.25064.3, )", - "resolved": "9.1.0-preview.1.25064.3", - "contentHash": "4JIONtgBuAdO68/zxVfFPj/YlqpPASzJYehbPtx10lLPqPbYHav310WMTVqjGM12uakMVcIGnyRNL2bLeArHCw==", + "requested": "[9.3.0-preview.1.25161.3, )", + "resolved": "9.3.0-preview.1.25161.3", + "contentHash": "9WFXCcY8ehUc/W49+QljYzuFzqp886FL9rDtgUyP+lyLlL9GjZVHMMhsUe3bXUndOr2J5WcP9LGH39fH1zgIAw==", "dependencies": { - "Microsoft.Extensions.AI.Abstractions": "9.1.0-preview.1.25064.3", - "OpenAI": "2.1.0", - "System.Memory.Data": "9.0.1", - "System.Text.Json": "9.0.1" + "Microsoft.Extensions.AI.Abstractions": "9.3.0-preview.1.25161.3", + "OpenAI": "2.2.0-beta.1", + "System.Memory.Data": "9.0.3", + "System.Text.Json": "9.0.3" } }, "Microsoft.Extensions.Caching.Hybrid": { "type": "Direct", - "requested": "[9.1.0-preview.1.25064.3, )", - "resolved": "9.1.0-preview.1.25064.3", - "contentHash": "eLR72jEoNV9Z2VgAJd2Gc2qgTQmaw1oLpDqRMhsIkSAYMBm9oEBapPuhPMY3mumjQ6tm4mLkxmBAlONqaqUSqw==", + "requested": "[9.3.0, )", + "resolved": "9.3.0", + "contentHash": "hE3B/gMUg1et/hbntomsWmYM+Uv9K3CwLjzYkGBBqrx3hIiH+y2KbucV35OR+Rv1tiSpEyiTPVULvwtaXLWCSA==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.1", - "Microsoft.Extensions.Caching.Memory": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1" + "Microsoft.Extensions.Caching.Abstractions": "9.0.3", + "Microsoft.Extensions.Caching.Memory": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3" } }, "Microsoft.Extensions.Configuration": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "VuthqFS+ju6vT8W4wevdhEFiRi1trvQtkzWLonApfF5USVzzDcTBoY3F24WvN/tffLSrycArVfX1bThm/9xY2A==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "RIEeZxWYm77+OWLwgik7DzSVSONjqkmcbuCb1koZdGAV7BgOUWnLz80VMyHZMw3onrVwFCCMHBBdruBPuQTvkg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3", + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "+4hfFIY1UjBCXFTTOd+ojlDPq6mep3h5Vq5SYE3Pjucr7dNXmq4S/6P/LoVnZFz2e/5gWp/om4svUFgznfULcA==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "q5qlbm6GRUrle2ZZxy9aqS/wWoc+mRD3JeP6rcpiJTh5XcemYkplAcJKq8lU11ZfPom5lfbZZfnQvDqcUhqD5Q==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.Configuration.Json": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "z+g+lgPET1JRDjsOkFe51rkkNcnJgvOK5UIpeTfF1iAi0GkBJz5/yUuTa8a9V8HUh4gj4xFT5WGoMoXoSDKfGg==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "mjkp3ZwynNacZk4uq93I0DyCY48FZmi3yRV0xlfeDuWh44KcDunPXHwt8IWr4kL7cVM6eiFVe6YTJg97KzUAUA==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1", - "Microsoft.Extensions.Configuration.FileExtensions": "9.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1" + "Microsoft.Extensions.Configuration": "9.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3", + "Microsoft.Extensions.Configuration.FileExtensions": "9.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.3" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "qZI42ASAe3hr2zMSA6UjM92pO1LeDq5DcwkgSowXXPY8I56M76pEKrnmsKKbxagAf39AJxkH2DY4sb72ixyOrg==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "lDbxJpkl6X8KZGpkAxgrrthQ42YeiR0xjPp7KPx+sCPc3ZbpaIbjzd0QQ+9kDdK2RU2DOl3pc6tQyAgEZY3V0A==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3" } }, "Microsoft.Extensions.FileSystemGlobbing": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "Mxcp9NXuQMvAnudRZcgIb5SqlWrlullQzntBLTwuv0MPIJ5LqiGwbRqiyxgdk+vtCoUkplb0oXy5kAw1t469Ug==" + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "Rec77KHk4iNpFznHi5/6wF3MlUDcKqg26t8gRYbUm1PSukZ4B6mrXpZsJSNOiwyhhQVkjYbaoZxi5XJgRQ5lFg==" }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "j1UmqmTRIc0OJhv8feVFmXhPS/Z+82o/JLF3WKlydC3esolPVVJPJ0oq/MSECXFZMBKVVpxUBJnR6dJH1hTWzQ==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "rwChgI3lPqvUzsCN3egSW/6v4kP9/RQ2QrkZUwyAiHiwEoIB6QbYkATNvUsgjV6nfrekocyciCzy53ZFRuSaHA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Diagnostics": "9.0.1", - "Microsoft.Extensions.Logging": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Diagnostics": "9.0.3", + "Microsoft.Extensions.Logging": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Direct", - "requested": "[9.1.0, )", - "resolved": "9.1.0", - "contentHash": "iOudmNhkE3g4q2oPcI/WnLUJlcDuK/0F2pVQ3iC7rlEzzbs3l1ynD3NfkanMqvOPqIf5sSrHlXSwKtILVBj4lA==", + "requested": "[9.3.0, )", + "resolved": "9.3.0", + "contentHash": "mSZC9Y4MVlP48+r+cdt17KhEGIkaMfsicwmVM3iXKjXwtRJ2HVQXp5ce/FWu2VHRWdzKNh4/ikooA+orJhpZiw==", "dependencies": { - "Microsoft.Extensions.Configuration.Binder": "9.0.1", - "Microsoft.Extensions.Http.Diagnostics": "9.1.0", - "Microsoft.Extensions.ObjectPool": "9.0.1", - "Microsoft.Extensions.Resilience": "9.1.0" + "Microsoft.Extensions.Configuration.Binder": "9.0.3", + "Microsoft.Extensions.Http.Diagnostics": "9.3.0", + "Microsoft.Extensions.ObjectPool": "9.0.3", + "Microsoft.Extensions.Resilience": "9.3.0" } }, "Microsoft.Extensions.Logging": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "E/k5r7S44DOW+08xQPnNbO8DKAQHhkspDboTThNJ6Z3/QBb4LC6gStNWzVmy3IvW7sUD+iJKf4fj0xEkqE7vnQ==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "utIi2R1nm+PCWkvWBf1Ou6LWqg9iLfHU23r8yyU9VCvda4dEs7xbTZSwGa5KuwbpzpgCbHCIuKaFHB3zyFmnGw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1" + "Microsoft.Extensions.DependencyInjection": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3" } }, "Microsoft.Extensions.Logging.Console": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "YUzguHYlWfp4upfYlpVe3dnY59P25wc+/YLJ9/NQcblT3EvAB1CObQulClll7NtnFbbx4Js0a0UfyS8SbRsWXQ==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "o9VXLOdpTAro1q7ZThIB3S8OHrRn5pr8cFUCiN85fiwlfAt2DhU4ZIfHy+jCNbf7y7S5Exbr3dlDE8mKNrs0Yg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Logging": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.Logging.Configuration": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Logging": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "Microsoft.Extensions.Logging.Configuration": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3" } }, "Microsoft.Extensions.Logging.Debug": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "pzdyibIV8k4sym0Sszcp2MJCuXrpOGs9qfOvY+hCRu8k4HbdVoeKOLnacxHK6vEPITX5o5FjjsZW2zScLXTjYA==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "BlKgvNYjD6mY5GXpMCf9zPAsrovMgW5mzCOT7SpoOSyI1478zldf+7PKvDIscC277z5zjSO3yi/OuIWpnTZmdA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Logging": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Logging": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3" } }, "Microsoft.Extensions.Options": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "nggoNKnWcsBIAaOWHA+53XZWrslC7aGeok+aR+epDPRy7HI7GwMnGZE8yEsL2Onw7kMOHVHwKcsDls1INkNUJQ==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "xE7MpY70lkw1oiid5y6FbL9dVw8oLfkx8RhSNGN8sSzBlCqGn0SyT3Fqc8tZnDaPIq7Z8R9RTKlS564DS+MV3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "8RRKWtuU4fR+8MQLR/8CqZwZ9yc2xCpllw/WPRY7kskIqEq0hMcEI4AfUJO72yGiK2QJkrsDcUvgB5Yc+3+lyg==", + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "PcyYHQglKnWVZHSPaL6v2qnfsIuFw8tSq7cyXHg3OeuDVn/CqmdWUjRiZomCF/Gi+qCi+ksz0lFphg2cNvB8zQ==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1", - "Microsoft.Extensions.Configuration.Binder": "9.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3", + "Microsoft.Extensions.Configuration.Binder": "9.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3", + "Microsoft.Extensions.Primitives": "9.0.3" } }, "PdfPig": { "type": "Direct", - "requested": "[0.1.9, )", - "resolved": "0.1.9", - "contentHash": "VU27oq5O0rpD+zWiD639xXkSHtsNXqbPpYV0pzYg9VPhDibH1cq1i67f9DuW2WnzDVEti0HipLcZxDhdayIzGg==" + "requested": "[0.1.10, )", + "resolved": "0.1.10", + "contentHash": "9baMcYq7yL0QuaI0ZGq24EB5HY6oVa8ZhspEgYfo4gXpTLqk8RMIMlxtWr3mwuxguheIdscIFH2TN77y5y4L8g==" }, "Sentry.Extensions.Logging": { "type": "Direct", - "requested": "[5.0.1, )", - "resolved": "5.0.1", - "contentHash": "SBeyXmc7q2xX2FA2fJniMkHYtowdc6tCwtv9rHuW9e/NtazxIeRt5ltpSbBRn9UtodOvxB5bRLFOvFExuGeIag==", + "requested": "[5.5.0, )", + "resolved": "5.5.0", + "contentHash": "oVoCHy3oWZDLSf/tzQSW+CJAhhvkqY90K9in5I3SF7UKGEOd9Pm7rOa8L3avQZYoqqcyHrxXck5CNAVWuZdJkA==", "dependencies": { "Microsoft.Extensions.Configuration.Binder": "9.0.0", "Microsoft.Extensions.Http": "9.0.0", "Microsoft.Extensions.Logging.Configuration": "9.0.0", - "Sentry": "5.0.1" + "Sentry": "5.5.0" } }, "Sentry.Profiling": { "type": "Direct", - "requested": "[5.0.1, )", - "resolved": "5.0.1", - "contentHash": "pZOwEEE20rFac0kBGLQxmPRnSqMYld55J7zKxwVKMMP0QvUdG0NLCtE8pIi4032dltT3pwYjv3MtuXOBYb/MbA==", + "requested": "[5.5.0, )", + "resolved": "5.5.0", + "contentHash": "JuuBZ7RciyZkj77bAyYU7S0zed5z9GvOVzigtlnx13Mb22iejiXlmN3cFLXUWbLJM3SMyO90lmE3J54EDrtizg==", "dependencies": { "Microsoft.Diagnostics.NETCore.Client": "0.2.510501", - "Sentry": "5.0.1" + "Sentry": "5.5.0" } }, "System.Net.Http.Json": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "MhCJ2P2txSz4MMXi7TTutycFdbzPDU/A+pwUNpF6zvbDyZtFtvXJN4EEOuIq8b6sZfarakACnXqr0dTYGjUqzQ==" + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "1PLQgaGNBaU6OYwXCcsvOncpayCaYy7gp2BsXrXHxQToKdTnLHHf5/MXyMf0nD6SfY9MMb/TC8HWR2weaNQctA==" }, "ExcelDna.Integration": { "type": "Transitive", @@ -257,6 +276,11 @@ "resolved": "2.0.1", "contentHash": "FYv95bNT4UwcNA+G/J1oX5OpRiSUxteXaUt2BJbRSdRNiIUNbggJF69wy6mnk2wYToaanpdXZdCwVylt96MpwQ==" }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + }, "Microsoft.Diagnostics.NETCore.Client": { "type": "Transitive", "resolved": "0.2.510501", @@ -267,218 +291,218 @@ }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "npXgOV721JphvTebGOdGdxzKbcn7FWvNgI0qnAOJTH2H5cH8z1XoyCG8ZcmiR5roenNdJTWU51ft4JB/oar0Pw==", + "resolved": "9.3.0", + "contentHash": "jMZt1Rxt5uJvZNVkckNGTUlpof7IENNKHKJ3kJWgoSiETzOXeavP/8rt965oqkUq3d+ZKHO/0T2xL6+NytAIYA==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.1", - "Microsoft.Extensions.Hosting.Abstractions": "9.0.1", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1" + "Microsoft.Extensions.Configuration": "9.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "9.0.3", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.3" } }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "Eghsg9SyIvq0c8x6cUpe71BbQoOmsytXxqw2+ZNiTnP8a8SBLKgEor1zZeWhC0588IbS2M0PP4gXGAd9qF862Q==", + "resolved": "9.0.3", + "contentHash": "t8b0R6wtqC4o0hJ+oQkLPydw2MMLEoLEpQXCWbzXAm9NBMOngkDZNcvwF6DxbYdL5SlfZJXbYmiOxKZmwHNgNg==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "JeC+PP0BCKMwwLezPGDaciJSTfcFG4KjsG8rX4XZ6RSvzdxofrFmcnmW2L4+cWUcZSBTQ+Dd7H5Gs9XZz/OlCA==", + "resolved": "9.0.3", + "contentHash": "TXggBGDDd6r+J7FV09plXpzGmWcknVyoDsHlY2qcCbcAhmb0eH7Q9IkfIZl54/zEedVTa9jPgiPFTxH9WuCGMQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.Caching.Abstractions": "9.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3", + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "Q3Kv8/pel2jH6iuxtM4RhBSVufv0vm7drAzGUJt9v0xdJsjbRjidvUgU/hrANdOO1yNA/k1RZl2N9KgubE3KZA==", + "resolved": "9.3.0", + "contentHash": "q9lRkdVrKAO4J8xyX6b9eCN8KD7BYYvJuTpc6GjhOnawJi6aZNOsCkiacZSp8s5X3j8yHKef7TGtld/xtYH8Ew==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.ObjectPool": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.ObjectPool": "9.0.3" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "w7kAyu1Mm7eParRV6WvGNNwA8flPTub16fwH49h7b/yqJZFTgYxnOVCuiah3G2bgseJMEq4DLjjsyQRvsdzRgA==", + "resolved": "9.0.3", + "contentHash": "ad82pYBUSQbd3WIboxsS1HzFdRuHKRa2CpYwie/o6dZAxUjt62yFwjoVdM7Iw2VO5fHV1rJwa7jJZBNZin0E7Q==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3" } }, "Microsoft.Extensions.Configuration.FileExtensions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "QBOI8YVAyKqeshYOyxSe6co22oag431vxMu5xQe1EjXMkYE4xK4J71xLCW3/bWKmr9Aoy1VqGUARSLFnotk4Bg==", + "resolved": "9.0.3", + "contentHash": "tBNMSDJ2q7WQK2zwPhHY5I/q95t7sf6dT079mGrNm0yOZF/gM9JvR/LtCb/rwhRmh7A6XMnzv5WbpCh9KLq9EQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1", - "Microsoft.Extensions.FileProviders.Physical": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.Configuration": "9.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.3", + "Microsoft.Extensions.FileProviders.Physical": "9.0.3", + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "Tr74eP0oQ3AyC24ch17N8PuEkrPbD0JqIfENCYqmgKYNOmL8wQKzLJu3ObxTUDrjnn4rHoR1qKa37/eQyHmCDA==" + "resolved": "9.0.3", + "contentHash": "TfaHPSe39NyL2wxkisRxXK7xvHGZYBZ+dy3r+mqGvnxKgAPdHkMu3QMQZI4pquP6W5FIQBqs8FJpWV8ffCgDqQ==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "rz0xGGrxH7E+ANt3Bdj1ruPdCH/Afda+x4kHLXA3w2sAHctjWrNiY7Ms/oNN1jdWrSFm6JB+eQ0mqizvlXe5+A==", + "resolved": "9.3.0", + "contentHash": "wjMzOD1zDbem1ZAn7ysRv5dxDAV8FMbM7gQswZAOPnTmVyzhIVCtOAU2yxRNWeK6N6UeSSPOptAU+iG8dnvtRA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "9.0.1" + "Microsoft.Extensions.Hosting.Abstractions": "9.0.3" } }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "4ZmP6turxMFsNwK/MCko2fuIITaYYN/eXyyIRq1FjLDKnptdbn6xMb7u0zfSMzCGpzkx4RxH/g1jKN2IchG7uA==", + "resolved": "9.0.3", + "contentHash": "gqhbIq6adm0+/9IlDYmchekoxNkmUTm7rfTG3k4zzoQkjRuD8TQGwL1WnIcTDt4aQ+j+Vu0OQrjI8GlpJQQhIA==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.1", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.1", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1" + "Microsoft.Extensions.Configuration": "9.0.3", + "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.3", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.3" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "pfAPuVtHvG6dvZtAa0OQbXdDqq6epnr8z0/IIUjdmV0tMeI8Aj9KxDXvdDvqr+qNHTkmA7pZpChNxwNZt4GXVg==", + "resolved": "9.0.3", + "contentHash": "/fn0Xe8t+3YbMfwyTk4hFirWyAG1pBA5ogVYsrKAuuD2gbqOWhFuSA28auCmS3z8Y2eq3miDIKq4pFVRWA+J6g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "KE0CBEp+77XKlg94MGS4nN6dT5EVi25JMm+WCOycBKUzlxpsgHaanNuZ/Nv0VHpidV5LYWBWAeTcJD+auJ/3gA==", + "resolved": "9.3.0", + "contentHash": "rQkufpuGUHgPb7QWzjTj29eIjcMfUTDmBVMlybp4OWNtaDGWAkmvZuf1WRZfFKvPnPl1TAKqdYzOen45KR6gkw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "DguZYt1DWL05+8QKWL3b6bW7A2pC5kYFMY5iXM6W2M23jhvcNa8v6AU8PvVJBcysxHwr9/jax0agnwoBumsSwg==", + "resolved": "9.0.3", + "contentHash": "umczZ3+QPpzlrW/lkvy+IB0p52+qZ5w++aqx2lTCMOaPKzwcbVdrJgiQ3ajw5QWBp7gChLUiCYkSlWUpfjv24g==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.FileProviders.Physical": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "TKDMNRS66UTMEVT38/tU9hA63UTMvzI3DyNm5mx8+JCf3BaOtxgrvWLCI1y3J52PzT5yNl/T2KN5Z0KbApLZcg==", + "resolved": "9.0.3", + "contentHash": "th2+tQBV5oWjgKhip9GjiIv2AEK3QvfAO3tZcqV3F3dEt5D6Gb411RntCj1+8GS9HaRRSxjSGx/fCrMqIjkb1Q==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1", - "Microsoft.Extensions.FileSystemGlobbing": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.3", + "Microsoft.Extensions.FileSystemGlobbing": "9.0.3", + "Microsoft.Extensions.Primitives": "9.0.3" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "CwSMhLNe8HLkfbFzdz0CHWJhtWH3TtfZSicLBd/itFD+NqQtfGHmvqXHQbaFFl3mQB5PBb2gxwzWQyW2pIj7PA==", + "resolved": "9.0.3", + "contentHash": "rHabYVhQsGYNfgnfnYLqZRx/hLe85i6jW5rnDjA9pjt3x7yjPv8T/EXcgN5T9T38FAVwZRA+RMGUkEHbxvCOBQ==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.1", - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.3", + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "CI/O1q6gINJ7XNCqFFBLgfAY7HU1MUUKjyYqNTBz9Ib+bU87DhQbJRxJaGXRYxgqrNd9zyN/HcuoFbz8CMKnIw==", + "resolved": "9.3.0", + "contentHash": "m+ErpJkNeLqiBAi0FxpEuWgJxedO1NREvJssU/RFKf8lXah3PPnRaVoAezI0jJgkrGqZHHxqC6JBl1bKSVxr0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.1.0", - "Microsoft.Extensions.Http": "9.0.1", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1", - "Microsoft.Extensions.Telemetry": "9.1.0", - "System.IO.Pipelines": "9.0.1" + "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.3.0", + "Microsoft.Extensions.Http": "9.0.3", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.3", + "Microsoft.Extensions.Telemetry": "9.3.0", + "System.IO.Pipelines": "9.0.3" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "w2gUqXN/jNIuvqYwX3lbXagsizVNXYyt6LlF57+tMve4JYCEgCMMAjRce6uKcDASJgpMbErRT1PfHy2OhbkqEA==", + "resolved": "9.0.3", + "contentHash": "H/MBMLt9A/69Ux4OrV7oCKt3DcMT04o5SCqDolulzQA66TLFEpYYb4qedMs/uwrLtyHXGuDGWKZse/oa8W9AZw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "MeZePlyu3/74Wk4FHYSzXijADJUhWa7gxtaphLxhS8zEPWdJuBCrPo0sezdCSZaKCL+cZLSLobrb7xt2zHOxZQ==", + "resolved": "9.0.3", + "contentHash": "eVZsaKNyK0g0C1qp0mmn4Q2PiX+bXdkz8+zVkXyVMk8IvoWfmTjLjEq1MQlwt1A22lToANPiUrxPJ7Tt3V5puw==", "dependencies": { - "Microsoft.Extensions.Configuration": "9.0.1", - "Microsoft.Extensions.Configuration.Abstractions": "9.0.1", - "Microsoft.Extensions.Configuration.Binder": "9.0.1", - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Logging": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1" + "Microsoft.Extensions.Configuration": "9.0.3", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.3", + "Microsoft.Extensions.Configuration.Binder": "9.0.3", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.3", + "Microsoft.Extensions.Logging": "9.0.3", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.3" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "r64veU9uYILp6pYqfo3qzRab8zLMALvXZgT4VRY79tXMLu8X79uTlJ6nqPLtPIVhfCPXycRh8ILyFz/gGBDQdQ==" + "resolved": "9.0.3", + "contentHash": "4uPdnj9hLRrb3ZSeVEDtwIm9nNrrT9vAXYC9o1/yTW8lGOPwTyI2QlkcICwYEGM1LESGTFidcPMFACznUZKbIQ==" }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "bHtTesA4lrSGD1ZUaMIx6frU3wyy0vYtTa/hM6gGQu5QNrydObv8T5COiGUWsisflAfmsaFOe9Xvw5NSO99z0g==" + "resolved": "9.0.3", + "contentHash": "yCCJHvBcRyqapMSNzP+kTc57Eaavq2cr5Tmuil6/XVnipQf5xmskxakSQ1enU6S4+fNg3sJ27WcInV64q24JsA==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "Vynu6bf89KHy1dSzAuvXWnl59+UAESRMu6U2CTbk9WV62X/Q2kMugzqTxgqmX+c3WYvX78NEJIo8EonaNqcwrQ==", + "resolved": "9.3.0", + "contentHash": "+0QMdUtGIdh5fiz4ib+oBjSg+uyYgHbMZDaCT/Ko4bOtZocJWcWzT4ZDoHxtvcX9qfkoXebCk3N6NqMSLsFtzQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "9.0.1", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "9.1.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.1", - "Microsoft.Extensions.Telemetry.Abstractions": "9.1.0", + "Microsoft.Extensions.Diagnostics": "9.0.3", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "9.3.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.3", + "Microsoft.Extensions.Telemetry.Abstractions": "9.3.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "I7JgRqAMX3mzfolB+lcE0NNihyB33TOvjZsN6sIwW/KKSJWiM9cz6OXErudbDu42MNx7q2DR/7MZqpCxBXTJog==", + "resolved": "9.3.0", + "contentHash": "iqlvyUfxLHMp2H4E4fcKA/+kO7iHb2h48XzAcTWzqauXJca93F0xB+WBBXlf13aflcuQE0QBaZK9NDQFljRj4w==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "9.1.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.1.0", - "Microsoft.Extensions.Logging.Configuration": "9.0.1", - "Microsoft.Extensions.ObjectPool": "9.0.1", - "Microsoft.Extensions.Telemetry.Abstractions": "9.1.0" + "Microsoft.Extensions.AmbientMetadata.Application": "9.3.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "9.3.0", + "Microsoft.Extensions.Logging.Configuration": "9.0.3", + "Microsoft.Extensions.ObjectPool": "9.0.3", + "Microsoft.Extensions.Telemetry.Abstractions": "9.3.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "9.1.0", - "contentHash": "mM2cE/9Y1lwrnInQoa8NZvoBa+8EONXcYyIHylB3EkUTPPKBZAWafFF50GNZObtcLFtSlq4B5VtJ8c6gzbXSvw==", + "resolved": "9.3.0", + "contentHash": "J7GZHUScnkI368KntkMyD1jwufCYgPCNcfeJ3BhL7vIgMOkAYbjLzVkoWJEZZxFrbcUUzrKAKzUAXWULT5yKDw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "9.1.0", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.ObjectPool": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1" + "Microsoft.Extensions.Compliance.Abstractions": "9.3.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.3", + "Microsoft.Extensions.ObjectPool": "9.0.3", + "Microsoft.Extensions.Options": "9.0.3" } }, "OpenAI": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "zl72nyP4O94ZyEoCLoE8qoc5vp8kSJmRuqR+UdK+jNIjFJGWJYjsb4rAGpMWWRTbPYuk82E8myMJdVQurMLDnQ==", + "resolved": "2.2.0-beta.1", + "contentHash": "h0NKU7n5CppiyhZvcu6RtmrHUnN8IUpvbfCuEhFMPaeWKJIGEpRVP3PVywuJAqPugXp0zMFM3afFQFDQ8Sjiaw==", "dependencies": { "System.ClientModel": "1.2.1", "System.Diagnostics.DiagnosticSource": "6.0.1" @@ -510,8 +534,8 @@ }, "Sentry": { "type": "Transitive", - "resolved": "5.0.1", - "contentHash": "h1rKFYXx58dUtAcsWpTlJGHhG1bpy0JjGh8b2sRKw2wdk3NKCGd8KTLSWnzIqIjjZP2PNeUZFUyDeWVKs8Dk2A==" + "resolved": "5.5.0", + "contentHash": "6LHLNBTtAOiYpGRCk2Z9637HU1jg82XXmKSVomt62h6p29pf8vS57n1En4naYQmJqkjU9TRf/9xHlv+n5vOSmA==" }, "System.ClientModel": { "type": "Transitive", @@ -522,30 +546,35 @@ "System.Text.Json": "6.0.10" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "9.0.2", + "contentHash": "QKh9+kczG7TQbQZ6tF2S6bK9B8ewHXEkYmMP2iqefzwJEfEkiflheAX6VEaPLJ6Tq9RoKuQ5R3qPYla6wJ6Opg==" + }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "yOcDWx4P/s1I83+7gQlgQLmhny2eNcU0cfo1NBWi+en4EAI38Jau+/neT85gUW6w1s7+FUJc2qNOmmwGLIREqA==" + "resolved": "9.0.3", + "contentHash": "cBA+28xDW33tSiGht/H8xvr8lnaCrgJ7EdO348AfSGsX4PPJUOULKxny/cc9DVNGExaCrtqagsnm5M2mkWIZ+g==" }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "uXf5o8eV/gtzDQY4lGROLFMWQvcViKcF8o4Q6KpIOjloAQXrnscQSu6gTxYJMHuNJnh7szIF9AzkaEq+zDLoEg==" + "resolved": "9.0.3", + "contentHash": "aP1Qh9llcEmo0qN+VKvVDHFMe5Cqpfb1VjhBO7rjmxCXtLs3IfVSOiNqqLBZ/4Qbcr4J0SDdJq9S7EKAGpnwEA==" }, "System.Memory.Data": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "S5DSnXpiHQrhO2/hQgJzIA//ywVZ8AWkIZw7U7BCdTJifMZBO1tJM+dJwY0y2ztIVOGcbuGFn/vQ8GSTRg6LLg==" + "resolved": "9.0.3", + "contentHash": "QH23aqk1Cr1oSP9zEbjsJ60M7nbYOSEQLXszzxK12VXjEOXasnI8pnF7WeME66+z8OoecHfIL8iGxCRxjFQXFQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "eqWHDZqYPv1PvuvoIIx5pF74plL3iEOZOl/0kQP+Y0TEbtgNnM2W6k8h8EPYs+LTJZsXuWa92n5W5sHTWvE3VA==" + "resolved": "9.0.3", + "contentHash": "r2JRkLjsYrq5Dpo7+y3Wa73OfirZPdVhxiTJWwZ+oJM7FOAe0LkM3GlH+pgkNRdd1G1kwUbmRCdmh4uoaWwu1g==" }, "System.Threading.Channels": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "vpp0a6Prnrqza30863qzNXtb2TonmnJVdfGpIU99+wYyDyLJG3IyoxmjTxhInywqJ6G2HEV4yjZ6/Eo802qGpw==" + "resolved": "9.0.3", + "contentHash": "Ao0iegVONKYVw0eWxJv0ArtMVfkFjgyyYKtUXru6xX5H95flSZWW3QCavD4PAgwpc0ETP38kGHaYbPzSE7sw2w==" }, "System.Threading.RateLimiting": { "type": "Transitive",