From e08b45b26faba30e9ae6f9401b5abb7307ef9f5b Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Thu, 6 Aug 2026 09:08:38 +0200 Subject: [PATCH] Added importing plugins by dropping an archive onto the plugin page --- .../Assistants/I18N/allTexts.lua | 22 ++-- app/MindWork AI Studio/Pages/Plugins.razor | 2 +- app/MindWork AI Studio/Pages/Plugins.razor.cs | 123 ++++++++++++++++-- .../plugin.lua | 22 ++-- .../plugin.lua | 22 ++-- 5 files changed, 157 insertions(+), 34 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 0a5880a3..866218d6 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -8020,6 +8020,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3379469503"] = "Your organization ha -- Close UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3448155331"] = "Close" +-- Please drop a plugin archive with the extension {0} or .zip. +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3785427568"] = "Please drop a plugin archive with the extension {0} or .zip." + -- Revise assistant plugin with AI UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3801095542"] = "Revise assistant plugin with AI" @@ -8032,6 +8035,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3872669664"] = "Export plugin archiv -- Install Plugin UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3902690643"] = "Install Plugin" +-- Please drop only one plugin archive at a time. +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3974628410"] = "Please drop only one plugin archive at a time." + -- Assistant updated. UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T40397082"] = "Assistant updated." @@ -9601,9 +9607,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T1821 -- No Lua plugin code was generated. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T1839013358"] = "No Lua plugin code was generated." --- The edited assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2061233834"] = "The edited assistant plugin uses the ID of an internal AI Studio plugin." - -- The assistant plugin directory does not exist. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2148384567"] = "The assistant plugin directory does not exist." @@ -9613,6 +9616,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2223 -- Unexpected error: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2350673880"] = "Unexpected error: {0}" +-- The generated assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2441747251"] = "The generated assistant plugin uses the ID of another installed plugin." + -- Config server managed assistant plugins cannot be replaced. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2594571117"] = "Config server managed assistant plugins cannot be replaced." @@ -9631,8 +9637,8 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2864 -- The generated plugin is not an assistant plugin. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2955055168"] = "The generated plugin is not an assistant plugin. Issue: {0}" --- The generated assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T3162363526"] = "The generated assistant plugin uses the ID of an internal AI Studio plugin." +-- The imported assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2971411166"] = "The imported assistant plugin uses the ID of another installed plugin." -- Your organization has disabled importing plugins. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T3212529834"] = "Your organization has disabled importing plugins." @@ -9658,15 +9664,15 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T4062 -- The edited assistant plugin is invalid. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T554567780"] = "The edited assistant plugin is invalid. Issue: {0}" +-- The edited assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T584770023"] = "The edited assistant plugin uses the ID of another installed plugin." + -- The edited assistant plugin must keep the same plugin ID. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T693124809"] = "The edited assistant plugin must keep the same plugin ID." -- Internal assistant plugins cannot be edited. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T816339833"] = "Internal assistant plugins cannot be edited." --- The imported assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T840673975"] = "The imported assistant plugin uses the ID of an internal AI Studio plugin." - -- The generated assistant plugin is invalid. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T939708112"] = "The generated assistant plugin is invalid. Issue: {0}" diff --git a/app/MindWork AI Studio/Pages/Plugins.razor b/app/MindWork AI Studio/Pages/Plugins.razor index ff93092c..de620c44 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor +++ b/app/MindWork AI Studio/Pages/Plugins.razor @@ -24,7 +24,7 @@ - + diff --git a/app/MindWork AI Studio/Pages/Plugins.razor.cs b/app/MindWork AI Studio/Pages/Plugins.razor.cs index 6f08dfcb..b563a9dc 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor.cs +++ b/app/MindWork AI Studio/Pages/Plugins.razor.cs @@ -42,6 +42,14 @@ public partial class Plugins : MSGComponentBase private bool isSharingPlugin; + /// + /// Number of active drop areas above this page. While there is any, another component owns the + /// dropped files and this page must not catch them. + /// + private uint numDropAreasAboveThis; + + private bool isDraggingOverPage; + private const string IMPORT_ICON = @" @@ -53,8 +61,11 @@ public partial class Plugins : MSGComponentBase protected override async Task OnInitializedAsync() { - this.ApplyFilters([], [ Event.PLUGINS_RELOADED, Event.CONFIGURATION_CHANGED ]); - + this.ApplyFilters([], [ Event.PLUGINS_RELOADED, Event.CONFIGURATION_CHANGED, Event.TAURI_EVENT_RECEIVED, Event.REGISTER_FILE_DROP_AREA, Event.UNREGISTER_FILE_DROP_AREA ]); + + // Register the whole page as a drop area, so users can drop a plugin archive anywhere on it: + await this.MessageBus.SendMessage(this, Event.REGISTER_FILE_DROP_AREA, DropLayers.PAGES); + this.groupConfig = new TableGroupDefinition { Expandable = true, @@ -79,6 +90,13 @@ public partial class Plugins : MSGComponentBase await this.TryAutoAuditAssistantsAsync(); } + protected override void DisposeResources() + { + // Release the drop area again, so lower layers can catch dropped files: + _ = this.MessageBus.SendMessage(this, Event.UNREGISTER_FILE_DROP_AREA, DropLayers.PAGES); + base.DisposeResources(); + } + #endregion private async Task PluginActivationStateChanged(IPluginMetadata pluginMeta) @@ -224,6 +242,14 @@ public partial class Plugins : MSGComponentBase /// private static bool CanSharePlugin(IAvailablePlugin plugin) => plugin is { IsInternal: false, IsManagedByConfigServer: false, Type: PluginType.ASSISTANT } && !string.IsNullOrWhiteSpace(plugin.LocalPath); + /// + /// Highlights the plugin table while the user drags a file over the page, so it is visible + /// where the file would land. + /// + private string PluginTableClass => this.isDraggingOverPage + ? "border-dashed border rounded-lg mud-border-primary border-4" + : "border-dashed border rounded-lg"; + /// /// Organizations may disable importing plugin archives by using a configuration plugin. /// @@ -317,6 +343,26 @@ public partial class Plugins : MSGComponentBase } private async Task ImportAssistantPluginAsync() + { + if (this.isImportingAssistantPlugin) + return; + + if (!this.AllowPluginImport) + return; + + var selection = await this.RustService.SelectFile(this.T("Import assistant plugin"), [FileTypes.PLUGIN_ARCHIVE]); + if (selection.UserCancelled) + return; + + await this.ImportPluginArchiveAsync(selection.SelectedFilePath); + } + + /// + /// Installs a plugin archive, no matter whether the user picked it through the import button or + /// dropped it onto the page. + /// + /// The local plugin archive to install. + private async Task ImportPluginArchiveAsync(string archivePath) { if (this.isImportingAssistantPlugin) return; @@ -329,17 +375,13 @@ public partial class Plugins : MSGComponentBase try { - var selection = await this.RustService.SelectFile(this.T("Import assistant plugin"), [FileTypes.PLUGIN_ARCHIVE]); - if (selection.UserCancelled) - return; - - var result = await this.AssistantPluginInstallService.InstallArchiveAsync(selection.SelectedFilePath, this.ConfirmPluginImportAsync, CancellationToken.None); + var result = await this.AssistantPluginInstallService.InstallArchiveAsync(archivePath, this.ConfirmPluginImportAsync, CancellationToken.None); if (result.Cancelled) return; if (!result.Success) { - LOG.LogError("Failed to import assistant plugin archive '{ArchivePath}': {Issue}", selection.SelectedFilePath, result.Issue); + LOG.LogError("Failed to import assistant plugin archive '{ArchivePath}': {Issue}", archivePath, result.Issue); // The user actively started this import, so we report the reason in a dialog // instead of a snackbar. Refused imports must not be missed: @@ -460,8 +502,71 @@ public partial class Plugins : MSGComponentBase case Event.CONFIGURATION_CHANGED: await this.InvokeAsync(this.StateHasChanged); break; + + case Event.REGISTER_FILE_DROP_AREA when sendingComponent != this: + if (data is int registeredLayer && registeredLayer > DropLayers.PAGES) + this.numDropAreasAboveThis++; + + break; + + case Event.UNREGISTER_FILE_DROP_AREA when sendingComponent != this: + if (data is int unregisteredLayer && unregisteredLayer > DropLayers.PAGES && this.numDropAreasAboveThis > 0) + this.numDropAreasAboveThis--; + + break; + + case Event.TAURI_EVENT_RECEIVED when data is TauriEvent { EventType: TauriEventType.FILE_DROP_HOVERED }: + if (!this.CanCatchDroppedFile()) + return; + + this.isDraggingOverPage = true; + await this.InvokeAsync(this.StateHasChanged); + break; + + case Event.TAURI_EVENT_RECEIVED when data is TauriEvent { EventType: TauriEventType.FILE_DROP_CANCELED }: + case Event.TAURI_EVENT_RECEIVED when data is TauriEvent { EventType: TauriEventType.WINDOW_NOT_FOCUSED }: + this.isDraggingOverPage = false; + await this.InvokeAsync(this.StateHasChanged); + break; + + case Event.TAURI_EVENT_RECEIVED when data is TauriEvent { EventType: TauriEventType.FILE_DROP_DROPPED, Payload: var droppedPaths }: + this.isDraggingOverPage = false; + await this.InvokeAsync(this.StateHasChanged); + if (!this.CanCatchDroppedFile()) + return; + + await this.ImportDroppedPluginArchiveAsync(droppedPaths); + break; } } #endregion -} + + /// + /// Decides whether this page may process dropped files: only when no drop area above it is + /// active and when the organization allows importing plugins at all. + /// + private bool CanCatchDroppedFile() => this.numDropAreasAboveThis is 0 && this.AllowPluginImport && !this.isImportingAssistantPlugin; + + /// + /// Imports a plugin archive the user dropped onto the page. Anything that is not exactly one + /// plugin archive is reported instead of guessing what the user meant. + /// + /// The paths of the dropped files. + private async Task ImportDroppedPluginArchiveAsync(IReadOnlyList droppedPaths) + { + var archivePaths = droppedPaths.Where(path => FileTypes.IsAllowedPath(path, FileTypes.PLUGIN_ARCHIVE)).ToList(); + switch (archivePaths.Count) + { + case 0: + await this.MessageBus.SendWarning(new(Icons.Material.Filled.ReportProblem, string.Format(this.T("Please drop a plugin archive with the extension {0} or .zip."), PluginShareService.PLUGIN_FILE_EXTENSION))); + return; + + case > 1: + await this.MessageBus.SendWarning(new(Icons.Material.Filled.ReportProblem, this.T("Please drop only one plugin archive at a time."))); + return; + } + + await this.ImportPluginArchiveAsync(archivePaths[0]); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index 81478c9a..512b32fa 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -8022,6 +8022,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3379469503"] = "Ihre Organisation ha -- Close UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3448155331"] = "Schließen" +-- Please drop a plugin archive with the extension {0} or .zip. +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3785427568"] = "Bitte legen Sie ein Plugin-Archiv mit der Erweiterung {0} oder .zip hier ab." + -- Revise assistant plugin with AI UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3801095542"] = "Assistenten-Plugin mit KI überarbeiten" @@ -8034,6 +8037,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3872669664"] = "Plugin-Archiv export -- Install Plugin UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3902690643"] = "Plugin installieren" +-- Please drop only one plugin archive at a time. +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3974628410"] = "Bitte legen Sie jeweils nur ein Plugin-Archiv gleichzeitig ab." + -- Assistant updated. UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T40397082"] = "Assistent aktualisiert." @@ -9603,9 +9609,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T1821 -- No Lua plugin code was generated. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T1839013358"] = "Es wurde kein Lua-Plugin-Code generiert." --- The edited assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2061233834"] = "Das bearbeitete Assistenten-Plugin verwendet die ID eines internen AI-Studio-Plugins." - -- The assistant plugin directory does not exist. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2148384567"] = "Das Verzeichnis für das Assistenten-Plugin existiert nicht." @@ -9615,6 +9618,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2223 -- Unexpected error: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2350673880"] = "Unerwarteter Fehler: {0}" +-- The generated assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2441747251"] = "Das generierte Assistenten-Plugin verwendet die ID eines anderen installierten Plugins." + -- Config server managed assistant plugins cannot be replaced. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2594571117"] = "Vom Konfigurationsserver verwaltete Assistenten-Plugins können nicht ersetzt werden." @@ -9633,8 +9639,8 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2864 -- The generated plugin is not an assistant plugin. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2955055168"] = "Das generierte Plugin ist kein Assistenten-Plugin. Problem: {0}" --- The generated assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T3162363526"] = "Das generierte Assistent-Plugin verwendet die ID eines internen AI-Studio-Plugins." +-- The imported assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2971411166"] = "Das importierte Assistenten-Plugin verwendet die ID eines anderen installierten Plugins." -- Your organization has disabled importing plugins. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T3212529834"] = "Ihre Organisation hat das Importieren von Plugins deaktiviert." @@ -9660,15 +9666,15 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T4062 -- The edited assistant plugin is invalid. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T554567780"] = "Das bearbeitete Assistenten-Plugin ist ungültig. Problem: {0}" +-- The edited assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T584770023"] = "Das bearbeitete Assistenten-Plugin verwendet die ID eines anderen installierten Plugins." + -- The edited assistant plugin must keep the same plugin ID. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T693124809"] = "Das bearbeitete Assistant-Plugin muss dieselbe Plugin-ID beibehalten." -- Internal assistant plugins cannot be edited. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T816339833"] = "Interne Assistenten-Plugins können nicht bearbeitet werden." --- The imported assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T840673975"] = "Das importierte Assistenten-Plugin verwendet die ID eines internen AI-Studio-Plugins." - -- The generated assistant plugin is invalid. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T939708112"] = "Das generierte Assistenten-Plugin ist ungültig. Problem: {0}" diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index b59d655f..1911fe17 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -8022,6 +8022,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3379469503"] = "Your organization ha -- Close UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3448155331"] = "Close" +-- Please drop a plugin archive with the extension {0} or .zip. +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3785427568"] = "Please drop a plugin archive with the extension {0} or .zip." + -- Revise assistant plugin with AI UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3801095542"] = "Revise assistant plugin with AI" @@ -8034,6 +8037,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3872669664"] = "Export plugin archiv -- Install Plugin UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3902690643"] = "Install Plugin" +-- Please drop only one plugin archive at a time. +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3974628410"] = "Please drop only one plugin archive at a time." + -- Assistant updated. UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T40397082"] = "Assistant updated." @@ -9603,9 +9609,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T1821 -- No Lua plugin code was generated. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T1839013358"] = "No Lua plugin code was generated." --- The edited assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2061233834"] = "The edited assistant plugin uses the ID of an internal AI Studio plugin." - -- The assistant plugin directory does not exist. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2148384567"] = "The assistant plugin directory does not exist." @@ -9615,6 +9618,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2223 -- Unexpected error: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2350673880"] = "Unexpected error: {0}" +-- The generated assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2441747251"] = "The generated assistant plugin uses the ID of another installed plugin." + -- Config server managed assistant plugins cannot be replaced. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2594571117"] = "Config server managed assistant plugins cannot be replaced." @@ -9633,8 +9639,8 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2864 -- The generated plugin is not an assistant plugin. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2955055168"] = "The generated plugin is not an assistant plugin. Issue: {0}" --- The generated assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T3162363526"] = "The generated assistant plugin uses the ID of an internal AI Studio plugin." +-- The imported assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T2971411166"] = "The imported assistant plugin uses the ID of another installed plugin." -- Your organization has disabled importing plugins. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T3212529834"] = "Your organization has disabled importing plugins." @@ -9660,15 +9666,15 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T4062 -- The edited assistant plugin is invalid. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T554567780"] = "The edited assistant plugin is invalid. Issue: {0}" +-- The edited assistant plugin uses the ID of another installed plugin. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T584770023"] = "The edited assistant plugin uses the ID of another installed plugin." + -- The edited assistant plugin must keep the same plugin ID. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T693124809"] = "The edited assistant plugin must keep the same plugin ID." -- Internal assistant plugins cannot be edited. UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T816339833"] = "Internal assistant plugins cannot be edited." --- The imported assistant plugin uses the ID of an internal AI Studio plugin. -UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T840673975"] = "The imported assistant plugin uses the ID of an internal AI Studio plugin." - -- The generated assistant plugin is invalid. Issue: {0} UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::ASSISTANTPLUGININSTALLSERVICE::T939708112"] = "The generated assistant plugin is invalid. Issue: {0}"