From a4db045881015ec21592683e0cd06de3ebcc0f42 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Wed, 5 Aug 2026 16:41:32 +0200 Subject: [PATCH] Fixed loading a replaced assistant plugin twice during installation --- .../Services/AssistantPluginInstallService.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs b/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs index 2baf60ce..585cb09c 100644 --- a/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs +++ b/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs @@ -23,6 +23,7 @@ public sealed class AssistantPluginInstallService private const string PLUGIN_FILE_NAME = "plugin.lua"; private const string ASSISTANT_BUILDER_DIRECTORY_PREFIX = "assistant-builder"; private const string DELETE_BACKUP_DIRECTORY = ".plugin-delete-backups"; + private const string INSTALL_BACKUP_DIRECTORY = ".plugin-install-backups"; private const int DIRECTORY_PREFIX_MAX_LEN = 80; private readonly ILogger logger; @@ -439,7 +440,12 @@ public sealed class AssistantPluginInstallService if (Directory.Exists(finalDirectory)) { replacedExisting = true; - backupDirectory = Path.Join(assistantPluginsRoot, $".{Path.GetFileName(finalDirectory)}.backup-{Guid.NewGuid():N}"); + + // The backup goes to a directory outside the plugin root, so the plugin loader + // cannot discover it during the reload below. Otherwise, the previous version + // would be loaded a second time, next to the version we are installing: + backupDirectory = CreateInstallBackupDirectory(assistantPlugin); + Directory.CreateDirectory(Path.GetDirectoryName(backupDirectory)!); Directory.Move(finalDirectory, backupDirectory); } @@ -700,6 +706,12 @@ public sealed class AssistantPluginInstallService return Path.Join(backupRoot, $"assistant-{plugin.Id:N}-{Guid.NewGuid():N}"); } + private static string CreateInstallBackupDirectory(IPluginMetadata plugin) + { + var backupRoot = Path.Join(SettingsManager.DataDirectory, INSTALL_BACKUP_DIRECTORY); + return Path.Join(backupRoot, $"assistant-{plugin.Id:N}-{Guid.NewGuid():N}"); + } + private async Task TryRestoreDeletedAssistantPluginAsync(IAvailablePlugin plugin, string pluginDirectory, string backupDirectory, bool wasEnabled, List removedAudits, CancellationToken token) { try