From b6a174929a348c0fdd279476a17e7303c5df5077 Mon Sep 17 00:00:00 2001 From: krut_ni Date: Tue, 7 Apr 2026 16:53:44 +0200 Subject: [PATCH] encapulated the audit logic into a service to reuse it --- .../AssistantPluginAuditDialog.razor.cs | 19 ++--------- .../Plugins/assistants/README.md | 4 --- .../Assistants/AssistantPluginAuditService.cs | 32 +++++++++++++++++++ .../PluginAssistantSecurityResolver.cs | 2 +- 4 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantPluginAuditService.cs diff --git a/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs b/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs index 882a527c..c8390a96 100644 --- a/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/AssistantPluginAuditDialog.razor.cs @@ -21,7 +21,7 @@ public partial class AssistantPluginAuditDialog : MSGComponentBase private IMudDialogInstance MudDialog { get; set; } = null!; [Inject] - private AssistantAuditAgent AuditAgent { get; init; } = null!; + private AssistantPluginAuditService AssistantPluginAuditService { get; init; } = null!; [Inject] private IDialogService DialogService { get; init; } = null!; @@ -96,22 +96,7 @@ public partial class AssistantPluginAuditDialog : MSGComponentBase try { - var result = await this.AuditAgent.AuditAsync(this.plugin); - this.audit = new PluginAssistantAudit - { - PluginId = this.plugin.Id, - PluginHash = this.plugin.ComputeAuditHash(), - AuditedAtUtc = DateTimeOffset.UtcNow, - AuditProviderId = this.CurrentProvider.Id, - AuditProviderName = this.CurrentProvider == AIStudio.Settings.Provider.NONE - ? string.Empty - : this.CurrentProvider.InstanceName, - Level = AssistantAuditLevelExtensions.Parse(result.Level), - Summary = result.Summary, - Confidence = result.Confidence, - PromptPreview = this.promptPreview, - Findings = result.Findings, - }; + this.audit = await this.AssistantPluginAuditService.RunAuditAsync(this.plugin); } finally { diff --git a/app/MindWork AI Studio/Plugins/assistants/README.md b/app/MindWork AI Studio/Plugins/assistants/README.md index 82c1c2a7..38d15fe7 100644 --- a/app/MindWork AI Studio/Plugins/assistants/README.md +++ b/app/MindWork AI Studio/Plugins/assistants/README.md @@ -1030,10 +1030,6 @@ Use `LAYOUT_ACCORDION` as the outer wrapper and put the actual content into one - [Bitwise Operations Library](https://www.lua.org/manual/5.2/manual.html#6.7) --- -> **Warning:** some common lua functions might not be available in this lua environment. Examples are: -> 1. `tostring()` -> 2. `pairs()`\\`ipairs()` - ### Logging helpers The assistant runtime exposes basic logging helpers to Lua. Use them to debug custom prompt building. diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantPluginAuditService.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantPluginAuditService.cs new file mode 100644 index 00000000..ec60abc2 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/AssistantPluginAuditService.cs @@ -0,0 +1,32 @@ +using AIStudio.Agents.AssistantAudit; + +namespace AIStudio.Tools.PluginSystem.Assistants; + +/// +/// Runs an assistant security audit and maps the agent result to the persisted audit model. +/// +public sealed class AssistantPluginAuditService(AssistantAuditAgent auditAgent) +{ + public async Task RunAuditAsync(PluginAssistants plugin, CancellationToken token = default) + { + var result = await auditAgent.AuditAsync(plugin, token); + var provider = auditAgent.ProviderSettings; + var promptPreview = await plugin.BuildAuditPromptPreviewAsync(token); + + return new PluginAssistantAudit + { + PluginId = plugin.Id, + PluginHash = plugin.ComputeAuditHash(), + AuditedAtUtc = DateTimeOffset.UtcNow, + AuditProviderId = provider.Id, + AuditProviderName = provider == AIStudio.Settings.Provider.NONE + ? string.Empty + : provider.InstanceName, + Level = AssistantAuditLevelExtensions.Parse(result.Level), + Summary = result.Summary, + Confidence = result.Confidence, + PromptPreview = promptPreview, + Findings = result.Findings, + }; + } +} diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantSecurityResolver.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantSecurityResolver.cs index 390e4af2..ac7e7e79 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantSecurityResolver.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantSecurityResolver.cs @@ -73,7 +73,7 @@ public static class PluginAssistantSecurityResolver var auditSettings = settingsManager.ConfigurationData.AssistantPluginAudit; var currentHash = plugin.ComputeAuditHash(); var audit = settingsManager.ConfigurationData.AssistantPluginAudits.FirstOrDefault(x => x.PluginId == plugin.Id); - var hasAudit = audit is not null; + var hasAudit = audit is not null && audit.Level is not AssistantAuditLevel.UNKNOWN; var hashMatches = hasAudit && string.Equals(audit!.PluginHash, currentHash, StringComparison.Ordinal); var hasHashMismatch = hasAudit && !hashMatches; var isBelowMinimum = hashMatches && audit is not null && audit.Level < auditSettings.MinimumLevel;