From d53d7075a3d854b9758fd8b5b47b0ceb54bf2e92 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sun, 9 Aug 2026 18:41:33 +0200 Subject: [PATCH] Added an indicator for locally staged test configurations --- .../Pages/Information.razor | 25 ++++++++++++ .../Pages/Information.razor.cs | 40 ++++++++++++++++--- documentation/Enterprise IT.md | 2 + 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/app/MindWork AI Studio/Pages/Information.razor b/app/MindWork AI Studio/Pages/Information.razor index cbed29c4..67ac1bdb 100644 --- a/app/MindWork AI Studio/Pages/Information.razor +++ b/app/MindWork AI Studio/Pages/Information.razor @@ -158,6 +158,31 @@ break; } + @* + A staged test configuration speaks for the organization without anybody + having deployed it. We report it without the details having to be expanded: + *@ + @if (this.testConfigPlugins.Count > 0) + { + + @T("A test configuration is active. It acts like a configuration of your organization and may, for example, approve assistant plugins. AI Studio removes it the next time you start the app.") + + @foreach (var testConfigPlugin in this.testConfigPlugins) + { + + } + } + else if (PluginFactory.RemovedTestConfigurationsAtStartup > 0) + { + + @string.Format(T("AI Studio removed {0} test configuration(s) while starting. A test configuration is valid for one session: place it again while AI Studio is running."), PluginFactory.RemovedTestConfigurationsAtStartup) + + } + @if (this.HasEnterpriseConfigurationDetails) { configPlugins = PluginFactory.AvailablePlugins - .Where(x => x.Type is PluginType.CONFIGURATION) - .OfType() - .ToList(); + private List configPlugins = []; + + /// + /// The configuration plugins an administrator staged for a test. + /// + /// + /// They are kept apart from the other configuration plugins: nobody deployed them, yet they act + /// on behalf of the organization while they are loaded. That deserves its own note. + /// + private List testConfigPlugins = []; private List enterpriseEnvironments = EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS.ToList(); @@ -201,11 +207,14 @@ public partial class Information : MSGComponentBase private void RefreshEnterpriseConfigurationState() { - this.configPlugins = PluginFactory.AvailablePlugins + var availableConfigPlugins = PluginFactory.AvailablePlugins .Where(x => x.Type is PluginType.CONFIGURATION) .OfType() .ToList(); + this.testConfigPlugins = availableConfigPlugins.Where(plugin => PluginFactory.IsEnterpriseTestConfigurationPath(plugin.LocalPath)).ToList(); + this.configPlugins = availableConfigPlugins.Except(this.testConfigPlugins).ToList(); + this.enterpriseEnvironments = EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS.ToList(); this.mandatoryInfoPanels = PluginFactory.GetMandatoryInfos() .Select(info => @@ -404,6 +413,27 @@ public partial class Information : MSGComponentBase return plugin.ManagedConfigurationId == configurationId && plugin.Id != configurationId; } + /// + /// Collects what a user needs to find and judge a staged test configuration. + /// + /// + /// There is no enterprise environment behind it, so we show what identifies it instead: the plugin + /// ID it claims and the directory it was staged in. + /// + private IReadOnlyList BuildTestConfigurationItems(IAvailablePlugin plugin) => + [ + new(Icons.Material.Filled.ArrowRightAlt, + $"{T("Configuration plugin ID:")} {plugin.Id}", + plugin.Id.ToString(), + T("Copies the configuration plugin ID to the clipboard")), + + new(Icons.Material.Filled.ArrowRightAlt, + $"{T("Plugin directory:")} {plugin.LocalPath}", + plugin.LocalPath, + T("Copies the plugin directory to the clipboard"), + "margin-top: 4px;"), + ]; + private string ExternalHttpCustomRootCertificateWarningText { get diff --git a/documentation/Enterprise IT.md b/documentation/Enterprise IT.md index 5a2eb6c5..2375632c 100644 --- a/documentation/Enterprise IT.md +++ b/documentation/Enterprise IT.md @@ -439,6 +439,8 @@ Place the files **while AI Studio is running**: the test directory is emptied wh 3. Place the assistant plugin you want to test in `/plugins/assistants//`. 4. AI Studio watches the plugin directory and picks both up without a restart. The security card of the assistant then states that your organization approved it, exactly as it will after the rollout. +While a test configuration is loaded, the Information page reports it, including the directory it was staged in. After a restart, that same page tells you that a test configuration was removed, so nobody has to wonder where the directory went. + What behaves like the later rollout: - The approvals for assistant plugins are honored.