@attribute [Route(Routes.ASSISTANT_DYNAMIC)] @using AIStudio.Agents.AssistantAudit @using AIStudio.Tools.PluginSystem.Assistants.DataModel @using AIStudio.Tools.PluginSystem.Assistants.DataModel.Layout @inherits AssistantBaseCore @if (!string.IsNullOrWhiteSpace(this.securityMessage)) { @this.securityMessage @if (this.assistantPlugin is not null) {
}
} else if (this.RootComponent is null) { @this.T("No assistant plugin are currently installed.") } else { @if (this.audit is not null && this.audit.Level is not AssistantAuditLevel.SAFE) { @this.audit.Level.GetName().ToUpperInvariant(): @this.audit.Summary } @* The plugin names the tools, so there is nothing for the user to switch on or off. What is left is to say which tools run here, and to warn when the selected provider keeps one of them out of reach. *@ @if (this.assistantToolIds is { Count: > 0 } toolIds && this.SettingsManager.AreToolsEnabled()) { } @foreach (var component in this.RootComponent.Children) { @this.RenderComponent(component) } } @code { private protected override RenderFragment? HeaderActions => this.CanReviseCurrentAssistant ? @ : null; private RenderFragment RenderSwitch(AssistantSwitch assistantSwitch) => @ @(this.assistantState.Booleans[assistantSwitch.Name] ? assistantSwitch.LabelOn : assistantSwitch.LabelOff) ; } @code {private RenderFragment RenderChildren(IEnumerable children) => @ @foreach (var child in children) { @this.RenderComponent(child) } ; private RenderFragment RenderComponent(IAssistantComponent component) => @ @switch (component.Type) { case AssistantComponentType.TEXT_AREA: if (component is AssistantTextArea textArea) { var lines = textArea.IsSingleLine ? 1 : 6; var autoGrow = !textArea.IsSingleLine; } break; case AssistantComponentType.IMAGE: if (component is AssistantImage assistantImage) { var resolvedSource = this.ResolveImageSource(assistantImage); if (!string.IsNullOrWhiteSpace(resolvedSource)) { var image = assistantImage;
@if (!string.IsNullOrWhiteSpace(image.Caption)) { @image.Caption }
} } break; case AssistantComponentType.WEB_CONTENT_READER: if (component is AssistantWebContentReader webContent) { var webState = this.assistantState.WebContent[webContent.Name];
} break; case AssistantComponentType.FILE_CONTENT_READER: if (component is AssistantFileContentReader fileContent) { var fileState = this.assistantState.FileContent[fileContent.Name];
} break; case AssistantComponentType.FILE_ATTACHMENTS: if (component is AssistantFileAttachment fileAttachment) { var fileState = this.assistantState.FileAttachments[fileAttachment.Name];
@if (!string.IsNullOrWhiteSpace(fileAttachment.Heading)) { @fileAttachment.Heading }
} break; case AssistantComponentType.DROPDOWN: if (component is AssistantDropdown assistantDropdown) { if (assistantDropdown.IsMultiselect) { } else { } } break; case AssistantComponentType.BUTTON: if (component is AssistantButton assistantButton) { var button = assistantButton; var icon = AssistantComponentPropHelper.GetIconSvg(button.StartIcon); var iconColor = AssistantComponentPropHelper.GetColor(button.IconColor, Color.Inherit); var color = AssistantComponentPropHelper.GetColor(button.Color, Color.Default); var size = AssistantComponentPropHelper.GetComponentSize(button.Size, Size.Medium); var iconSize = AssistantComponentPropHelper.GetComponentSize(button.IconSize, Size.Medium); var variant = button.GetButtonVariant(); var disabled = this.IsButtonActionRunning(button.Name); var buttonClass = MergeClass(button.Class, ""); var style = GetOptionalStyle(button.Style); if (!button.IsIconButton) { @button.Text } else { } } break; case AssistantComponentType.BUTTON_GROUP: if (component is AssistantButtonGroup assistantButtonGroup) { var buttonGroup = assistantButtonGroup; @this.RenderChildren(buttonGroup.Children) } break; case AssistantComponentType.LAYOUT_GRID: if (component is AssistantGrid assistantGrid) { var grid = assistantGrid; @this.RenderChildren(grid.Children) } break; case AssistantComponentType.LAYOUT_ITEM: if (component is AssistantItem assistantItem) { @this.RenderLayoutItem(assistantItem) } break; case AssistantComponentType.LAYOUT_PAPER: if (component is AssistantPaper assistantPaper) { var paper = assistantPaper; @this.RenderChildren(paper.Children) } break; case AssistantComponentType.LAYOUT_STACK: if (component is AssistantStack assistantStack) { var stack = assistantStack; @this.RenderChildren(stack.Children) } break; case AssistantComponentType.LAYOUT_ACCORDION: if (component is AssistantAccordion assistantAccordion) { var accordion = assistantAccordion; @this.RenderChildren(accordion.Children) } break; case AssistantComponentType.LAYOUT_ACCORDION_SECTION: if (component is AssistantAccordionSection assistantAccordionSection) { var accordionSection = assistantAccordionSection; var textColor = accordionSection.IsDisabled ? Color.Info : AssistantComponentPropHelper.GetColor(accordionSection.HeaderColor, Color.Inherit);
@accordionSection.HeaderText
@this.RenderChildren(accordionSection.Children)
} break; case AssistantComponentType.PROVIDER_SELECTION: if (component is AssistantProviderSelection providerSelection) {
} break; case AssistantComponentType.PROFILE_SELECTION: if (component is AssistantProfileSelection profileSelection) { var selection = profileSelection;
} break; case AssistantComponentType.SWITCH: if (component is AssistantSwitch switchComponent) { var assistantSwitch = switchComponent; if (string.IsNullOrEmpty(assistantSwitch.Label)) { @this.RenderSwitch(assistantSwitch) } else { @this.RenderSwitch(assistantSwitch) } } break; case AssistantComponentType.HEADING: if (component is AssistantHeading assistantHeading) { var heading = assistantHeading; var typo = heading.Level switch { 1 => Typo.h4, 2 => Typo.h5, 3 => Typo.h6, _ => Typo.h5 }; @heading.Text } break; case AssistantComponentType.TEXT: if (component is AssistantText assistantText) { var text = assistantText; @text.Content } break; case AssistantComponentType.LIST: if (component is AssistantList assistantList) { var list = assistantList; @foreach (var item in list.Items) { var iconColor = AssistantComponentPropHelper.GetColor(item.IconColor, Color.Default); @if (item.Type == "LINK") { @item.Text } else { var icon = !string.IsNullOrEmpty(item.Icon) ? AssistantComponentPropHelper.GetIconSvg(item.Icon) : string.Empty; @item.Text } } } break; case AssistantComponentType.COLOR_PICKER: if (component is AssistantColorPicker assistantColorPicker) { var colorPicker = assistantColorPicker; var variant = colorPicker.GetPickerVariant(); var rounded = variant == PickerVariant.Static; } break; case AssistantComponentType.DATE_PICKER: if (component is AssistantDatePicker assistantDatePicker) { var datePicker = assistantDatePicker; var format = datePicker.GetDateFormat(); } break; case AssistantComponentType.DATE_RANGE_PICKER: if (component is AssistantDateRangePicker assistantDateRangePicker) { var dateRangePicker = assistantDateRangePicker; var format = dateRangePicker.GetDateFormat(); @* ReSharper disable CSharpWarnings::CS8619 *@ @* ReSharper restore CSharpWarnings::CS8619 *@ } break; case AssistantComponentType.TIME_PICKER: if (component is AssistantTimePicker assistantTimePicker) { var timePicker = assistantTimePicker; var format = timePicker.GetTimeFormat(); } break; }
; private string? BuildPaperStyle(AssistantPaper paper) { List styles = []; this.AddStyle(styles, "height", paper.Height); this.AddStyle(styles, "max-height", paper.MaxHeight); this.AddStyle(styles, "min-height", paper.MinHeight); this.AddStyle(styles, "width", paper.Width); this.AddStyle(styles, "max-width", paper.MaxWidth); this.AddStyle(styles, "min-width", paper.MinWidth); var customStyle = paper.Style; if (!string.IsNullOrWhiteSpace(customStyle)) styles.Add(customStyle.Trim().TrimEnd(';')); return styles.Count == 0 ? null : string.Join("; ", styles); } private RenderFragment RenderLayoutItem(AssistantItem item) => builder => { builder.OpenComponent(0); if (item.Xs.HasValue) builder.AddAttribute(1, "xs", item.Xs.Value); if (item.Sm.HasValue) builder.AddAttribute(2, "sm", item.Sm.Value); if (item.Md.HasValue) builder.AddAttribute(3, "md", item.Md.Value); if (item.Lg.HasValue) builder.AddAttribute(4, "lg", item.Lg.Value); if (item.Xl.HasValue) builder.AddAttribute(5, "xl", item.Xl.Value); if (item.Xxl.HasValue) builder.AddAttribute(6, "xxl", item.Xxl.Value); var itemClass = item.Class; if (!string.IsNullOrWhiteSpace(itemClass)) builder.AddAttribute(7, nameof(MudItem.Class), itemClass); var itemStyle = GetOptionalStyle(item.Style); if (!string.IsNullOrWhiteSpace(itemStyle)) builder.AddAttribute(8, nameof(MudItem.Style), itemStyle); builder.AddAttribute(9, nameof(MudItem.ChildContent), this.RenderChildren(item.Children)); builder.CloseComponent(); }; private void AddStyle(List styles, string key, string value) { if (!string.IsNullOrWhiteSpace(value)) styles.Add($"{key}: {value.Trim().TrimEnd(';')}"); } }