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")]