diff --git a/Directory.Build.props b/Directory.Build.props index d93cb20fb..03aa93368 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - net8.0 + net10.0 12.0 5.2.0 true diff --git a/src/Infrastructure/BotSharp.Abstraction/MultiTenancy/Options/TenantConfiguration.cs b/src/Infrastructure/BotSharp.Abstraction/MultiTenancy/Options/TenantConfiguration.cs index 59cf4b14e..1ea178602 100644 --- a/src/Infrastructure/BotSharp.Abstraction/MultiTenancy/Options/TenantConfiguration.cs +++ b/src/Infrastructure/BotSharp.Abstraction/MultiTenancy/Options/TenantConfiguration.cs @@ -22,17 +22,24 @@ public TenantConfiguration() public TenantConfiguration(Guid id, [NotNull] string name) : this() { - if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException("Name cannot be null or whitespace."); + if (string.IsNullOrWhiteSpace(name)) + { + throw new ArgumentException("Name cannot be null or whitespace."); + } + Id = id; Name = name; - ConnectionStrings = new ConnectionStrings(); } public TenantConfiguration(Guid id, [NotNull] string name, [NotNull] string normalizedName) : this(id, name) { - if (string.IsNullOrWhiteSpace(normalizedName)) throw new ArgumentException("NormalizedName cannot be null or whitespace."); + if (string.IsNullOrWhiteSpace(normalizedName)) + { + throw new ArgumentException("NormalizedName cannot be null or whitespace."); + } + NormalizedName = normalizedName; } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Core.A2A/Hooks/A2AAgentHook.cs b/src/Infrastructure/BotSharp.Core.A2A/Hooks/A2AAgentHook.cs index 48aae9727..132453d84 100644 --- a/src/Infrastructure/BotSharp.Core.A2A/Hooks/A2AAgentHook.cs +++ b/src/Infrastructure/BotSharp.Core.A2A/Hooks/A2AAgentHook.cs @@ -13,20 +13,20 @@ public class A2AAgentHook : AgentHookBase { public override string SelfId => string.Empty; - private readonly A2ASettings _settings; - private readonly IA2AService _iA2AService; + private readonly A2ASettings _a2aSettings; + private readonly IA2AService _a2aService; - public A2AAgentHook(IServiceProvider services, IA2AService a2AService, A2ASettings settings) - : base(services, new AgentSettings()) + public A2AAgentHook(IServiceProvider services, IA2AService a2aService, A2ASettings a2aSettings, AgentSettings agentSettings) + : base(services, agentSettings) { - _iA2AService = a2AService; - _settings = settings; + _a2aService = a2aService; + _a2aSettings = a2aSettings; } public override bool OnAgentLoading(ref string id) { var agentId = id; - var remoteConfig = _settings.Agents.FirstOrDefault(x => x.Id == agentId); + var remoteConfig = _a2aSettings.Agents?.FirstOrDefault(x => x.Id == agentId); if (remoteConfig != null) { return true; @@ -42,43 +42,46 @@ public override void OnAgentLoaded(Agent agent) return; } - var remoteConfig = _settings.Agents.FirstOrDefault(x => x.Id == agent.Id); + var remoteConfig = _a2aSettings.Agents?.FirstOrDefault(x => x.Id == agent.Id); if (remoteConfig != null) { - var agentCard = _iA2AService.GetCapabilitiesAsync(remoteConfig.Endpoint).GetAwaiter().GetResult(); - agent.Name = agentCard.Name; - agent.Description = agentCard.Description; - agent.Instruction = $"You are a proxy interface for an external intelligent service named '{agentCard.Name}'. " + - $"Your ONLY goal is to forward the user's request verbatim to the external service. " + - $"You must use the function 'delegate_to_a2a' to communicate with it. " + - $"Do not attempt to answer the question yourself."; - - var properties = new Dictionary + var agentCard = _a2aService.GetCapabilitiesAsync(remoteConfig.Endpoint).GetAwaiter().GetResult(); + if (agentCard != null) { + agent.Name = agentCard.Name; + agent.Description = agentCard.Description; + agent.Instruction = $"You are a proxy interface for an external intelligent service named '{agentCard.Name}'. " + + $"Your ONLY goal is to forward the user's request verbatim to the external service. " + + $"You must use the function 'delegate_to_a2a' to communicate with it. " + + $"Do not attempt to answer the question yourself."; + + var properties = new Dictionary { - "user_query", - new { - type = "string", - description = "The exact user request or task description to be forwarded." + "user_query", + new + { + type = "string", + description = "The exact user request or task description to be forwarded." + } } - } - }; + }; - var propertiesJson = JsonSerializer.Serialize(properties); - var propertiesDocument = JsonDocument.Parse(propertiesJson); + var propertiesJson = JsonSerializer.Serialize(properties); + var propertiesDocument = JsonDocument.Parse(propertiesJson); - agent.Functions.Add(new FunctionDef - { - Name = "delegate_to_a2a", - Description = $"Delegates the task to the external {remoteConfig.Name} via A2A protocol.", - Parameters = new FunctionParametersDef() + agent.Functions.Add(new FunctionDef { - Type = "object", - Properties = propertiesDocument, - Required = new List { "user_query" } - } - }); + Name = "delegate_to_a2a", + Description = $"Delegates the task to the external {remoteConfig.Name} via A2A protocol.", + Parameters = new FunctionParametersDef() + { + Type = "object", + Properties = propertiesDocument, + Required = new List { "user_query" } + } + }); + } } base.OnAgentLoaded(agent); } diff --git a/src/Infrastructure/BotSharp.Core.A2A/Services/A2AService.cs b/src/Infrastructure/BotSharp.Core.A2A/Services/A2AService.cs index 7b654eba9..0dbe88b9e 100644 --- a/src/Infrastructure/BotSharp.Core.A2A/Services/A2AService.cs +++ b/src/Infrastructure/BotSharp.Core.A2A/Services/A2AService.cs @@ -13,10 +13,10 @@ public class A2AService : IA2AService private readonly Dictionary _clientCache = new Dictionary(); - public A2AService(IHttpClientFactory httpClientFactory, IServiceProvider serviceProvider, ILogger logger) + public A2AService(IHttpClientFactory httpClientFactory, IServiceProvider services, ILogger logger) { _httpClientFactory = httpClientFactory; - _services = serviceProvider; + _services = services; _logger = logger; } diff --git a/src/Infrastructure/BotSharp.Core.A2A/Settings/A2ASettings.cs b/src/Infrastructure/BotSharp.Core.A2A/Settings/A2ASettings.cs index 3aa9ec7a8..f59d3cf35 100644 --- a/src/Infrastructure/BotSharp.Core.A2A/Settings/A2ASettings.cs +++ b/src/Infrastructure/BotSharp.Core.A2A/Settings/A2ASettings.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace BotSharp.Core.A2A.Settings; public class A2ASettings diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs index a260af7b4..29867a6ff 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoStoragePlugin.cs @@ -38,7 +38,10 @@ public void RegisterDI(IServiceCollection services, IConfiguration config) if (provider != null) { var cs = provider.GetConnectionString("BotSharpMongoDb"); - if (!string.IsNullOrWhiteSpace(cs)) dbSettings.BotSharpMongoDb = cs; + if (!string.IsNullOrWhiteSpace(cs)) + { + dbSettings.BotSharpMongoDb = cs; + } } } diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/Extensions/MultiTenancyServiceCollectionExtensions.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/Extensions/MultiTenancyServiceCollectionExtensions.cs index a9e7766df..bcb404170 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/Extensions/MultiTenancyServiceCollectionExtensions.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/Extensions/MultiTenancyServiceCollectionExtensions.cs @@ -1,8 +1,11 @@ using BotSharp.Abstraction.MultiTenancy; using BotSharp.Abstraction.MultiTenancy.Options; +using BotSharp.Plugin.MultiTenancy.Interfaces; using BotSharp.Plugin.MultiTenancy.Models; using BotSharp.Plugin.MultiTenancy.MultiTenancy; +using BotSharp.Plugin.MultiTenancy.MultiTenancy.Providers; using BotSharp.Plugin.MultiTenancy.MultiTenancy.Resolvers; +using BotSharp.Plugin.MultiTenancy.MultiTenancy.Tenant; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/ICurrentTenantAccessor.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/Interfaces/ICurrentTenantAccessor.cs similarity index 71% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/ICurrentTenantAccessor.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/Interfaces/ICurrentTenantAccessor.cs index 50245b5b7..c45dfbf06 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/ICurrentTenantAccessor.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/Interfaces/ICurrentTenantAccessor.cs @@ -1,6 +1,6 @@ using BotSharp.Plugin.MultiTenancy.Models; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy; +namespace BotSharp.Plugin.MultiTenancy.Interfaces; public interface ICurrentTenantAccessor { diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/ConfigTenantOptionProvider.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/ConfigTenantOptionProvider.cs similarity index 94% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/ConfigTenantOptionProvider.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/ConfigTenantOptionProvider.cs index 8449e8cf2..9863f04fb 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/ConfigTenantOptionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/ConfigTenantOptionProvider.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Threading.Tasks; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy; +namespace BotSharp.Plugin.MultiTenancy.MultiTenancy.Providers; public class ConfigTenantOptionProvider : ITenantOptionProvider { diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/DefaultConnectionStringResolver.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/DefaultConnectionStringResolver.cs similarity index 90% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/DefaultConnectionStringResolver.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/DefaultConnectionStringResolver.cs index deb47317c..794e33aab 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/DefaultConnectionStringResolver.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/DefaultConnectionStringResolver.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy +namespace BotSharp.Plugin.MultiTenancy.MultiTenancy.Providers { public class DefaultConnectionStringResolver : IConnectionStringResolver { @@ -19,7 +19,11 @@ public DefaultConnectionStringResolver(IOptionsMonitor tenan public string? GetConnectionString(string connectionStringName) { - if (!_tenantStoreOptions.Enabled || !_tenantStoreOptions.Tenants.Any()) return null; + if (!_tenantStoreOptions.Enabled || !_tenantStoreOptions.Tenants.Any()) + { + return null; + } + if (_currentTenant.Id.HasValue) { var tenant = _tenantStoreOptions.Tenants.FirstOrDefault(t => t.Id == _currentTenant.Id.Value); diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantConnectionProvider.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/TenantConnectionProvider.cs similarity index 83% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantConnectionProvider.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/TenantConnectionProvider.cs index 9dc89a21a..50a196997 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantConnectionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Providers/TenantConnectionProvider.cs @@ -1,7 +1,7 @@ using BotSharp.Abstraction.MultiTenancy; using Microsoft.Extensions.Configuration; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy; +namespace BotSharp.Plugin.MultiTenancy.MultiTenancy.Providers; public class TenantConnectionProvider : ITenantConnectionProvider { @@ -17,7 +17,10 @@ public TenantConnectionProvider(IConnectionStringResolver resolver, IConfigurati public string GetConnectionString(string name) { var cs = _resolver.GetConnectionString(name); - if (!string.IsNullOrWhiteSpace(cs)) return cs; + if (!string.IsNullOrWhiteSpace(cs)) + { + return cs; + } return _configuration.GetConnectionString(name) ?? string.Empty; } diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/AsyncLocalCurrentTenantAccessor.cs similarity index 83% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/AsyncLocalCurrentTenantAccessor.cs index be8fcc7e5..bbdc63fc2 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/AsyncLocalCurrentTenantAccessor.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/AsyncLocalCurrentTenantAccessor.cs @@ -1,7 +1,8 @@ +using BotSharp.Plugin.MultiTenancy.Interfaces; using BotSharp.Plugin.MultiTenancy.Models; using System.Threading; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy; +namespace BotSharp.Plugin.MultiTenancy.MultiTenancy.Tenant; public class AsyncLocalCurrentTenantAccessor : ICurrentTenantAccessor { diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/CurrentTenant.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/CurrentTenant.cs similarity index 91% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/CurrentTenant.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/CurrentTenant.cs index 4c97cb23d..88c4dc65a 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/CurrentTenant.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/CurrentTenant.cs @@ -1,8 +1,9 @@ using BotSharp.Abstraction.MultiTenancy; +using BotSharp.Plugin.MultiTenancy.Interfaces; using BotSharp.Plugin.MultiTenancy.Models; using System; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy; +namespace BotSharp.Plugin.MultiTenancy.MultiTenancy.Tenant; public class CurrentTenant : ICurrentTenant { diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantFeature.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/TenantFeature.cs similarity index 87% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantFeature.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/TenantFeature.cs index 714c34b04..9b91631d6 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantFeature.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/TenantFeature.cs @@ -2,7 +2,7 @@ using BotSharp.Abstraction.MultiTenancy.Options; using Microsoft.Extensions.Options; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy; +namespace BotSharp.Plugin.MultiTenancy.MultiTenancy.Tenant; public class TenantFeature : ITenantFeature { diff --git a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantResolver.cs b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/TenantResolver.cs similarity index 81% rename from src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantResolver.cs rename to src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/TenantResolver.cs index b754ea2e6..d0a9bca0c 100644 --- a/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/TenantResolver.cs +++ b/src/Plugins/BotSharp.Plugin.MultiTenancy/MultiTenancy/Tenant/TenantResolver.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace BotSharp.Plugin.MultiTenancy.MultiTenancy; +namespace BotSharp.Plugin.MultiTenancy.MultiTenancy.Tenant; public class TenantResolver : ITenantResolver { @@ -19,7 +19,10 @@ public async Task ResolveAsync(TenantResolveContext context foreach (var c in _contributors) { var result = await c.ResolveAsync(context); - if (result.Succeeded) return result; + if (result.Succeeded) + { + return result; + } } return new TenantResolveResult();