diff --git a/frontend/src/pages/Admin/Agents/GMailSkillPanel/index.jsx b/frontend/src/pages/Admin/Agents/GMailSkillPanel/index.jsx index a9809274..bb6c0f25 100644 --- a/frontend/src/pages/Admin/Agents/GMailSkillPanel/index.jsx +++ b/frontend/src/pages/Admin/Agents/GMailSkillPanel/index.jsx @@ -133,7 +133,7 @@ export default function GMailSkillPanel({ a: ( ), diff --git a/frontend/src/pages/Admin/Agents/OutlookSkillPanel/index.jsx b/frontend/src/pages/Admin/Agents/OutlookSkillPanel/index.jsx index ea5cdbb8..c91daddf 100644 --- a/frontend/src/pages/Admin/Agents/OutlookSkillPanel/index.jsx +++ b/frontend/src/pages/Admin/Agents/OutlookSkillPanel/index.jsx @@ -225,7 +225,7 @@ export default function OutlookSkillPanel({ a: ( ), diff --git a/frontend/src/pages/Admin/Agents/index.jsx b/frontend/src/pages/Admin/Agents/index.jsx index 0e106e5a..9e9b5a46 100644 --- a/frontend/src/pages/Admin/Agents/index.jsx +++ b/frontend/src/pages/Admin/Agents/index.jsx @@ -13,11 +13,16 @@ import { Robot, Hammer, FlowArrow, + Package, } from "@phosphor-icons/react"; import ContextualSaveBar from "@/components/ContextualSaveBar"; import { castToType } from "@/utils/types"; import { FullScreenLoader } from "@/components/Preloader"; -import { getDefaultSkills, getConfigurableSkills } from "./skills"; +import { + getDefaultSkills, + getConfigurableSkills, + getAppIntegrationSkills, +} from "./skills.jsx"; import { DefaultBadge } from "./Badges/default"; import ImportedSkillList from "./Imported/SkillList"; import ImportedSkillConfig from "./Imported/ImportedSkillConfig"; @@ -68,20 +73,25 @@ export default function AdminAgents() { fileSystemAgentAvailable, createFilesAgentAvailable, }); + const allAppIntegrationSkills = getAppIntegrationSkills(t); // Filter skills based on mode restrictions // singleUserOnly -> hidden in multi-user mode // multiUserOnly -> hidden when NOT in multi-user mode const isMultiUserMode = settings?.MultiUserMode ?? false; + const filterSkillsByMode = ([_, skillConfig]) => { + if (!skillConfig.mode) return true; + if (skillConfig.mode.includes("singleUserOnly") && isMultiUserMode) + return false; + if (skillConfig.mode.includes("multiUserOnly") && !isMultiUserMode) + return false; + return true; + }; const configurableSkills = Object.fromEntries( - Object.entries(allConfigurableSkills).filter(([_, skillConfig]) => { - if (!skillConfig.mode) return true; - if (skillConfig.mode.includes("singleUserOnly") && isMultiUserMode) - return false; - if (skillConfig.mode.includes("multiUserOnly") && !isMultiUserMode) - return false; - return true; - }) + Object.entries(allConfigurableSkills).filter(filterSkillsByMode) + ); + const appIntegrationSkills = Object.fromEntries( + Object.entries(allAppIntegrationSkills).filter(filterSkillsByMode) ); // Alert user if they try to leave the page with unsaved changes @@ -232,6 +242,8 @@ export default function AdminAgents() { SelectedSkillComponent = ImportedSkillConfig; } else if (configurableSkills[selectedSkill]) { SelectedSkillComponent = configurableSkills[selectedSkill]?.component; + } else if (appIntegrationSkills[selectedSkill]) { + SelectedSkillComponent = appIntegrationSkills[selectedSkill]?.component; } else { SelectedSkillComponent = defaultSkills[selectedSkill]?.component; } @@ -382,6 +394,17 @@ export default function AdminAgents() { activeSkills={agentSkills} /> +
+ +

App Integrations

+
+ +

Custom Skills

@@ -484,7 +507,7 @@ export default function AdminAgents() { setHasChanges={setHasChanges} {...defaultSkills[selectedSkill]} /> - ) : ( + ) : configurableSkills?.[selectedSkill] ? ( // The selected skill is a configurable skill - show the configurable skill panel + ) : ( + // The selected skill is an app integration skill + )} )} @@ -580,6 +618,17 @@ export default function AdminAgents() { activeSkills={agentSkills} /> +
+ +

App Integrations

+
+ +

Custom Skills

@@ -680,7 +729,7 @@ export default function AdminAgents() { setHasChanges={setHasChanges} {...defaultSkills[selectedSkill]} /> - ) : ( + ) : configurableSkills?.[selectedSkill] ? ( // The selected skill is a configurable skill - show the configurable skill panel + ) : ( + // The selected skill is an app integration skill + )} )} @@ -740,6 +802,7 @@ function SkillList({ selectedSkill = null, handleClick = null, activeSkills = [], + Icon = null, }) { if (skills.length === 0) return null; @@ -766,7 +829,14 @@ function SkillList({ }`} onClick={() => handleClick?.(skill)} > -
{settings.title}
+
+ {settings.Icon ? ( + + ) : ( + Icon && + )} +
{settings.title}
+
{isDefault ? ( diff --git a/frontend/src/pages/Admin/Agents/skills.js b/frontend/src/pages/Admin/Agents/skills.jsx similarity index 90% rename from frontend/src/pages/Admin/Agents/skills.js rename to frontend/src/pages/Admin/Agents/skills.jsx index ee4ef043..a3205b80 100644 --- a/frontend/src/pages/Admin/Agents/skills.js +++ b/frontend/src/pages/Admin/Agents/skills.jsx @@ -13,8 +13,6 @@ import { ChartBar, FolderOpen, FilePlus, - EnvelopeSimple, - MicrosoftOutlookLogo, } from "@phosphor-icons/react"; import RAGImage from "@/media/agents/rag-memory.png"; import SummarizeImage from "@/media/agents/view-summarize.png"; @@ -22,6 +20,8 @@ import ScrapeWebsitesImage from "@/media/agents/scrape-websites.png"; import GenerateChartsImage from "@/media/agents/generate-charts.png"; import GenerateSaveImages from "@/media/agents/generate-save-files.png"; import FileSystemImage from "@/media/agents/file-system.png"; +import GMailIcon from "./GMailSkillPanel/gmail.png"; +import OutlookIcon from "./OutlookSkillPanel/outlook.png"; export const getDefaultSkills = (t) => ({ "rag-memory": { @@ -94,12 +94,17 @@ export const getConfigurableSkills = ( component: AgentSQLConnectorSelection, skill: "sql-agent", }, +}); + +export const getAppIntegrationSkills = (t) => ({ "gmail-agent": { title: t("agent.skill.gmail.title"), description: t("agent.skill.gmail.description"), component: GMailSkillPanel, skill: "gmail-agent", - icon: EnvelopeSimple, + Icon: ({ size }) => ( + GMail + ), mode: ["singleUserOnly"], }, "outlook-agent": { @@ -107,7 +112,9 @@ export const getConfigurableSkills = ( description: t("agent.skill.outlook.description"), component: OutlookSkillPanel, skill: "outlook-agent", - icon: MicrosoftOutlookLogo, + Icon: ({ size }) => ( + Outlook + ), mode: ["singleUserOnly"], }, });