From f498c6201841ba505e056aa458fdba538c2c7407 Mon Sep 17 00:00:00 2001 From: Visagan Guruparan <103048@smsassist.com> Date: Mon, 13 Apr 2026 09:28:22 -0500 Subject: [PATCH 1/5] Add optional agentId to ruleTrigger for easy filtering on UI --- .../BotSharp.Abstraction/Rules/IRuleTrigger.cs | 6 ++++++ .../Controllers/Agent/AgentController.Rule.cs | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs index c7ad59d9a..8afcaa7b1 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs @@ -21,4 +21,10 @@ public interface IRuleTrigger /// Explain the purpose of rule trigger (display purpose) /// string Statement => string.Empty; + + /// + /// Optional list of agent IDs this trigger is associated with. + /// Used for display/filtering in UI only (not used in execution logic). + /// + string[] AgentIds => []; } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs index 43cf228c4..724693c05 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs @@ -5,6 +5,20 @@ namespace BotSharp.OpenAPI.Controllers; public partial class AgentController { + [HttpGet("/rule/triggers/{agentId}")] + public IEnumerable GetRuleTriggers(string agentId) + { + var triggers = _services.GetServices(); + triggers = triggers.Where(x => x.AgentIds?.Count() == 0 || x.AgentIds.Contains(agentId)); + return triggers.Select(x => new AgentRuleViewModel + { + TriggerName = x.Name, + Channel = x.Channel, + Statement = x.Statement, + OutputArgs = x.OutputArgs + }).OrderBy(x => x.TriggerName); + } + [HttpGet("/rule/triggers")] public IEnumerable GetRuleTriggers() { From d1a08704db58c0296d90e84b310f2f793933e24b Mon Sep 17 00:00:00 2001 From: Visagan Guruparan <103048@smsassist.com> Date: Mon, 13 Apr 2026 09:37:28 -0500 Subject: [PATCH 2/5] Update code based on code review feedback --- .../BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs index 724693c05..90f2f8cee 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs @@ -9,7 +9,7 @@ public partial class AgentController public IEnumerable GetRuleTriggers(string agentId) { var triggers = _services.GetServices(); - triggers = triggers.Where(x => x.AgentIds?.Count() == 0 || x.AgentIds.Contains(agentId)); + triggers = triggers.Where(x => x.AgentIds == null || !x.AgentIds.Any() || x.AgentIds.Contains(agentId)); return triggers.Select(x => new AgentRuleViewModel { TriggerName = x.Name, From e1c140c0fd6c8b8355ec1ad65ad3595f9aadcc55 Mon Sep 17 00:00:00 2001 From: Visagan Guruparan <103048@smsassist.com> Date: Mon, 13 Apr 2026 10:13:10 -0500 Subject: [PATCH 3/5] Update code --- src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs index 8afcaa7b1..bc762bb92 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Rules/IRuleTrigger.cs @@ -26,5 +26,5 @@ public interface IRuleTrigger /// Optional list of agent IDs this trigger is associated with. /// Used for display/filtering in UI only (not used in execution logic). /// - string[] AgentIds => []; + string[]? AgentIds => null; } From f996c02ea05eefa764f0568743ef5c8f0e06c71d Mon Sep 17 00:00:00 2001 From: Visagan Guruparan <103048@smsassist.com> Date: Mon, 4 May 2026 13:15:09 -0500 Subject: [PATCH 4/5] Clean code and refactor --- .../Controllers/Agent/AgentController.Rule.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs index 90f2f8cee..cd1e7c18e 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs @@ -9,7 +9,10 @@ public partial class AgentController public IEnumerable GetRuleTriggers(string agentId) { var triggers = _services.GetServices(); - triggers = triggers.Where(x => x.AgentIds == null || !x.AgentIds.Any() || x.AgentIds.Contains(agentId)); + if (!string.IsNullOrWhiteSpace(agentId)) + { + triggers = triggers.Where(x => x.AgentIds == null || x.AgentIds.Contains(agentId, StringComparer.OrdinalIgnoreCase)); + } return triggers.Select(x => new AgentRuleViewModel { TriggerName = x.Name, From 49a252a90a9dadcd17fe2deaab992cff18a88020 Mon Sep 17 00:00:00 2001 From: Visagan Guruparan <103048@smsassist.com> Date: Mon, 4 May 2026 14:24:30 -0500 Subject: [PATCH 5/5] Update code based on Qodo code review --- .../Controllers/Agent/AgentController.Rule.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs index cd1e7c18e..529ae883f 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/Agent/AgentController.Rule.cs @@ -6,20 +6,26 @@ namespace BotSharp.OpenAPI.Controllers; public partial class AgentController { [HttpGet("/rule/triggers/{agentId}")] - public IEnumerable GetRuleTriggers(string agentId) + public ActionResult> GetRuleTriggers(string agentId) { - var triggers = _services.GetServices(); - if (!string.IsNullOrWhiteSpace(agentId)) + if (string.IsNullOrWhiteSpace(agentId)) { - triggers = triggers.Where(x => x.AgentIds == null || x.AgentIds.Contains(agentId, StringComparer.OrdinalIgnoreCase)); + return BadRequest("agentId is required"); } - return triggers.Select(x => new AgentRuleViewModel + + var triggers = _services.GetServices() + .Where(x => + { + var agentIds = x.AgentIds; + return agentIds == null || agentIds.Contains(agentId, StringComparer.OrdinalIgnoreCase); + }); + return Ok(triggers.Select(x => new AgentRuleViewModel { TriggerName = x.Name, Channel = x.Channel, Statement = x.Statement, OutputArgs = x.OutputArgs - }).OrderBy(x => x.TriggerName); + }).OrderBy(x => x.TriggerName)); } [HttpGet("/rule/triggers")]