using AIStudio.Assistants.BeyondFactsLab; using AIStudio.Provider; using AIStudio.Settings; using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Rust; using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs.Settings; /// /// Provides the code-behind type for the settings of the BeyondFacts Lab. /// public partial class SettingsDialogBeyondFactsLab : SettingsDialogBase { [Inject] private BeyondFactsLabStore Store { get; init; } = null!; [Inject] private ILogger Logger { get; init; } = null!; /// /// Whether the language of the app tells a formal address from an informal one, so that the form of address /// is a choice at all. /// private bool offersFormOfAddress; /// /// Whether the settings for the further development of the lab are unfolded. /// private bool showExpertSettings; /// /// Whether the prompts are being copied into the test folder right now. /// private bool isCopyingPrompts; /// /// Gets whether an organization manages the prompt overrides. /// private static bool IsPromptOverridesLocked => ManagedConfiguration.TryGet(x => x.BeyondFactsLab, x => x.AllowPromptOverrides, out var meta) && meta.IsLocked; /// /// Gets whether an organization switched the prompt overrides off for good, so that the test folder serves no /// purpose. /// private bool ArePromptOverridesLockedOff => IsPromptOverridesLocked && !this.SettingsManager.ConfigurationData.BeyondFactsLab.AllowPromptOverrides; /// protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); this.offersFormOfAddress = (await this.SettingsManager.GetActiveLanguagePlugin()).HasInformalAddress(); } /// /// Shows the minimum confidence which applies, never one below the floor of the lab. /// /// /// A value below the floor, e.g., from a configuration plugin, has no effect, and the list does not /// offer it either. Showing the floor instead tells what really counts. /// private ConfidenceLevel SelectedMinimumConfidence() => Tools.Components.BEYOND_FACTS_LAB_ASSISTANT.MinimumConfidence(this.SettingsManager); private void ToggleExpertSettings() => this.showExpertSettings = !this.showExpertSettings; /// /// Opens the test folder in the file manager, and creates it first when it is missing. /// private async Task OpenTestFolderAsync() { OpenPathResponse response; try { var directory = this.Store.PromptOverridesDirectory; Directory.CreateDirectory(directory); response = await this.RustService.TryOpenPathInRuntimeFileManager(directory); } catch (Exception exception) { this.Logger.LogWarning(exception, "Could not open the test folder of the BeyondFacts Lab."); await this.MessageBus.SendError(new(Icons.Material.Filled.FolderOpen, T("Could not open the test folder."))); return; } if (response.Success) return; var issue = string.IsNullOrWhiteSpace(response.Issue) ? T("Unknown error") : response.Issue; await this.MessageBus.SendError(new(Icons.Material.Filled.FolderOpen, string.Format(T("Could not open the test folder: {0}"), issue))); } /// /// Copies the prompts of this version into the test folder, so that changes start from them. A file which exists /// stays as it is. /// private async Task CopyPromptsAsync() { this.isCopyingPrompts = true; try { var copied = await BflPromptOverrides.CopyBuiltInAsync(this.Store.PromptOverridesDirectory); await this.MessageBus.SendSuccess(new(Icons.Material.Filled.ContentCopy, copied is 0 ? T("The test folder holds every prompt already. AI Studio changed no file.") : string.Format(T("Files copied into the test folder: {0}. Files which were there already stay as they are."), copied))); } catch (Exception exception) when (exception is IOException or UnauthorizedAccessException) { this.Logger.LogWarning(exception, "Could not copy the prompts of the BeyondFacts Lab into the test folder."); await this.MessageBus.SendError(new(Icons.Material.Filled.ContentCopy, T("Could not copy the prompts into the test folder."))); } finally { this.isCopyingPrompts = false; } } }