require("icon")

--[[
  This sample assistant shows how plugin authors map Lua tables into UI components.
  Each component declares a `UserPrompt` which is prepended as a `context` block, followed
  by the actual component value in `user prompt`. See
  `app/MindWork AI Studio/Plugins/assistants/README.md` for the full data-model reference.
]]

-- The ID for this plugin:
ID = "00000000-0000-0000-0000-000000000000"

-- The icon for the plugin:
ICON_SVG = SVG

-- The name of the plugin:
NAME = "<Company Name> - Configuration for <Department Name>"

-- The description of the plugin:
DESCRIPTION = "This is a pre-defined configuration of <Company Name>"

-- The version of the plugin:
VERSION = "1.0.0"

-- The type of the plugin:
TYPE = "ASSISTANT"

-- The authors of the plugin:
AUTHORS = {"<Company Name>"}

-- The support contact for the plugin:
SUPPORT_CONTACT = "<IT Department of Company Name>"

-- The source URL for the plugin:
SOURCE_URL = "<Any internal Git repository>"

-- The categories for the plugin:
CATEGORIES = { "CORE" }

-- The target groups for the plugin:
TARGET_GROUPS = { "EVERYONE" }

-- The flag for whether the plugin is maintained:
IS_MAINTAINED = true

-- When the plugin is deprecated, this message will be shown to users:
DEPRECATION_MESSAGE = ""

-- Enterprise-managed assistants cannot be revised with AI. Keep false for locally managed plugins:
DEPLOYED_USING_CONFIG_SERVER = false

-- Reserved for assistants created by the AI Studio Assistant Builder. Generated assistants use this
-- metadata so AI Studio can identify them and offer Builder-specific actions such as safe deletion.
-- Manually authored or enterprise-distributed assistants must not set this metadata:
-- AI_STUDIO_ASSISTANT_BUILDER = {Generated = true, SchemaVersion = 1}

ASSISTANT = {
    ["Title"] = "<Title of your assistant>",
    ["Description"] = "<Description presented to the users, explaining your assistant>",
    ["UI"] = {
        ["Type"] = "FORM",
        ["Children"] = {}
    },
}

