From 62b878284d3e235cb23f1e36b03125ab29ade5e5 Mon Sep 17 00:00:00 2001 From: nilsk Date: Mon, 13 Jul 2026 11:12:45 +0200 Subject: [PATCH] moving plugin action buttons into a button group and wired generation logic to an action button --- app/MindWork AI Studio/Pages/Plugins.razor | 70 +++++++++++-------- app/MindWork AI Studio/Pages/Plugins.razor.cs | 34 ++++++++- 2 files changed, 72 insertions(+), 32 deletions(-) diff --git a/app/MindWork AI Studio/Pages/Plugins.razor b/app/MindWork AI Studio/Pages/Plugins.razor index eb83661d..73a58e3c 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor +++ b/app/MindWork AI Studio/Pages/Plugins.razor @@ -1,5 +1,6 @@ @using AIStudio.Tools.PluginSystem @using AIStudio.Tools.PluginSystem.Assistants +@using AIStudio.Tools.Services @inherits MSGComponentBase @attribute [Route(Routes.PLUGINS)] @@ -64,11 +65,11 @@ - + @if (context.Type is PluginType.ASSISTANT) { var assistantPlugin = PluginFactory.RunningPlugins.OfType().FirstOrDefault(x => x.Id == context.Id); - + } @if (context is { IsInternal: false, Type: not PluginType.CONFIGURATION }) { @@ -79,37 +80,48 @@ } - @if (context is { IsInternal: false } && !string.IsNullOrWhiteSpace(context.SourceURL)) - { - var sourceUrl = context.SourceURL; - var isSendingMail = IsSendingMail(sourceUrl); - if (isSendingMail) + + @if (context is { IsInternal: false } && !string.IsNullOrWhiteSpace(context.SourceURL)) { - - + var sourceUrl = context.SourceURL; + var isSendingMail = IsSendingMail(sourceUrl); + if (isSendingMail) + { + var isDefaultSupportContact = string.Equals(sourceUrl, AssistantPluginGenerationService.DEFAULT_SUPPORT_CONTACT, StringComparison.Ordinal); + + + + } + else + { + var isDefaultSourceUrl = string.Equals(sourceUrl, AssistantPluginGenerationService.DEFAULT_SOURCE_URL, StringComparison.Ordinal); + + + + } + } + + @if (context is IAvailablePlugin editablePlugin && CanEditAssistantPlugin(editablePlugin)) + { + + } - else - { - - - - } - } - - @if (context is IAvailablePlugin editablePlugin && CanEditAssistantPlugin(editablePlugin)) - { - - - - } - @if (context is IAvailablePlugin availablePlugin && CanDeleteAssistantPlugin(availablePlugin)) - { - - - - } + @if (context is IAvailablePlugin revisionPlugin && CanReviseAssistantPlugin(revisionPlugin)) + { + + + + } + + @if (context is IAvailablePlugin availablePlugin && CanDeleteAssistantPlugin(availablePlugin)) + { + + + + } + diff --git a/app/MindWork AI Studio/Pages/Plugins.razor.cs b/app/MindWork AI Studio/Pages/Plugins.razor.cs index 4afeeed7..8b753eae 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor.cs +++ b/app/MindWork AI Studio/Pages/Plugins.razor.cs @@ -94,7 +94,7 @@ public partial class Plugins : MSGComponentBase return; } - if (securityState.IsBelowMinimum && securityState.IsBlocked) + if (securityState is { IsBelowMinimum: true, IsBlocked: true }) { var blockedAudit = securityState.Audit; if (blockedAudit is not null) @@ -102,7 +102,7 @@ public partial class Plugins : MSGComponentBase return; } - if (securityState.IsBelowMinimum && securityState.CanOverride && + if (securityState is { IsBelowMinimum: true, CanOverride: true } && !await this.ConfirmActivationBelowMinimumAsync(pluginMeta.Name, securityState.Audit!.Level)) { return; @@ -164,7 +164,7 @@ public partial class Plugins : MSGComponentBase return false; var securityState = PluginAssistantSecurityResolver.Resolve(this.SettingsManager, assistantPlugin); - return securityState.IsBlocked && !securityState.RequiresAudit; + return securityState is { IsBlocked: true, RequiresAudit: false }; } private string GetActivationTooltip(IPluginMetadata pluginMeta, bool isEnabled) @@ -192,6 +192,14 @@ public partial class Plugins : MSGComponentBase private static bool CanDeleteAssistantPlugin(IAvailablePlugin plugin) => plugin is { IsInternal: false, Type: PluginType.ASSISTANT } && !string.IsNullOrWhiteSpace(plugin.LocalPath); + private static bool CanReviseAssistantPlugin(IAvailablePlugin plugin) + { + var assistantPlugin = PluginFactory.RunningPlugins.OfType().FirstOrDefault(x => x.Id == plugin.Id); + return plugin is { IsInternal: false, Type: PluginType.ASSISTANT } && + !string.IsNullOrWhiteSpace(plugin.LocalPath) && + assistantPlugin?.IsAssistantBuilderGenerated is true; + } + private async Task OpenAssistantPluginEditorDialogAsync(IAvailablePlugin plugin) { var parameters = new DialogParameters @@ -211,6 +219,26 @@ public partial class Plugins : MSGComponentBase await this.InvokeAsync(this.StateHasChanged); } + private async Task OpenAssistantPluginRevisionDialogAsync(IAvailablePlugin plugin) + { + var parameters = new DialogParameters + { + { x => x.PluginId, plugin.Id }, + { x => x.PluginLocalPath, plugin.LocalPath }, + }; + + var dialogReference = await this.DialogService.ShowAsync(this.T("Revise Assistant Plugin"), parameters, DialogOptions.BLOCKING_FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult is null || dialogResult.Canceled || dialogResult.Data is not AssistantPluginRevisionDialogResult result) + return; + + await this.MessageBus.SendSuccess(new(Icons.Material.Filled.AutoFixHigh, string.Format(this.T("The assistant plugin '{0}' has been successfully revised."), result.PluginName))); + LOG.LogInformation($"The assistant plugin '{result.PluginName}' ({result.PluginId}) has been successfully revised."); + await this.MessageBus.SendMessage(this, Event.PLUGINS_RELOADED); + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + await this.InvokeAsync(this.StateHasChanged); + } + private async Task DeleteAssistantPluginAsync(IAvailablePlugin plugin) { var dialogParameters = new DialogParameters