diff --git a/src/Basic/Senparc.Ncf.XncfBase/Functions/FunctionHelper.cs b/src/Basic/Senparc.Ncf.XncfBase/Functions/FunctionHelper.cs index d6f8ae4ea..36aea2118 100644 --- a/src/Basic/Senparc.Ncf.XncfBase/Functions/FunctionHelper.cs +++ b/src/Basic/Senparc.Ncf.XncfBase/Functions/FunctionHelper.cs @@ -163,15 +163,20 @@ public static List LoadXncfProjects(bool mustHaveXncfModule = fal { //找到了 SLN 文件,开始展开地毯式搜索 - //第一步:查找 XNCF - - var projectFolders = Directory.GetDirectories(currentDir, "*.XNCF.*", SearchOption.AllDirectories).ToList(); + //第一步:查找 XNCF(使用不区分大小写匹配,兼容 Linux 文件系统) + var enumerationOptions = new EnumerationOptions + { + MatchCasing = MatchCasing.CaseInsensitive, + RecurseSubdirectories = true, + IgnoreInaccessible = true + }; + var projectFolders = Directory.GetDirectories(currentDir, "*.XNCF.*", enumerationOptions).ToList(); if (additionalProjects != null && additionalProjects.Length > 0) { foreach (var proj in additionalProjects) { - var addProjectFolders = Directory.GetDirectories(currentDir, proj, SearchOption.AllDirectories); + var addProjectFolders = Directory.GetDirectories(currentDir, proj, enumerationOptions); if (addProjectFolders.Count() > 0) { projectFolders.AddRange(addProjectFolders); diff --git a/src/Basic/Senparc.Ncf.XncfBase/Senparc.Ncf.XncfBase.csproj b/src/Basic/Senparc.Ncf.XncfBase/Senparc.Ncf.XncfBase.csproj index ab484f0d9..271fa5a69 100644 --- a/src/Basic/Senparc.Ncf.XncfBase/Senparc.Ncf.XncfBase.csproj +++ b/src/Basic/Senparc.Ncf.XncfBase/Senparc.Ncf.XncfBase.csproj @@ -2,7 +2,7 @@ net8.0 - 0.22.17-preview.1 + 0.22.18-preview.1 10.0 Senparc.Ncf.XncfBase Senparc.Ncf.XncfBase @@ -55,6 +55,7 @@ [2025-06-27] v0.22.13-preview.1 Add dynamic XNCF Template dynamic generator [2025-11-01] update basic libraries, including Senparc.AI [2026-01-07] v0.22.16-preview.1 Add rootDir parameter to FunctionHelper.LoadXncfProjects() method + [2026-04-05] v0.22.18-preview.1 Fix LoadXncfProjects case-insensitive directory search for Linux filesystem compatibility https://github.com/NeuCharFramework/NcfPackageSources Debug;Release;Test;TemplateRelease diff --git a/src/Extensions/Senparc.Xncf.AgentsManager/Application/AppService/ChatTaskAppService.cs b/src/Extensions/Senparc.Xncf.AgentsManager/Application/AppService/ChatTaskAppService.cs index a8bf1ef31..cd3c72ace 100644 --- a/src/Extensions/Senparc.Xncf.AgentsManager/Application/AppService/ChatTaskAppService.cs +++ b/src/Extensions/Senparc.Xncf.AgentsManager/Application/AppService/ChatTaskAppService.cs @@ -26,7 +26,7 @@ public ChatTaskAppService(IServiceProvider serviceProvider, ChatTaskService chat } [ApiBind(ApiRequestMethod = ApiRequestMethod.Get)] - public async Task> GetList(int chatGroupId, int agentTemplateId, int pageIndex, int pageSize, string filter = "") + public async Task> GetList(int chatGroupId, int agentTemplateId, int pageIndex, int pageSize, string filter = "", int statusFilter = -1, bool? isScheduled = null) { return await this.GetResponseAsync(async (response, logger) => { @@ -45,8 +45,12 @@ public async Task> GetList(int chatGro seh.ValueCompare .AndAlso(chatGroupId > 0, z => z.ChatGroupId == chatGroupId) .AndAlso(agentTemplateId > 0, z => chatGroupIdList.Contains(z.ChatGroupId)); - //增加模糊搜索任务 + // Text search filter seh.ValueCompare.AndAlso(!string.IsNullOrEmpty(filter), _ => _.Name.Contains(filter)); + // Status filter (-1 means all) + seh.ValueCompare.AndAlso(statusFilter >= 0, _ => (int)_.Status == statusFilter); + // Scheduled task filter + seh.ValueCompare.AndAlso(isScheduled.HasValue, _ => _.IsScheduled == isScheduled!.Value); var where = seh.BuildWhereExpression(); var list = await this._chatTaskService.GetObjectListAsync(pageIndex, pageSize, where, z => z.Id, Ncf.Core.Enums.OrderingType.Descending); diff --git a/src/Extensions/Senparc.Xncf.AgentsManager/Application/DTOs/ChatGroupRequest.cs b/src/Extensions/Senparc.Xncf.AgentsManager/Application/DTOs/ChatGroupRequest.cs index 77a6e57fc..3cb94f1e6 100644 --- a/src/Extensions/Senparc.Xncf.AgentsManager/Application/DTOs/ChatGroupRequest.cs +++ b/src/Extensions/Senparc.Xncf.AgentsManager/Application/DTOs/ChatGroupRequest.cs @@ -160,6 +160,21 @@ public class ChatGroup_RunGroupRequest /// 可选:业务关联 ID(例如 Prompt 优化的 RequestId),用于在执行上下文中关联工具调用 /// public string CorrelationId { get; set; } + + /// + /// 是否为定时(循环)任务 + /// + public bool IsScheduled { get; set; } = false; + + /// + /// 定时类型(仅当 IsScheduled=true 时有效) + /// + public ScheduleType ScheduleType { get; set; } = ScheduleType.Interval; + + /// + /// 定时间隔值(含义随 ScheduleType 变化;仅当 IsScheduled=true 时有效) + /// + public int? ScheduleIntervalMinutes { get; set; } } /// diff --git a/src/Extensions/Senparc.Xncf.AgentsManager/Areas/Admin/Pages/AgentsManager/Index.cshtml b/src/Extensions/Senparc.Xncf.AgentsManager/Areas/Admin/Pages/AgentsManager/Index.cshtml index 4abec97c9..bcec79b58 100644 --- a/src/Extensions/Senparc.Xncf.AgentsManager/Areas/Admin/Pages/AgentsManager/Index.cshtml +++ b/src/Extensions/Senparc.Xncf.AgentsManager/Areas/Admin/Pages/AgentsManager/Index.cshtml @@ -943,15 +943,15 @@ @* 主体内容 *@ @@ -994,7 +1025,7 @@