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