-- usage example with the full feature set:
ASSISTANT = {
    ["Title"] = "<main title of assistant>", -- required
    ["Description"] = "<assistant description>", -- required
    ["SystemPrompt"] = "<prompt that fundamentally changes behaviour, personality and task focus of your assistant. Invisible to the user>", -- required
    ["SubmitText"] = "<label for submit button>", -- required
    ["AllowProfiles"] = true, -- if true, allows AiStudios profiles; required
    ["LaunchBehavior"] = "<NONE|OPEN_WORKSPACE_CHAT_BY_NAME>", -- optional; when set to OPEN_WORKSPACE_CHAT_BY_NAME the tile opens a chat directly
    ["WorkspaceName"] = "<name of the workspace to open or create>", -- optional; required for OPEN_WORKSPACE_CHAT_BY_NAME
    ["UI"] = {
        ["Type"] = "FORM",
        ["Children"] = {
            {
                ["Type"] = "TEXT_AREA", -- required
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["Label"] = "<heading of your component>", -- required
                    ["Adornment"] = "<Start|End|None>", --  location of the `AdornmentIcon` OR `AdornmentText`; CASE SENSITIVE
                    ["AdornmentIcon"] = "Icons.Material.Filled.AppSettingsAlt", -- The Mudblazor icon displayed for the adornment
                    ["AdornmentText"] = "", -- The text displayed for the adornment
                    ["AdornmentColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>", -- the color of AdornmentText or AdornmentIcon; CASE SENSITIVE
                    ["Counter"] = 0, -- shows a character counter. When 0, the current character count is displayed. When 1 or greater, the character count and this count are displayed. Defaults to `null` 
                    ["MaxLength"] = 100, -- max number of characters allowed, prevents more input characters; use together with the character counter. Defaults to 524,288
                    ["HelperText"] = "<a helping text rendered under the text area to give hints to users>",
                    ["IsImmediate"] = false, -- changes the value as soon as input is received. Defaults to false but will be true if counter or maxlength is set to reflect changes
                    ["HelperTextOnFocus"] = true, -- if true, shows the helping text only when the user focuses on the text area
                    ["UserPrompt"] = "<direct input of instructions, questions, or tasks by a user>",
                    ["PrefillText"] = "<text to show in the field initially>",
                    ["IsSingleLine"] = false, -- if true, shows a text field instead of an area
                    ["ReadOnly"] = false, -- if true, deactivates user input (make sure to provide a PrefillText)
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "DROPDOWN", -- required
                ["Props"] = {
                    ["Name"] = "<unique identifier of component>", -- required
                    ["Label"] = "<heading of component>", -- required
                    ["UserPrompt"] = "<direct input of instructions, questions, or tasks by a user>",
                    ["IsMultiselect"] = false,
                    ["HasSelectAll"] = false,
                    ["SelectAllText"] = "<label for 'SelectAll'-Button",
                    ["HelperText"] = "<helping text rendered under the component>",
                    ["OpenIcon"] = "Icons.Material.Filled.ArrowDropDown",
                    ["OpenClose"] = "Icons.Material.Filled.ArrowDropUp",
                    ["IconColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>",
                    ["IconPositon"] = "<Start|End>",
                    ["Variant"] = "<Text|Filled|Outlined>",
                    ["ValueType"] = "<string|int|bool>", -- required
                    ["Default"] = { ["Value"] = "<internal data>", ["Display"] = "<user readable representation>" }, -- required
                    ["Items"] = {
                        { ["Value"] = "<internal data>", ["Display"] = "<user readable representation>" },
                        { ["Value"] = "<internal data>", ["Display"] = "<user readable representation>" },
                    } -- required
                }
            },
            {
                ["Type"] = "SWITCH",
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["Label"] = "<heading of your component>", -- Switches render mode between boxed switch and normal switch
                    ["Value"] = true, -- initial switch state
                    ["OnChanged"] = function(input) -- optional; same input and return contract as BUTTON.Action(input)
                        return nil
                    end,
                    ["Disabled"] = false, -- if true, disables user interaction but the value can still be used in the user prompt (use for presentation purposes)
                    ["UserPrompt"] = "<direct input of instructions, questions, or tasks by a user>",
                    ["LabelOn"] = "<text if state is true>",
                    ["LabelOff"] = "<text if state is false>",
                    ["LabelPlacement"] = "<Bottom|End|Left|Right|Start|Top>", -- Defaults to End (right of the switch)
                    ["Icon"] = "Icons.Material.Filled.Bolt", -- places a thumb icon inside the switch
                    ["IconColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>", -- color of the thumb icon. Defaults to `Inherit`
                    ["CheckedColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>", -- color of the switch if state is true. Defaults to `Inherit`
                    ["UncheckedColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>", -- color of the switch if state is false. Defaults to `Inherit`
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "BUTTON",
                ["Props"] = {
                    ["Name"] = "buildEmailOutput",
                    ["Text"] = "Build email output", -- keep this even for icon-only buttons so the manifest stays readable
                    ["IsIconButton"] = false, -- when true, renders an icon-only action button using StartIcon
                    ["Size"] = "<Small|Medium|Large>", -- size of the button. Defaults to Medium
                    ["Variant"] = "<Filled|Outlined|Text>", -- display variation to use. Defaults to Text
                    ["Color"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>", -- color of the button. Defaults to Default
                    ["IsFullWidth"] = false, -- ignores sizing and renders a long full width button. Defaults to false
                    ["StartIcon"] = "Icons.Material.Filled.ArrowRight", -- icon displayed before the text, or the main icon for icon-only buttons. Defaults to null
                    ["EndIcon"] = "Icons.Material.Filled.ArrowLeft", -- icon displayed after the text. Defaults to null
                    ["IconColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>", -- color of start and end icons on text buttons. Defaults to Inherit
                    ["IconSize"] = "<Small|Medium|Large>", -- size of icons. Defaults to null. When null, the value of ["Size"] is used
                    ["Action"] = function(input)
                        local email = input.emailContent and input.emailContent.Value or ""
                        local translate = input.translateEmail and input.translateEmail.Value or false
                        local output = email

                        if translate then
                            output = output .. "\n\nTranslate this email."
                        end

                        return {
                            state = {
                                outputBuffer = {
                                    Value = output
                                }
                            }
                        }
                    end,
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "BUTTON_GROUP",
                ["Props"] = {
                    ["Name"] = "buttonGroup",
                    ["Variant"] = "<Filled|Outlined|Text>", -- display variation of the group. Defaults to Filled
                    ["Color"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>", -- color of the group. Defaults to Default
                    ["Size"] = "<Small|Medium|Large>", -- size of the group. Defaults to Medium
                    ["OverrideStyles"] = false, -- allows MudBlazor group style overrides. Defaults to false
                    ["Vertical"] = false, -- renders buttons vertically instead of horizontally. Defaults to false
                    ["DropShadow"] = true, -- applies a group shadow. Defaults to true
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                },
                ["Children"] = {
                    -- BUTTON_ELEMENTS
                }
            },
            {
                ["Type"] = "LAYOUT_STACK",
                ["Props"] = {
                    ["Name"] = "exampleStack",
                    ["IsRow"] = true,
                    ["Align"] = "Center",
                    ["Justify"] = "SpaceBetween",
                    ["Wrap"] = "Wrap",
                    ["Spacing"] = 2,
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                },
                ["Children"] = {
                    -- CHILDREN
                }
            },
            {
                ["Type"] = "LAYOUT_ACCORDION",
                ["Props"] = {
                    ["Name"] = "exampleAccordion",
                    ["AllowMultiSelection"] = false, -- if true, multiple sections can stay open at the same time
                    ["IsDense"] = false, -- denser layout with less spacing
                    ["HasOutline"] = false, -- outlined accordion panels
                    ["IsSquare"] = false, -- removes rounded corners
                    ["Elevation"] = 0, -- shadow depth of the accordion container
                    ["HasSectionPaddings"] = true, -- controls section gutters / inner frame paddings
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                },
                ["Children"] = {
                    -- LAYOUT_ACCORDION_SECTION elements
                }
            },
            {
                ["Type"] = "LAYOUT_ACCORDION_SECTION",
                ["Props"] = {
                    ["Name"] = "exampleAccordionSection", -- required
                    ["HeaderText"] = "<section title shown in the accordion header>", -- required
                    ["IsDisabled"] = false, -- disables expanding/collapsing and interaction
                    ["IsExpanded"] = false, -- initial expansion state
                    ["IsDense"] = false, -- denser panel layout
                    ["HasInnerPadding"] = true, -- controls padding around the section content
                    ["HideIcon"] = false, -- hides the expand/collapse icon
                    ["HeaderIcon"] = "Icons.Material.Filled.ExpandMore", -- icon shown before the header text
                    ["HeaderColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>",
                    ["HeaderTypo"] = "<body1|subtitle1|h6|...>", -- MudBlazor typo value used for the header
                    ["HeaderAlign"] = "<Start|Center|End|Justify>", -- header text alignment
                    ["MaxHeight"] = 320, -- nullable integer pixel height for the expanded content area
                    ["ExpandIcon"] = "Icons.Material.Filled.ExpandMore", -- override the expand/collapse icon
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                },
                ["Children"] = {
                    -- CHILDREN
                }
            },
            {
                ["Type"] = "LAYOUT_PAPER",
                ["Props"] = {
                    ["Name"] = "examplePaper",
                    ["Elevation"] = 2,
                    ["Width"] = "100%",
                    ["Class"] = "pa-4 mb-3",
                    ["Style"] = "<optional css styles>",
                },
                ["Children"] = {
                    -- CHILDREN
                }
            },
            {
                ["Type"] = "LAYOUT_GRID",
                ["Props"] = {
                    ["Name"] = "exampleGrid",
                    ["Justify"] = "FlexStart",
                    ["Spacing"] = 2,
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                },
                ["Children"] = {
                    -- CHILDREN
                }
            },
            {
                ["Type"] = "PROVIDER_SELECTION", -- required
                ["Props"] = {
                    ["Name"] = "Provider",
                    ["Label"] = "Choose LLM"
                }
            },
            -- If you add a PROFILE_SELECTION component, AI Studio will hide the footer selection and use this block instead:
            {
                ["Type"] = "PROFILE_SELECTION",
                ["Props"] = {
                    ["ValidationMessage"] = "<warning message that is shown when the user has not picked a profile>"
                }
            },
            {
                ["Type"] = "HEADING", -- descriptive component for headings 
                ["Props"] = {
                    ["Text"] = "<heading content>", -- required
                    ["Level"] = 2 -- Heading level, 1 - 3
                }
            },
            {
                ["Type"] = "TEXT", -- descriptive component for normal text
                ["Props"] = {
                    ["Content"] = "<text content>"
                }
            },
            {
                ["Type"] = "LIST", -- descriptive list component
                ["Props"] = {
                    ["Items"] = {
                        { 
                            ["Type"] = "LINK", -- required 
                            ["Text"] = "<user readable link text>", 
                            ["Href"] = "<link>", -- required
                            ["IconColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>",
                        },
                        { 
                            ["Type"] = "TEXT", -- required 
                            ["Text"] = "<user readable text>",
                            ["Icon"] = "Icons.Material.Filled.HorizontalRule",
                            ["IconColor"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>",
                        }
                    },
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "IMAGE",
                ["Props"] = {
                    ["Src"] = "plugin://assets/example.png",
                    ["Alt"] = "SVG-inspired placeholder",
                    ["Caption"] = "Static illustration via the IMAGE component."
                }
            },
            {
                ["Type"] = "WEB_CONTENT_READER", -- allows the user to fetch a URL and clean it
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["UserPrompt"] = "<help text that explains the purpose of this reader>",
                    ["Preselect"] = false, -- automatically show the reader when the assistant opens
                    ["PreselectContentCleanerAgent"] = true -- run the content cleaner by default
                }
            },
            {
                ["Type"] = "FILE_CONTENT_READER", -- allows the user to load one expected local file and inject its content into the prompt
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["UserPrompt"] = "<prompt context for the selected file>",
                    ["ShowAttachedDocumentState"] = true, -- whether to show the loaded-document indicator; defaults to true
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "FILE_ATTACHMENTS", -- allows the user to attach multiple local documents or images as context
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["Heading"] = "<component heading>",
                    ["CatchAllDocuments"] = true, -- whether the component catches all documents that are hovered over the AI Studio window and not only over the drop zone
                    ["UseSmallForm"] = false, -- whether the component should be rendered compact; keep false by default unless compact layout is explicitly needed
                    ["UserPrompt"] = "<prompt context for the selected file(s)>",
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "COLOR_PICKER",
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["Label"] = "<heading of your component>", -- required
                    ["Placeholder"] = "<use this as a default color property with HEX code (e.g '#FFFF12') or just show hints to the user>",
                    ["ShowAlpha"] = true, -- weather alpha channels are shown
                    ["ShowToolbar"] = true, -- weather the toolbar to toggle between picker, grid or palette is shown
                    ["ShowModeSwitch"] = true, -- weather switch to toggle between RGB(A), HEX or HSL color mode is shown
                    ["PickerVariant"] = "<Dialog|Inline|Static>", -- different rendering modes: `Dialog` opens the picker in a modal type screen, `Inline` shows the picker next to the input field and `Static` renders the picker widget directly (default); Case sensitiv
                    ["UserPrompt"] = "<prompt context for the selected color>",
                }
            },
            {
                ["Type"] = "DATE_PICKER",
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["Label"] = "<heading of your component>", -- required
                    ["Value"] = "2026-03-16", -- optional initial value
                    ["Color"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>",
                    ["Placeholder"] = "YYYY-MM-DD",
                    ["HelperText"] = "<optional help text rendered under the picker>",
                    ["DateFormat"] = "yyyy-MM-dd",
                    ["PickerVariant"] = "<Dialog|Inline|Static>",
                    ["UserPrompt"] = "<prompt context for the selected date>",
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "DATE_RANGE_PICKER",
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["Label"] = "<heading of your component>", -- required
                    ["Value"] = "2026-03-16 - 2026-03-20", -- optional initial range
                    ["Color"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>",
                    ["PlaceholderStart"] = "Start date",
                    ["PlaceholderEnd"] = "End date",
                    ["HelperText"] = "<optional help text rendered under the picker>",
                    ["DateFormat"] = "yyyy-MM-dd",
                    ["PickerVariant"] = "<Dialog|Inline|Static>",
                    ["UserPrompt"] = "<prompt context for the selected date range>",
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
            {
                ["Type"] = "TIME_PICKER",
                ["Props"] = {
                    ["Name"] = "<unique identifier of this component>", -- required
                    ["Label"] = "<heading of your component>", -- required
                    ["Value"] = "14:30", -- optional initial time
                    ["Color"] = "<Dark|Error|Info|Inherit|Primary|Secondary|Success|Surface|Tertiary|Transparent|Warning>",
                    ["Placeholder"] = "HH:mm",
                    ["HelperText"] = "<optional help text rendered under the picker>",
                    ["TimeFormat"] = "HH:mm",
                    ["AmPm"] = false,
                    ["PickerVariant"] = "<Dialog|Inline|Static>",
                    ["UserPrompt"] = "<prompt context for the selected time>",
                    ["Class"] = "<optional MudBlazor or css classes>",
                    ["Style"] = "<optional css styles>",
                }
            },
        }
    },
}
