Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
b9a9f2d
WIP: Working out a data model and an example lua file to turn it into…
nilskruthoff Jul 21, 2025
04c3060
WIP: changed to correct namespaces
nilskruthoff Jul 21, 2025
f5c475f
Added a component factory and refactored Dropdowns; reformat getters
nilskruthoff Jul 21, 2025
cef643c
WIP: Implementing a parser for the lua data structure
nilskruthoff Jul 22, 2025
aba61ff
Merge branch 'refs/heads/main' into 29-add-an-assistant-builder
nilskruthoff Sep 23, 2025
7b60c5f
changing the lua file to become a more generic usage example
nilskruthoff Sep 29, 2025
c12fa64
removing assistant from the PluginCategory enum
nilskruthoff Sep 29, 2025
b42ee50
included the assistant plugin to load during plugin initialization
nilskruthoff Sep 29, 2025
5a6c91f
included valid assistant plugins into the running plugins
nilskruthoff Sep 30, 2025
3d5831f
added a settings dialog for dynamic assistants
nilskruthoff Sep 30, 2025
aa31fa7
included the installed plugin assistants to the assistants page
nilskruthoff Sep 30, 2025
09b187d
started with the rendering of dynamic assistants
nilskruthoff Sep 30, 2025
488747b
included allowProfiles and system prompt properties to the lua parser
nilskruthoff Sep 30, 2025
d37c3f2
fixed dropdown parsing
nilskruthoff Sep 30, 2025
2afc8c6
added DynamicAssistantDropdown to accomodate lua structure; included …
nilskruthoff Nov 10, 2025
5a3e49d
increased functionality for text area by adding optional properties
nilskruthoff Nov 11, 2025
4fd21ad
fixed bug in dropdown that prevented values from changing; finished i…
nilskruthoff Nov 11, 2025
0775b03
added a switch component for boolean user inputs
nilskruthoff Nov 11, 2025
9374b56
updated example plugin.lua for dynamic assistants
nilskruthoff Nov 11, 2025
bc50b37
Added new descriptive heading and text components
nilskruthoff Feb 10, 2026
de1cf65
added a descriptive list component
nilskruthoff Feb 10, 2026
58c0348
added profile selection as a component for the assistant builder; min…
nilskruthoff Feb 23, 2026
6841a35
added a web content reader as a component for the assistant builder
nilskruthoff Feb 23, 2026
4f6bdec
added a file content reader as a component for the assistant builder
nilskruthoff Feb 23, 2026
4819b93
included a README to document the assistant builder to plugin authors
nilskruthoff Feb 23, 2026
93e0fb4
set up handling of asset files from the plugin directory
nilskruthoff Feb 24, 2026
49746a2
added images as a descriptive component for the assistant builder
nilskruthoff Feb 24, 2026
b4702b1
renamed AssistantComponentType.cs because of a typo
nilskruthoff Feb 24, 2026
12881e3
respect dynamic assistant plugins instead of hardcoding GUID
nilskruthoff Feb 24, 2026
003c97f
moved installed assistants into own section on assistant overview page
nilskruthoff Feb 24, 2026
9c07584
translation
nilskruthoff Feb 24, 2026
a58922d
improved and adapted the fallback
nilskruthoff Feb 24, 2026
c541d26
translation
nilskruthoff Feb 24, 2026
a5cbe87
Applied a filter to remove deactivated plugins from rendering
nilskruthoff Feb 24, 2026
024fb58
translated again because of updated keys
nilskruthoff Feb 24, 2026
6ad7aba
added class and style properties to every component
nilskruthoff Feb 24, 2026
9ae3fca
wrapped used internal components without Class and Style properties w…
nilskruthoff Feb 24, 2026
4eb0cc6
added advanced prompt building option by creating a new lua function …
nilskruthoff Mar 2, 2026
cbd74f4
translated new texts
nilskruthoff Mar 2, 2026
8c1ba3a
added helper functions like simple structured logging and date time u…
nilskruthoff Mar 2, 2026
4c92fe8
changed settings dialog to point to the empty dynamic settings dialog
nilskruthoff Mar 3, 2026
379940c
minor improvements (removed unused using directives; make private set…
nilskruthoff Mar 3, 2026
ee94d85
fixed inheritance flaws
nilskruthoff Mar 3, 2026
127b518
merge `main` into `29-add-an-assistant-builder`
nilskruthoff Mar 3, 2026
fc3b46a
documented included lua libs
nilskruthoff Mar 3, 2026
a5149e4
added a new color picker component to the lua parsing
nilskruthoff Mar 9, 2026
96d0b9e
make component dictionaries readonly
nilskruthoff Mar 9, 2026
867890a
generalized getters and setters for ints and bools
nilskruthoff Mar 9, 2026
9dba7f4
overhauled the textarea component to be as feature complete as possible
nilskruthoff Mar 9, 2026
b221d08
added a source generator that maps MudIcons to their svg strings.
nilskruthoff Mar 9, 2026
25eb0cf
overhauled switch component
nilskruthoff Mar 10, 2026
ec357d7
improved doc for switch
nilskruthoff Mar 10, 2026
a32a535
added class and style attrs to switch
nilskruthoff Mar 10, 2026
2ccb72c
buttons now support lua functions as actions, allowing plugin devs to…
nilskruthoff Mar 10, 2026
dbdcdef
Adding a ButtonGroup component to group button children together
nilskruthoff Mar 10, 2026
4f836e2
encapsulated render logic into a function to be able to call it recur…
nilskruthoff Mar 10, 2026
5106800
advanced layout: added MudItem, MudPaper, MudStack and MudGrid as new…
nilskruthoff Mar 10, 2026
edc717c
advanced layout: included the layout option in the rendering and docu…
nilskruthoff Mar 10, 2026
e68a839
improved documentation
nilskruthoff Mar 11, 2026
4a905cf
added a toc to the docs
nilskruthoff Mar 12, 2026
9aa028a
added a table of components as a quick reference
nilskruthoff Mar 12, 2026
a182cc4
improved dropdown component and fixed some bugs with it
nilskruthoff Mar 13, 2026
133be5b
WIP: Multiselection support
nilskruthoff Mar 13, 2026
41126be
fixed final bugs
nilskruthoff Mar 13, 2026
271279a
included a dropdown reference in the documentation
nilskruthoff Mar 13, 2026
5d8fee9
changed access to internal
nilskruthoff Mar 13, 2026
dea9c9e
added accordions as new layout components - resembles MudExpansionPanels
nilskruthoff Mar 13, 2026
d05dd35
removed uneccessary method
nilskruthoff Mar 14, 2026
0d57f18
Button now supports IconButton; Switch supports OnChange hook now
nilskruthoff Mar 16, 2026
5894147
minor fixes
nilskruthoff Mar 16, 2026
c4ec107
WIP: implementing time, date and date range pickers
nilskruthoff Mar 16, 2026
9440f13
added missing properties
nilskruthoff Mar 16, 2026
2117df5
fixed diverse little issues that occured while testing
nilskruthoff Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/MindWork AI Studio.sln
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build Script", "Build\Build
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedTools", "SharedTools\SharedTools.csproj", "{969C74DF-7678-4CD5-B269-D03E1ECA3D2A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceGeneratedMappings", "SourceGeneratedMappings\SourceGeneratedMappings.csproj", "{4D7141D5-9C22-4D85-B748-290D15FF484C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -30,6 +32,10 @@ Global
{969C74DF-7678-4CD5-B269-D03E1ECA3D2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{969C74DF-7678-4CD5-B269-D03E1ECA3D2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{969C74DF-7678-4CD5-B269-D03E1ECA3D2A}.Release|Any CPU.Build.0 = Release|Any CPU
{4D7141D5-9C22-4D85-B748-290D15FF484C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D7141D5-9C22-4D85-B748-290D15FF484C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D7141D5-9C22-4D85-B748-290D15FF484C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D7141D5-9C22-4D85-B748-290D15FF484C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
EndGlobalSection
Expand Down
545 changes: 545 additions & 0 deletions app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor

Large diffs are not rendered by default.

883 changes: 883 additions & 0 deletions app/MindWork AI Studio/Assistants/Dynamic/AssistantDynamic.razor.cs

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions app/MindWork AI Studio/Assistants/Dynamic/FileContentState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace AIStudio.Assistants.Dynamic;

internal sealed class FileContentState
{
public string Content { get; set; } = string.Empty;
}
9 changes: 9 additions & 0 deletions app/MindWork AI Studio/Assistants/Dynamic/WebContentState.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace AIStudio.Assistants.Dynamic;

internal sealed class WebContentState
{
public string Content { get; set; } = string.Empty;
public bool Preselect { get; set; }
public bool PreselectContentCleanerAgent { get; set; }
public bool AgentIsRunning { get; set; }
}
36 changes: 36 additions & 0 deletions app/MindWork AI Studio/Assistants/I18N/allTexts.lua
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,12 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTA
-- Yes, hide the policy definition
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T940701960"] = "Yes, hide the policy definition"

-- No assistant plugin are currently installed.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DYNAMIC::ASSISTANTDYNAMIC::T1913566603"] = "No assistant plugin are currently installed."

-- Please select one of your profiles.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DYNAMIC::ASSISTANTDYNAMIC::T465395981"] = "Please select one of your profiles."

-- Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1143222914"] = "Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input."

Expand Down Expand Up @@ -4927,6 +4933,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2830810750"] = "AI Studio Develop
-- Generate a job posting for a given job description.
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2831103254"] = "Generate a job posting for a given job description."

-- Installed Assistants
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T295232966"] = "Installed Assistants"

-- My Tasks
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3011450657"] = "My Tasks"

Expand Down Expand Up @@ -6067,6 +6076,33 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::PANDOCEXPORT::T3290596792"] = "Error during Mi
-- Microsoft Word export successful
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PANDOCEXPORT::T4256043333"] = "Microsoft Word export successful"

-- Failed to parse the UI render tree from the ASSISTANT lua table.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T1318499252"] = "Failed to parse the UI render tree from the ASSISTANT lua table."

-- The provided ASSISTANT lua table does not contain a valid UI table.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T1841068402"] = "The provided ASSISTANT lua table does not contain a valid UI table."

-- The provided ASSISTANT lua table does not contain a valid description.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T2514141654"] = "The provided ASSISTANT lua table does not contain a valid description."

-- The provided ASSISTANT lua table does not contain a valid title.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T2814605990"] = "The provided ASSISTANT lua table does not contain a valid title."

-- The ASSISTANT lua table does not exist or is not a valid table.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T3017816936"] = "The ASSISTANT lua table does not exist or is not a valid table."

-- The provided ASSISTANT lua table does not contain a valid system prompt.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T3402798667"] = "The provided ASSISTANT lua table does not contain a valid system prompt."

-- The ASSISTANT table does not contain a valid system prompt.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T3723171842"] = "The ASSISTANT table does not contain a valid system prompt."

-- ASSISTANT.BuildPrompt exists but is not a Lua function or has invalid syntax.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T683382975"] = "ASSISTANT.BuildPrompt exists but is not a Lua function or has invalid syntax."

-- The provided ASSISTANT lua table does not contain the boolean flag to control the allowance of profiles.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::ASSISTANTS::PLUGINASSISTANTS::T781921072"] = "The provided ASSISTANT lua table does not contain the boolean flag to control the allowance of profiles."

-- The table AUTHORS does not exist or is using an invalid syntax.
UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1068328139"] = "The table AUTHORS does not exist or is using an invalid syntax."

Expand Down
53 changes: 53 additions & 0 deletions app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
@using AIStudio.Tools.PluginSystem.Assistants.DataModel
<MudStack Row="true" Class='@this.MergeClasses(this.Class, "mb-3")' Style="@this.Style">
@if (this.IsMultiselect)
{
<MudSelect
T="string"
SelectedValues="@this.SelectedValues"
SelectedValuesChanged="@this.OnSelectedValuesChanged"
MultiSelectionTextFunc="@this.GetMultiSelectionText"
Label="@this.Label"
HelperText="@this.HelperText"
Placeholder="@this.Default.Display"
OpenIcon="@this.OpenIcon"
CloseIcon="@this.CloseIcon"
Adornment="@this.IconPosition"
AdornmentColor="@this.IconColor"
Variant="@this.Variant"
Margin="Margin.Normal"
MultiSelection="@true"
SelectAll="@this.HasSelectAll"
SelectAllText="@this.SelectAllText">
@foreach (var item in this.GetRenderedItems())
{
<MudSelectItem Value="@item.Value">
@item.Display
</MudSelectItem>
}
</MudSelect>
}
else
{
<MudSelect
T="string"
Value="@this.Value"
ValueChanged="@(val => this.OnValueChanged(val))"
Label="@this.Label"
HelperText="@this.HelperText"
Placeholder="@this.Default.Display"
OpenIcon="@this.OpenIcon"
CloseIcon="@this.CloseIcon"
Adornment="@this.IconPosition"
AdornmentColor="@this.IconColor"
Variant="@this.Variant"
Margin="Margin.Normal">
@foreach (var item in this.GetRenderedItems())
{
<MudSelectItem Value="@item.Value">
@item.Display
</MudSelectItem>
}
</MudSelect>
}
</MudStack>
116 changes: 116 additions & 0 deletions app/MindWork AI Studio/Components/DynamicAssistantDropdown.razor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AIStudio.Tools.PluginSystem.Assistants.DataModel;
using Microsoft.AspNetCore.Components;
using MudBlazor;

namespace AIStudio.Components
{
public partial class DynamicAssistantDropdown : ComponentBase
{
[Parameter] public List<AssistantDropdownItem> Items { get; set; } = new();

[Parameter] public AssistantDropdownItem Default { get; set; } = new();

[Parameter] public string Value { get; set; } = string.Empty;

[Parameter] public EventCallback<string> ValueChanged { get; set; }

[Parameter] public HashSet<string> SelectedValues { get; set; } = [];

[Parameter] public EventCallback<HashSet<string>> SelectedValuesChanged { get; set; }

[Parameter] public string Label { get; set; } = string.Empty;

[Parameter] public string HelperText { get; set; } = string.Empty;

[Parameter] public Func<string, string?> ValidateSelection { get; set; } = _ => null;

[Parameter] public string OpenIcon { get; set; } = Icons.Material.Filled.ArrowDropDown;

[Parameter] public string CloseIcon { get; set; } = Icons.Material.Filled.ArrowDropUp;

[Parameter] public Color IconColor { get; set; } = Color.Default;

[Parameter] public Adornment IconPosition { get; set; } = Adornment.End;

[Parameter] public Variant Variant { get; set; } = Variant.Outlined;

[Parameter] public bool IsMultiselect { get; set; }

[Parameter] public bool HasSelectAll { get; set; }

[Parameter] public string SelectAllText { get; set; } = string.Empty;

[Parameter] public string Class { get; set; } = string.Empty;

[Parameter] public string Style { get; set; } = string.Empty;

private async Task OnValueChanged(string newValue)
{
if (this.Value != newValue)
{
this.Value = newValue;
await this.ValueChanged.InvokeAsync(newValue);
}
}

private async Task OnSelectedValuesChanged(IEnumerable<string?>? newValues)
{
var updatedValues = newValues?
.Where(value => !string.IsNullOrWhiteSpace(value))
.Select(value => value!)
.ToHashSet(StringComparer.Ordinal) ?? [];

if (this.SelectedValues.SetEquals(updatedValues))
return;

this.SelectedValues = updatedValues;
await this.SelectedValuesChanged.InvokeAsync(updatedValues);
}

private List<AssistantDropdownItem> GetRenderedItems()
{
var items = this.Items ?? [];
if (string.IsNullOrWhiteSpace(this.Default.Value))
return items;

if (items.Any(item => string.Equals(item.Value, this.Default.Value, StringComparison.Ordinal)))
return items;

return [this.Default, .. items];
}

private string GetMultiSelectionText(List<string?>? selectedValues)
{
if (selectedValues is null || selectedValues.Count == 0)
return this.Default.Display;

var labels = selectedValues
.Where(value => !string.IsNullOrWhiteSpace(value))
.Select(value => this.ResolveDisplayText(value!))
.Where(value => !string.IsNullOrWhiteSpace(value))
.ToList();

return labels.Count == 0 ? this.Default.Display : string.Join(", ", labels);
}

private string ResolveDisplayText(string value)
{
var item = this.GetRenderedItems().FirstOrDefault(item => string.Equals(item.Value, value, StringComparison.Ordinal));
return item?.Display ?? value;
}

private string MergeClasses(string custom, string fallback)
{
var trimmedCustom = custom?.Trim() ?? string.Empty;
var trimmedFallback = fallback?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(trimmedCustom))
return trimmedFallback;

return string.IsNullOrEmpty(trimmedFallback) ? trimmedCustom : $"{trimmedCustom} {trimmedFallback}";
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@using AIStudio.Settings
@inherits SettingsDialogBase

<MudDialog>
</MudDialog>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
using Microsoft.AspNetCore.Components;

namespace AIStudio.Dialogs.Settings;

public partial class SettingsDialogDynamic : SettingsDialogBase;
17 changes: 17 additions & 0 deletions app/MindWork AI Studio/MindWork AI Studio.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,23 @@
<ProjectReference Include="..\SourceCodeRules\SourceCodeRules\SourceCodeRules.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
</ItemGroup>

<PropertyGroup>
<SourceGeneratedMappingsProject>..\SourceGeneratedMappings\SourceGeneratedMappings.csproj</SourceGeneratedMappingsProject>
<SourceGeneratedMappingsAssembly>..\SourceGeneratedMappings\bin\$(Configuration)\net9.0\SourceGeneratedMappings.dll</SourceGeneratedMappingsAssembly>
</PropertyGroup>

<Target Name="BuildSourceGeneratedMappings" BeforeTargets="CoreCompile">
<MSBuild Projects="$(SourceGeneratedMappingsProject)" Targets="Restore;Build" Properties="Configuration=$(Configuration);RestoreIgnoreFailedSources=true" />

<ItemGroup>
<Analyzer Include="$(SourceGeneratedMappingsAssembly)" Condition="Exists('$(SourceGeneratedMappingsAssembly)')" />
</ItemGroup>
</Target>

<ItemGroup>
<Folder Include="Plugins\assistants\assets\" />
</ItemGroup>

<!-- Read the meta data file -->
<Target Name="ReadMetaData" BeforeTargets="BeforeBuild">
<Error Text="The ../../metadata.txt file was not found!" Condition="!Exists('../../metadata.txt')" />
Expand Down
20 changes: 20 additions & 0 deletions app/MindWork AI Studio/Pages/Assistants.razor
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
@using AIStudio.Dialogs.Settings
@using AIStudio.Settings.DataModel
@using AIStudio.Tools.PluginSystem
@using AIStudio.Tools.PluginSystem.Assistants
@using ReverseMarkdown.Converters
@attribute [Route(Routes.ASSISTANTS)]
@inherits MSGComponentBase

Expand Down Expand Up @@ -30,6 +33,23 @@
</MudStack>
}

@if (this.AssistantPlugins.Count > 0)
{
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
@T("Installed Assistants")
</MudText>
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
@foreach (var assistantPlugin in this.AssistantPlugins)
{
<AssistantBlock TSettings="SettingsDialogDynamic"
Name="@T(assistantPlugin.AssistantTitle)"
Description="@T(assistantPlugin.Description)"
Icon="@Icons.Material.Filled.FindInPage"
Link="@($"{Routes.ASSISTANT_DYNAMIC}?assistantId={assistantPlugin.Id}")"/>
}
</MudStack>
}

@if (this.SettingsManager.IsAnyCategoryAssistantVisible("Business",
(Components.EMAIL_ASSISTANT, PreviewFeatures.NONE),
(Components.DOCUMENT_ANALYSIS_ASSISTANT, PreviewFeatures.PRE_DOCUMENT_ANALYSIS_2025),
Expand Down
12 changes: 11 additions & 1 deletion app/MindWork AI Studio/Pages/Assistants.razor.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
using AIStudio.Components;
using AIStudio.Tools.PluginSystem;
using AIStudio.Tools.PluginSystem.Assistants;
using System.Collections.Generic;
using System.Linq;

namespace AIStudio.Pages;

public partial class Assistants : MSGComponentBase;
public partial class Assistants : MSGComponentBase
{
private IReadOnlyCollection<PluginAssistants> AssistantPlugins =>
PluginFactory.RunningPlugins.OfType<PluginAssistants>()
.Where(plugin => this.SettingsManager.IsPluginEnabled(plugin))
.ToList();
}
Loading