From 28e30b024ea00d485d68d1c2dac31691e9079593 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sat, 20 Jun 2026 18:58:36 +0200 Subject: [PATCH] Added support for live plugin content via ILivePluginContent --- AGENTS.md | 16 ++++++++++------ .../Settings/DataModel/DataIntroduction.cs | 4 +++- .../Settings/DataModel/DataMandatoryInfo.cs | 4 +++- .../Tools/PluginSystem/ILivePluginContent.cs | 18 ++++++++++++++++++ .../Tools/PluginSystem/PluginConfiguration.cs | 2 ++ 5 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/PluginSystem/ILivePluginContent.cs diff --git a/AGENTS.md b/AGENTS.md index e0859dae..d559c62e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -112,12 +112,16 @@ Plugins can configure: - Chat templates - etc. -When adding configuration options, update: -- `app/MindWork AI Studio/Tools/PluginSystem/PluginConfiguration.cs`: In method `TryProcessConfiguration` register new options. -- `app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Loading.cs`: In method `LoadAll` check for leftover configuration. -- The corresponding data class in `app/MindWork AI Studio/Settings/DataModel/` to call `ManagedConfiguration.Register(...)`, when adding config options (in contrast to complex config. objects) -- `app/MindWork AI Studio/Tools/PluginSystem/PluginConfigurationObject.cs` for parsing logic of complex configuration objects. -- `app/MindWork AI Studio/Plugins/configuration/plugin.lua` to document the new configuration option. +Configuration plugins provide three kinds of values: +- **Managed settings:** simple values such as booleans, numbers, strings, enums, lists, or sets handled through `ManagedConfiguration`. These values may be locked or used as organization defaults. +- **Managed configuration objects:** complex Lua tables that are persisted into `SettingsManager.ConfigurationData`, implement `IConfigurationObject`, and are cleaned up through `PluginConfigurationObject.CleanLeftOverConfigurationObjects(...)`. Examples include providers, profiles, chat templates, data sources, and document analysis policies. +- **Live plugin content:** complex Lua tables that implement `ILivePluginContent` and are read live from running plugins instead of being persisted to `ConfigurationData`. Examples include `MANDATORY_INFOS` and `INTRODUCTIONS`. If live plugin content creates persistent side data, add a dedicated cleanup path for that side data, like mandatory-info acceptances. + +When adding configuration plugin capabilities: +- For managed settings, update the corresponding data class in `app/MindWork AI Studio/Settings/DataModel/` to call `ManagedConfiguration.Register(...)`, process the setting in `PluginConfiguration.TryProcessConfiguration`, and check for leftover managed configuration in `PluginFactory.Loading.LoadAll`. +- For managed configuration objects, update `PluginConfigurationObject.cs` and `PluginConfigurationObjectType.cs`, persist them in the appropriate `ConfigurationData` collection, and add cleanup via `PluginConfigurationObject.CleanLeftOverConfigurationObjects(...)`. +- For live plugin content, add a data type implementing `ILivePluginContent`, parse it in `PluginConfiguration`, expose it through `PluginFactory`, and add any required cleanup only for persistent side data. +- Always document the new capability in `app/MindWork AI Studio/Plugins/configuration/plugin.lua`. ## RAG (Retrieval-Augmented Generation) diff --git a/app/MindWork AI Studio/Settings/DataModel/DataIntroduction.cs b/app/MindWork AI Studio/Settings/DataModel/DataIntroduction.cs index 1b09baef..22a6d4ab 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataIntroduction.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataIntroduction.cs @@ -1,8 +1,10 @@ +using AIStudio.Tools.PluginSystem; + using Lua; namespace AIStudio.Settings.DataModel; -public sealed record DataIntroduction +public sealed record DataIntroduction : ILivePluginContent { private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(); diff --git a/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfo.cs b/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfo.cs index 638ba6d8..d588332f 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfo.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfo.cs @@ -1,11 +1,13 @@ using System.Security.Cryptography; using System.Text; +using AIStudio.Tools.PluginSystem; + using Lua; namespace AIStudio.Settings.DataModel; -public sealed record DataMandatoryInfo +public sealed record DataMandatoryInfo : ILivePluginContent { private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(); diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ILivePluginContent.cs b/app/MindWork AI Studio/Tools/PluginSystem/ILivePluginContent.cs new file mode 100644 index 00000000..4ad5a261 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/ILivePluginContent.cs @@ -0,0 +1,18 @@ +namespace AIStudio.Tools.PluginSystem; + +/// +/// Represents complex content from a configuration plugin that is read live from +/// running plugins and is not persisted to the settings data model. +/// +public interface ILivePluginContent +{ + /// + /// The stable ID of the live plugin content. + /// + public string Id { get; } + + /// + /// The ID of the enterprise configuration plugin that provides this content. + /// + public Guid EnterpriseConfigurationPluginId { get; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginConfiguration.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginConfiguration.cs index 95996415..e2735273 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginConfiguration.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginConfiguration.cs @@ -23,11 +23,13 @@ public sealed class PluginConfiguration(bool isInternal, LuaState state, PluginT /// /// The list of mandatory infos provided by this configuration plugin. + /// Mandatory infos are live plugin content and are not persisted to ConfigurationData. /// public IReadOnlyList MandatoryInfos => this.mandatoryInfos; /// /// The list of introductions provided by this configuration plugin. + /// Introductions are live plugin content and are not persisted to ConfigurationData. /// public IReadOnlyList Introductions => this.introductions;