diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs index 698939e5..16232e6b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs @@ -30,6 +30,8 @@ public class PageActionArgs /// public string[]? IncludeResponseUrls { get; set; } + public List? Selectors { get; set; } + /// /// If set to true, the response will be stored in memory /// diff --git a/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginFilter.cs index bc5c4bf2..e7798d6c 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginFilter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Plugins/Models/PluginFilter.cs @@ -3,5 +3,6 @@ namespace BotSharp.Abstraction.Plugins.Models public class PluginFilter { public Pagination Pager { get; set; } = new Pagination(); + public IEnumerable? Names { get; set; } } } diff --git a/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs b/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs index 6580c56c..83bc4e78 100644 --- a/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs +++ b/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs @@ -40,12 +40,25 @@ public class SideCarAspect return typeof(SideCarAspect).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static); } - private object CallAsyncMethod(IServiceProvider serviceProvider, Type retType, string methodName, Func target, object[] args) + + private (IConversationSideCar?, MethodInfo?) GetSideCarMethod(IServiceProvider serviceProvider, string methodName, object[] args) { var sidecar = serviceProvider.GetService(); - var sidecarMethod = sidecar?.GetType()?.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance); + var argTypes = args.Select(x => x.GetType()).ToArray(); + var sidecarMethod = sidecar?.GetType()?.GetMethods(BindingFlags.Public | BindingFlags.Instance) + .FirstOrDefault(x => x.Name == methodName + && x.GetParameters().Length == argTypes.Length + && x.GetParameters().Select(p => p.ParameterType) + .Zip(argTypes, (paramType, argType) => paramType.IsAssignableFrom(argType)).All(y => y)); + return (sidecar, sidecarMethod); + } + + private object CallAsyncMethod(IServiceProvider serviceProvider, Type retType, string methodName, Func target, object[] args) + { object value; + + var (sidecar, sidecarMethod) = GetSideCarMethod(serviceProvider, methodName, args); var enabled = sidecar != null && sidecar.IsEnabled() && sidecarMethod != null; if (retType == typeof(void)) @@ -77,11 +90,10 @@ public class SideCarAspect private object CallSyncMethod(IServiceProvider serviceProvider, Type retType, string methodName, Func target, object[] args) { - var sidecar = serviceProvider.GetService(); - var sidecarMethod = sidecar?.GetType()?.GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance); - object value; - var enabled = sidecar != null && sidecarMethod != null && sidecar.IsEnabled(); + + var (sidecar, sidecarMethod) = GetSideCarMethod(serviceProvider, methodName, args); + var enabled = sidecar != null && sidecar.IsEnabled() && sidecarMethod != null; if (retType == typeof(void)) { diff --git a/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs b/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs index f9b2efba..05efe39d 100644 --- a/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs +++ b/src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs @@ -126,6 +126,12 @@ public class PluginLoader var plugins = GetPlugins(services); var pager = filter?.Pager ?? new Pagination(); + // Apply filter + if (!filter.Names.IsNullOrEmpty()) + { + plugins = plugins.Where(x => filter.Names.Any(n => x.Name.IsEqualTo(n))).ToList(); + } + return new PagedItems { Items = plugins.Skip(pager.Offset).Take(pager.Size), diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs index 4620e16c..f72492e3 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Functions/HandleExcelRequestFn.cs @@ -64,18 +64,13 @@ public class HandleExcelRequestFn : IFunctionCallback message.Content = "No excel files found in the conversation"; return true; } - if (!DeleteTable()) - { - message.Content = "Failed to clear existing tables. Please manually delete all existing tables"; - } - else - { - var resultList = GetResponeFromDialogs(dialogs); - var states = _serviceProvider.GetRequiredService(); - message.Content = GenerateSqlExecutionSummary(resultList); - states.SetState("excel_import_result",message.Content); - } + var resultList = GetResponeFromDialogs(dialogs); + var states = _serviceProvider.GetRequiredService(); + + message.Content = GenerateSqlExecutionSummary(resultList); + states.SetState("excel_import_result",message.Content); + return true; } @@ -122,28 +117,12 @@ public class HandleExcelRequestFn : IFunctionCallback var bytes = _fileStorage.GetFileBytes(file.FileStorageUrl); var workbook = ConvertToWorkBook(bytes); - - //var dbService = CreateDbService(DbServiceType.MySql); var currentCommandList = _mySqlService.WriteExcelDataToDB(workbook); sqlCommandList.AddRange(currentCommandList); } return sqlCommandList; } - private bool DeleteTable() - { - try - { - //_mySqlService.DeleteTableSqlQuery(); - return true; - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to delete table"); - return false; - } - } - private string GenerateSqlExecutionSummary(List messageList) { var stringBuilder = new StringBuilder(); diff --git a/src/Plugins/BotSharp.Plugin.ExcelHandler/Services/MySqlService.cs b/src/Plugins/BotSharp.Plugin.ExcelHandler/Services/MySqlService.cs index af08194c..34c37719 100644 --- a/src/Plugins/BotSharp.Plugin.ExcelHandler/Services/MySqlService.cs +++ b/src/Plugins/BotSharp.Plugin.ExcelHandler/Services/MySqlService.cs @@ -31,13 +31,6 @@ namespace BotSharp.Plugin.ExcelHandler.Services { try { - /*using var mySqlDbConnection = _mySqlDbHelpers.GetDbConnection(); - var tableNames = GetAllTableSchema(mySqlDbConnection); - if (tableNames.IsNullOrEmpty()) - { - return true; - }*/ - return true; } catch (Exception ex) @@ -232,7 +225,7 @@ namespace BotSharp.Plugin.ExcelHandler.Services _columnTypes?.Insert(0, "INT UNSIGNED AUTO_INCREMENT"); }*/ - var createTableSql = $"CREATE TABLE if not exists {tableName} ( \n"; + var createTableSql = $"DROP TABLE IF EXISTS {tableName}; CREATE TABLE if not exists {tableName} ( \n"; createTableSql += string.Join(", \n", headerColumns.Select((x, i) => $"`{x}` {_columnTypes[i]}")); var indexSql = string.Join(", \n", headerColumns.Select(x => $"KEY `idx_{tableName}_{x}` (`{x}`)")); createTableSql += $", \n{indexSql}\n);"; diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs index 35434e99..ebb5aa63 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs @@ -1,5 +1,6 @@ using BotSharp.Abstraction.Plugins.Models; using BotSharp.Abstraction.Settings; +using BotSharp.Abstraction.Users.Enums; using BotSharp.Plugin.KnowledgeBase.Converters; using BotSharp.Plugin.KnowledgeBase.Hooks; using BotSharp.Plugin.KnowledgeBase.Services; @@ -25,7 +26,6 @@ public class KnowledgeBasePlugin : IBotSharpPlugin services.AddSingleton(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); } @@ -34,6 +34,7 @@ public class KnowledgeBasePlugin : IBotSharpPlugin var section = menu.First(x => x.Label == "Apps"); menu.Add(new PluginMenuDef("Knowledge Base", icon: "bx bx-book-open", weight: section.Weight + 1) { + Roles = new List { UserRole.Root, UserRole.Admin }, SubMenu = new List { new PluginMenuDef("Q & A", link: "page/knowledge-base/question-answer"), diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/VerifyDictionaryTerm.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/VerifyDictionaryTerm.cs index 134ef8e4..ac2889bd 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/VerifyDictionaryTerm.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/VerifyDictionaryTerm.cs @@ -78,7 +78,7 @@ public class VerifyDictionaryTerm : IFunctionCallback var render = _services.GetRequiredService(); var knowledgeHooks = _services.GetServices(); - var agent = await agentService.GetAgent(BuiltInAgentId.Planner); + var agent = await agentService.GetAgent(BuiltInAgentId.SqlDriver); var template = agent.Templates.FirstOrDefault(x => x.Name == "database.dictionary.sql")?.Content ?? string.Empty; var responseFormat = JsonSerializer.Serialize(new LookupDictionary{ }); diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs index 27af8e64..534b0bf7 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs @@ -7,7 +7,7 @@ namespace BotSharp.Plugin.SqlDriver.Hooks; public class SqlDictionaryLookupHook : AgentHookBase, IAgentHook { - private const string SQL_EXECUTOR_TEMPLATE = "sql_dictionary_lookup.fn"; + private const string SQL_EXECUTOR_TEMPLATE = "verify_dictionary_term.fn"; private IEnumerable _targetSqlExecutorFunctions = new List { "verify_dictionary_term", diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs index 108ff433..9b00b010 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs @@ -1,3 +1,5 @@ +using Microsoft.Playwright; + namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver; public partial class PlaywrightWebDriver @@ -47,15 +49,37 @@ public partial class PlaywrightWebDriver var response = await page.GotoAsync(args.Url, new PageGotoOptions { - Timeout = args.Timeout + Timeout = args.Timeout > 0 ? args.Timeout : 30000 }); + if (args.Selectors != null) + { + // 使用传入的选择器列表进行并行等待 + var tasks =args.Selectors.Select(selector => + page.WaitForSelectorAsync(selector, new PageWaitForSelectorOptions + { + Timeout = args.Timeout > 0 ? args.Timeout : 30000 + }) + ).ToArray(); + + await Task.WhenAll(tasks); + + // 在此处提取所有选择器的 HTML 内容 + var contentTasks = args.Selectors.Select(selector => page.InnerHTMLAsync(selector)).ToArray(); + var contents = await Task.WhenAll(contentTasks); + + result.IsSuccess = true; + result.Body = string.Join(", ", contents.Select((content, index) => $"{args.Selectors[index]}: {content}")); + + return result; + } + await page.WaitForLoadStateAsync(LoadState.DOMContentLoaded); if (args.WaitForNetworkIdle) { await page.WaitForLoadStateAsync(LoadState.NetworkIdle, new PageWaitForLoadStateOptions { - Timeout = args.Timeout + Timeout = args.Timeout > 0 ? args.Timeout : 30000 }); }