From 15aaff649c6d76176628237cb5f30075166e4efc Mon Sep 17 00:00:00 2001 From: jizh4635 Date: Sun, 3 Nov 2024 10:41:01 -0600 Subject: [PATCH 1/8] Selector multiple --- .../Browsing/Models/PageActionArgs.cs | 2 ++ .../PlaywrightWebDriver.GoToPage.cs | 28 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) 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/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 }); } From f032dfc102c6f9c76f2eb36428955cc59629f37c Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 5 Nov 2024 11:31:39 -0600 Subject: [PATCH 2/8] add knowledge menu roles --- .../BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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"), From cdfd6229300322817353b7417964cc9ebc463be2 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 5 Nov 2024 13:14:43 -0600 Subject: [PATCH 3/8] filter plugin by names --- .../BotSharp.Abstraction/Plugins/Models/PluginFilter.cs | 1 + src/Infrastructure/BotSharp.Core/Plugins/PluginLoader.cs | 6 ++++++ 2 files changed, 7 insertions(+) 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.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), From 5a6075c138a6baf7f6df685f567851dd8b537cbb Mon Sep 17 00:00:00 2001 From: Joanna Ren <101223@smsassist.com> Date: Tue, 5 Nov 2024 16:20:31 -0600 Subject: [PATCH 4/8] excel handler - drop tmp table before create --- .../Functions/HandleExcelRequestFn.cs | 33 ++++--------------- .../Services/MySqlService.cs | 9 +---- 2 files changed, 7 insertions(+), 35 deletions(-) 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);"; From 64b51a3f0723531a476c52a0f6805f761ab97fb1 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Tue, 5 Nov 2024 22:25:07 -0600 Subject: [PATCH 5/8] refine sidecar --- .../SideCar/Attributes/SideCarAspect.cs | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs b/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs index 6580c56c..72cdb4e6 100644 --- a/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs +++ b/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs @@ -40,12 +40,22 @@ 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 paramTypes = args.Select(x => x.GetType()).ToList(); + var sidecarMethod = sidecar?.GetType()?.GetMethods(BindingFlags.Public | BindingFlags.Instance) + .FirstOrDefault(x => x.Name == methodName && x.GetParameters().Select(p => p.ParameterType).SequenceEqual(paramTypes)); + 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 +87,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)) { From 8876191ae69746dccc75908b9ad930569ee1060e Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 6 Nov 2024 10:59:17 -0600 Subject: [PATCH 6/8] refine side car --- .../SideCar/Attributes/SideCarAspect.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs b/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs index 72cdb4e6..83bc4e78 100644 --- a/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs +++ b/src/Infrastructure/BotSharp.Abstraction/SideCar/Attributes/SideCarAspect.cs @@ -44,9 +44,12 @@ public class SideCarAspect private (IConversationSideCar?, MethodInfo?) GetSideCarMethod(IServiceProvider serviceProvider, string methodName, object[] args) { var sidecar = serviceProvider.GetService(); - var paramTypes = args.Select(x => x.GetType()).ToList(); + var argTypes = args.Select(x => x.GetType()).ToArray(); var sidecarMethod = sidecar?.GetType()?.GetMethods(BindingFlags.Public | BindingFlags.Instance) - .FirstOrDefault(x => x.Name == methodName && x.GetParameters().Select(p => p.ParameterType).SequenceEqual(paramTypes)); + .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); } From 8d40b12be3a49d890c8927080e66f96505b65bb5 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Wed, 6 Nov 2024 15:44:33 -0600 Subject: [PATCH 7/8] Fix SqlDictionaryLookupHook --- .../BotSharp.Plugin.SqlDriver/Hooks/SqlDictionaryLookupHook.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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", From aaf61ca04fa30bb98960d569b5afadc2ac89490e Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Wed, 6 Nov 2024 16:03:16 -0600 Subject: [PATCH 8/8] Fix template database.dictionary.sql --- .../BotSharp.Plugin.SqlDriver/Functions/VerifyDictionaryTerm.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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{ });