From adb1010608da414ea39d695932f33b12e857b294 Mon Sep 17 00:00:00 2001 From: Nils Kruthoff Date: Tue, 30 Jun 2026 22:24:30 +0200 Subject: [PATCH] use the json response to create a safe directory name from the assistants titel --- .../Services/AssistantPluginInstallService.cs | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs b/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs index 8ba1b05b..b954093e 100644 --- a/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs +++ b/app/MindWork AI Studio/Tools/Services/AssistantPluginInstallService.cs @@ -11,6 +11,7 @@ public sealed class AssistantPluginInstallService { private const string PLUGIN_FILE_NAME = "plugin.lua"; private const string ASSISTANT_BUILDER_DIRECTORY_PREFIX = "assistant-builder"; + private const int DIRECTORY_PREFIX_MAX_LEN = 80; private readonly ILogger logger; private readonly SemaphoreSlim installSemaphore = new(1, 1); @@ -151,7 +152,52 @@ public sealed class AssistantPluginInstallService return existingPlugin is not null ? existingPlugin.LocalPath - : Path.Join(assistantPluginsRoot, $"{ASSISTANT_BUILDER_DIRECTORY_PREFIX}-{assistantPlugin.Id:N}"); + : Path.Join(assistantPluginsRoot, CreatePluginDirectoryName(assistantPlugin)); + } + + private static string CreatePluginDirectoryName(PluginAssistants assistantPlugin) + { + var safeName = CreateSafeDirectoryNamePart(assistantPlugin.Name); + return $"{safeName}-{assistantPlugin.Id:N}"; + } + + private static string CreateSafeDirectoryNamePart(string name) + { + var sb = new StringBuilder(); + var invalidChars = Path.GetInvalidFileNameChars().ToHashSet(); + + foreach (var character in name.Trim()) + { + if (char.IsLetterOrDigit(character)) + { + sb.Append(char.ToLowerInvariant(character)); + continue; + } + + if (character is '-' or '_' or '.' && !invalidChars.Contains(character)) + { + sb.Append(character); + continue; + } + + AppendSeparator(); + } + + var safeName = sb.ToString().Trim('-', '.'); + if (safeName.Length > DIRECTORY_PREFIX_MAX_LEN) + safeName = safeName[..DIRECTORY_PREFIX_MAX_LEN].Trim('-', '.'); + + return string.IsNullOrWhiteSpace(safeName) + ? ASSISTANT_BUILDER_DIRECTORY_PREFIX + : safeName; + + void AppendSeparator() + { + if (sb.Length == 0 || sb[^1] == '-') + return; + + sb.Append('-'); + } } private static bool IsPathInsideDirectory(string parentDirectory, string path)