From 509d57f69aceb02c0b560945eeaca6aa20d8adbf Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 11 Jan 2026 22:18:26 +0000 Subject: [PATCH] Add config plugin support to hide individual assistants This change enables enterprise IT departments to hide specific assistants via configuration plugins, providing better control over which features are available to end users. Changes: - Created ConfigurableAssistant enum listing all hideable assistants - Added HiddenAssistants property to DataApp settings (HashSet) - Added IsAssistantVisible() method in Assistants.razor.cs to check visibility - Updated Assistants.razor to conditionally render assistants based on configuration - Extended plugin.lua template with HiddenAssistants configuration example Example usage in configuration plugin: CONFIG["SETTINGS"]["DataApp.HiddenAssistants"] = { "GRAMMAR_SPELLING_ASSISTANT", "SYNONYMS_ASSISTANT" } The setting integrates with the existing ManagedConfiguration system and is locked when managed by a config plugin, preventing user override. --- app/MindWork AI Studio/Pages/Assistants.razor | 82 ++++++++++++++----- .../Pages/Assistants.razor.cs | 42 +++++++++- .../Plugins/configuration/plugin.lua | 9 ++ .../Settings/ConfigurableAssistant.cs | 27 ++++++ .../Settings/DataModel/DataApp.cs | 5 ++ 5 files changed, 144 insertions(+), 21 deletions(-) create mode 100644 app/MindWork AI Studio/Settings/ConfigurableAssistant.cs diff --git a/app/MindWork AI Studio/Pages/Assistants.razor b/app/MindWork AI Studio/Pages/Assistants.razor index 1cd72a5f..3c41920f 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Pages/Assistants.razor @@ -14,54 +14,96 @@ @T("General") - - - - - + @if (IsAssistantVisible(Components.TEXT_SUMMARIZER_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.TRANSLATION_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.GRAMMAR_SPELLING_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.REWRITE_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.SYNONYMS_ASSISTANT)) + { + + } @T("Business") - - - @if (PreviewFeatures.PRE_DOCUMENT_ANALYSIS_2025.IsEnabled(this.SettingsManager)) + @if (IsAssistantVisible(Components.EMAIL_ASSISTANT)) + { + + } + + @if (PreviewFeatures.PRE_DOCUMENT_ANALYSIS_2025.IsEnabled(this.SettingsManager) && IsAssistantVisible(Components.DOCUMENT_ANALYSIS_ASSISTANT)) { } - - - - - - + + @if (IsAssistantVisible(Components.MY_TASKS_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.AGENDA_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.JOB_POSTING_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.LEGAL_CHECK_ASSISTANT)) + { + + } + @if (IsAssistantVisible(Components.ICON_FINDER_ASSISTANT)) + { + + } @T("Learning") - + @if (IsAssistantVisible(Components.BIAS_DAY_ASSISTANT)) + { + + } - + @T("Software Engineering") - - @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) + @if (IsAssistantVisible(Components.CODING_ASSISTANT)) + { + + } + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager) && IsAssistantVisible(Components.ERI_ASSISTANT)) { } - + @T("AI Studio Development") - + @if (IsAssistantVisible(Components.I18N_ASSISTANT)) + { + + } diff --git a/app/MindWork AI Studio/Pages/Assistants.razor.cs b/app/MindWork AI Studio/Pages/Assistants.razor.cs index e2c2de49..ead98360 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor.cs +++ b/app/MindWork AI Studio/Pages/Assistants.razor.cs @@ -1,5 +1,45 @@ using AIStudio.Components; +using AIStudio.Settings; +using AIStudio.Tools; namespace AIStudio.Pages; -public partial class Assistants : MSGComponentBase; \ No newline at end of file +public partial class Assistants : MSGComponentBase +{ + /// + /// Checks if an assistant should be visible based on configuration. + /// + /// The assistant component to check. + /// True if the assistant should be visible, false otherwise. + private bool IsAssistantVisible(Components component) + { + // Map Components enum to ConfigurableAssistant enum + var configurableAssistant = component switch + { + Components.GRAMMAR_SPELLING_ASSISTANT => ConfigurableAssistant.GRAMMAR_SPELLING_ASSISTANT, + Components.ICON_FINDER_ASSISTANT => ConfigurableAssistant.ICON_FINDER_ASSISTANT, + Components.REWRITE_ASSISTANT => ConfigurableAssistant.REWRITE_ASSISTANT, + Components.TRANSLATION_ASSISTANT => ConfigurableAssistant.TRANSLATION_ASSISTANT, + Components.AGENDA_ASSISTANT => ConfigurableAssistant.AGENDA_ASSISTANT, + Components.CODING_ASSISTANT => ConfigurableAssistant.CODING_ASSISTANT, + Components.TEXT_SUMMARIZER_ASSISTANT => ConfigurableAssistant.TEXT_SUMMARIZER_ASSISTANT, + Components.EMAIL_ASSISTANT => ConfigurableAssistant.EMAIL_ASSISTANT, + Components.LEGAL_CHECK_ASSISTANT => ConfigurableAssistant.LEGAL_CHECK_ASSISTANT, + Components.SYNONYMS_ASSISTANT => ConfigurableAssistant.SYNONYMS_ASSISTANT, + Components.MY_TASKS_ASSISTANT => ConfigurableAssistant.MY_TASKS_ASSISTANT, + Components.JOB_POSTING_ASSISTANT => ConfigurableAssistant.JOB_POSTING_ASSISTANT, + Components.BIAS_DAY_ASSISTANT => ConfigurableAssistant.BIAS_DAY_ASSISTANT, + Components.ERI_ASSISTANT => ConfigurableAssistant.ERI_ASSISTANT, + Components.DOCUMENT_ANALYSIS_ASSISTANT => ConfigurableAssistant.DOCUMENT_ANALYSIS_ASSISTANT, + Components.I18N_ASSISTANT => ConfigurableAssistant.I18N_ASSISTANT, + _ => (ConfigurableAssistant?)null, + }; + + // If the component doesn't map to a configurable assistant, it's always visible + if (configurableAssistant is null) + return true; + + // Check if the assistant is hidden in configuration + return !this.SettingsManager.ConfigurationData.App.HiddenAssistants.Contains(configurableAssistant.Value); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/configuration/plugin.lua b/app/MindWork AI Studio/Plugins/configuration/plugin.lua index 8cd62555..9bb5ee44 100644 --- a/app/MindWork AI Studio/Plugins/configuration/plugin.lua +++ b/app/MindWork AI Studio/Plugins/configuration/plugin.lua @@ -143,6 +143,15 @@ CONFIG["SETTINGS"] = {} -- Please note: using an empty string ("") will lock the selection and disable dictation/transcription. -- CONFIG["SETTINGS"]["DataApp.UseTranscriptionProvider"] = "00000000-0000-0000-0000-000000000000" +-- Configure which assistants should be hidden from the UI. +-- Allowed values can be found in ConfigurableAssistant enum. +-- Examples: GRAMMAR_SPELLING_ASSISTANT, ICON_FINDER_ASSISTANT, REWRITE_ASSISTANT, +-- TRANSLATION_ASSISTANT, AGENDA_ASSISTANT, CODING_ASSISTANT, +-- TEXT_SUMMARIZER_ASSISTANT, EMAIL_ASSISTANT, LEGAL_CHECK_ASSISTANT, +-- SYNONYMS_ASSISTANT, MY_TASKS_ASSISTANT, JOB_POSTING_ASSISTANT, +-- BIAS_DAY_ASSISTANT, ERI_ASSISTANT, DOCUMENT_ANALYSIS_ASSISTANT, I18N_ASSISTANT +-- CONFIG["SETTINGS"]["DataApp.HiddenAssistants"] = { "GRAMMAR_SPELLING_ASSISTANT", "SYNONYMS_ASSISTANT" } + -- Example chat templates for this configuration: CONFIG["CHAT_TEMPLATES"] = {} diff --git a/app/MindWork AI Studio/Settings/ConfigurableAssistant.cs b/app/MindWork AI Studio/Settings/ConfigurableAssistant.cs new file mode 100644 index 00000000..6e5d22a9 --- /dev/null +++ b/app/MindWork AI Studio/Settings/ConfigurableAssistant.cs @@ -0,0 +1,27 @@ +namespace AIStudio.Settings; + +/// +/// Enum representing assistants that can be hidden via configuration plugin. +/// +public enum ConfigurableAssistant +{ + GRAMMAR_SPELLING_ASSISTANT, + ICON_FINDER_ASSISTANT, + REWRITE_ASSISTANT, + TRANSLATION_ASSISTANT, + AGENDA_ASSISTANT, + CODING_ASSISTANT, + TEXT_SUMMARIZER_ASSISTANT, + EMAIL_ASSISTANT, + LEGAL_CHECK_ASSISTANT, + SYNONYMS_ASSISTANT, + MY_TASKS_ASSISTANT, + JOB_POSTING_ASSISTANT, + BIAS_DAY_ASSISTANT, + ERI_ASSISTANT, + DOCUMENT_ANALYSIS_ASSISTANT, + + // ReSharper disable InconsistentNaming + I18N_ASSISTANT, + // ReSharper restore InconsistentNaming +} diff --git a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs index 720d3b5a..d2ac4bb7 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs @@ -86,4 +86,9 @@ public sealed class DataApp(Expression>? configSelection = n /// Should the user be allowed to add providers? /// public bool AllowUserToAddProvider { get; set; } = ManagedConfiguration.Register(configSelection, n => n.AllowUserToAddProvider, true); + + /// + /// List of assistants that should be hidden from the UI. + /// + public HashSet HiddenAssistants { get; set; } = ManagedConfiguration.Register(configSelection, n => n.HiddenAssistants, []); } \ No newline at end of file