From 24958e285b0ad9e11a72ef8d6d79a845a1f64ad0 Mon Sep 17 00:00:00 2001 From: krut_ni Date: Wed, 24 Jun 2026 21:54:06 +0200 Subject: [PATCH] wiring the install service to a footer button in the assistant --- .../Meta/AssistantMetaAssistant.razor.cs | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs b/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs index d8578017..6eb2bc44 100644 --- a/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/Meta/AssistantMetaAssistant.razor.cs @@ -3,6 +3,7 @@ using System.Text.Json; using AIStudio.Dialogs; using AIStudio.Dialogs.Settings; using AIStudio.Tools.PluginSystem.Assistants.DataModel; +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; using DialogOptions = AIStudio.Dialogs.DialogOptions; @@ -13,6 +14,9 @@ public partial class AssistantMetaAssistant : AssistantBaseCore [Inject] private IDialogService DialogService { get; init; } = null!; + [Inject] + private AssistantPluginInstallService AssistantPluginInstallService { get; init; } = null!; + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(nameof(AssistantMetaAssistant)); private static readonly JsonSerializerOptions UNTRUSTED_PROMPT_JSON_OPTIONS = new() { @@ -52,12 +56,14 @@ public partial class AssistantMetaAssistant : AssistantBaseCore BuilderStep.DONE => this.GenerateLuaAssistant, _ => this.GenerateAssistantSpec, }; - protected override bool SubmitDisabled => this.isAgentRunning; + protected override bool SubmitDisabled => this.isAgentRunning || this.isInstallingPlugin; protected override bool ShowResult => this.step is BuilderStep.DONE; protected override bool AllowProfiles { get; } protected override bool ShowProfileSelection { get; } protected override bool ShowCopyResult => this.step is BuilderStep.DONE; - protected override IReadOnlyList FooterButtons => []; + protected override IReadOnlyList FooterButtons => this.step is BuilderStep.DONE + ? [new ButtonData(T("Install assistant"), Icons.Material.Filled.Extension, Color.Primary, T("Install this generated assistant as a plugin."), this.InstallPluginAsync, () => this.isAgentRunning || this.isInstallingPlugin || string.IsNullOrWhiteSpace(this.generatedLuaAssistant))] + : []; protected override bool HasSettingsPanel { get; } protected override Func Result2Copy => () => !string.IsNullOrWhiteSpace(this.generatedLuaAssistant) ? this.generatedLuaAssistant @@ -65,6 +71,7 @@ public partial class AssistantMetaAssistant : AssistantBaseCore private BuilderStep step = BuilderStep.DESCRIBE; private bool isAgentRunning; + private bool isInstallingPlugin; private string assistantDescription = string.Empty; private AssistantCategory selectedCategory; private string customCategory = string.Empty; @@ -80,6 +87,7 @@ public partial class AssistantMetaAssistant : AssistantBaseCore private string generatedAssistantSpec = string.Empty; private string reviewNotes = string.Empty; private string generatedLuaAssistant = string.Empty; + private readonly Guid pluginId = Guid.NewGuid(); private static readonly AssistantContextFile[] ASSISTANT_CONTEXT_FILES = [ new("Assistant plugin schema", "Plugins/assistants/README.md", IsRequired: true), @@ -324,7 +332,7 @@ public partial class AssistantMetaAssistant : AssistantBaseCore - ID = "{{Guid.NewGuid()}}" + ID = "{{this.pluginId}}" VERSION = "{{DEFAULT_VERSION}}" TYPE = "ASSISTANT" AUTHORS = {"MindWork AI - Assistant Builder"} @@ -457,6 +465,36 @@ public partial class AssistantMetaAssistant : AssistantBaseCore #endif } + private async Task InstallPluginAsync() + { + if (string.IsNullOrWhiteSpace(this.generatedLuaAssistant)) + { + this.Snackbar.Add(T("No assistant plugin was generated yet."), Severity.Warning); + return; + } + + this.isInstallingPlugin = true; + try + { + var result = await this.AssistantPluginInstallService.InstallAsync(this.generatedLuaAssistant, CancellationToken.None); + if (!result.Success) + { + this.Snackbar.Add(result.Issue, Severity.Error); + return; + } + + var message = result.ReplacedExisting + ? string.Format(T("The assistant plugin \"{0}\" was updated."), result.PluginName) + : string.Format(T("The assistant plugin \"{0}\" was installed."), result.PluginName); + this.Snackbar.Add(message, Severity.Success); + } + finally + { + this.isInstallingPlugin = false; + await this.InvokeAsync(this.StateHasChanged); + } + } + private async Task LoadAssistantBuilderContextAsync() { var builder = new StringBuilder();