From 0d760ffa2eff1e9029ec0ae1dc7a9bdb2b05be8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=A2=E5=A5=8B=E7=8C=AB?= Date: Mon, 13 Oct 2025 22:34:27 +0800 Subject: [PATCH] feat: add AgentSettingsTab component and integrate into HomeTabs (#10668) - Introduced the AgentSettingsTab component for managing agent settings. - Integrated AgentSettingsTab into HomeTabs, allowing access to agent settings based on the active session or topic. - Updated AgentEssentialSettings to conditionally render the ModelSetting based on props. - Adjusted styles in various components for consistency and improved layout. --- .../src/pages/home/Tabs/AgentSettingsTab.tsx | 40 +++++++++++++++++++ .../src/pages/home/Tabs/AssistantsTab.tsx | 4 +- .../pages/home/Tabs/components/AddButton.tsx | 2 +- .../pages/home/Tabs/components/AgentItem.tsx | 11 +---- src/renderer/src/pages/home/Tabs/index.tsx | 34 +++++++--------- .../AgentSettings/AccessibleDirsSetting.tsx | 4 +- .../AgentSettings/AgentEssentialSettings.tsx | 5 ++- .../settings/AgentSettings/NameSetting.tsx | 1 + 8 files changed, 66 insertions(+), 35 deletions(-) create mode 100644 src/renderer/src/pages/home/Tabs/AgentSettingsTab.tsx diff --git a/src/renderer/src/pages/home/Tabs/AgentSettingsTab.tsx b/src/renderer/src/pages/home/Tabs/AgentSettingsTab.tsx new file mode 100644 index 000000000..7aab18816 --- /dev/null +++ b/src/renderer/src/pages/home/Tabs/AgentSettingsTab.tsx @@ -0,0 +1,40 @@ +import { Button, Divider } from '@heroui/react' +import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' +import { AgentSettingsPopup } from '@renderer/pages/settings/AgentSettings' +import AdvancedSettings from '@renderer/pages/settings/AgentSettings/AdvancedSettings' +import AgentEssentialSettings from '@renderer/pages/settings/AgentSettings/AgentEssentialSettings' +import { GetAgentResponse } from '@renderer/types/agent' +import { FC } from 'react' +import { useTranslation } from 'react-i18next' + +interface Props { + agent: GetAgentResponse | undefined | null + update: ReturnType['updateAgent'] +} + +const AgentSettingsTab: FC = ({ agent, update }) => { + const { t } = useTranslation() + + const onMoreSetting = () => { + if (agent?.id) { + AgentSettingsPopup.show({ agentId: agent.id! }) + } + } + + if (!agent) { + return null + } + + return ( +
+ + + + +
+ ) +} + +export default AgentSettingsTab diff --git a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx index 3d871d76e..2eaa2ef1e 100644 --- a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx @@ -116,8 +116,6 @@ const AssistantsTab: FC = (props) => { /> )} - - {agentsLoading && } {apiServer.enabled && agentsError && } @@ -165,6 +163,8 @@ const AssistantsTab: FC = (props) => { /> )} + + {!dragging &&
} ) diff --git a/src/renderer/src/pages/home/Tabs/components/AddButton.tsx b/src/renderer/src/pages/home/Tabs/components/AddButton.tsx index 1195710ae..99868861b 100644 --- a/src/renderer/src/pages/home/Tabs/components/AddButton.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AddButton.tsx @@ -12,7 +12,7 @@ const AddButton: FC = ({ children, className, ...props }) => { {...props} onPress={props.onPress} className={cn( - 'h-9 w-[calc(var(--assistants-width)-20px)] justify-start rounded-full bg-transparent px-3 text-[13px] text-[var(--color-text-2)] hover:bg-[var(--color-list-item)]', + 'h-9 w-[calc(var(--assistants-width)-20px)] justify-start rounded-lg bg-transparent px-3 text-[13px] text-[var(--color-text-2)] hover:bg-[var(--color-list-item)]', className )} startContent={}> diff --git a/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx b/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx index 80c4b6db9..f31242080 100644 --- a/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx +++ b/src/renderer/src/pages/home/Tabs/components/AgentItem.tsx @@ -45,19 +45,12 @@ const AgentItem: FC = ({ agent, isActive, onDelete, onPress }) = - {isActive ? {sessions.length} : } + {isActive ? {sessions.length} : } - { - // onOpen() - await AgentSettingsPopup.show({ - agentId: agent.id - }) - }}> + AgentSettingsPopup.show({ agentId: agent.id })}> {t('common.edit')} diff --git a/src/renderer/src/pages/home/Tabs/index.tsx b/src/renderer/src/pages/home/Tabs/index.tsx index f1adf9e4f..1e2559c08 100644 --- a/src/renderer/src/pages/home/Tabs/index.tsx +++ b/src/renderer/src/pages/home/Tabs/index.tsx @@ -1,4 +1,6 @@ import AddAssistantPopup from '@renderer/components/Popups/AddAssistantPopup' +import { useAgent } from '@renderer/hooks/agents/useAgent' +import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' import { useAssistants, useDefaultAssistant } from '@renderer/hooks/useAssistant' import { useRuntime } from '@renderer/hooks/useRuntime' import { useNavbarPosition, useSettings } from '@renderer/hooks/useSettings' @@ -11,6 +13,7 @@ import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' +import AgentSettingsTab from './AgentSettingsTab' import Assistants from './AssistantsTab' import Settings from './SettingsTab' import Topics from './TopicsTab' @@ -41,11 +44,12 @@ const HomeTabs: FC = ({ const { defaultAssistant } = useDefaultAssistant() const { toggleShowTopics } = useShowTopics() const { isLeftNavbar } = useNavbarPosition() - const { t } = useTranslation() - const { chat } = useRuntime() - const { activeTopicOrSession } = chat + const { activeTopicOrSession, activeAgentId } = chat + const { agent } = useAgent(activeAgentId) + const { updateAgent } = useUpdateAgent() + const isSessionView = activeTopicOrSession === 'session' const isTopicView = activeTopicOrSession === 'topic' @@ -61,7 +65,6 @@ const HomeTabs: FC = ({ } const showTab = position === 'left' && topicPosition === 'left' - const shouldShowSettingsTab = !isSessionView const onCreateAssistant = async () => { const assistant = await AddAssistantPopup.show() @@ -104,12 +107,6 @@ const HomeTabs: FC = ({ } }, [position, tab, topicPosition, forceToSeeAllTab]) - useEffect(() => { - if (activeTopicOrSession === 'session' && tab === 'settings') { - setTab('topic') - } - }, [activeTopicOrSession, tab]) - return ( = ({ {t('assistants.abbr')} setTab('topic')}> - {isTopicView ? t('common.topics') : t('agent.session.label_other')} + {t('common.topics')} + + setTab('settings')}> + {t('settings.title')} - {shouldShowSettingsTab && ( - setTab('settings')}> - {t('settings.title')} - - )} )} @@ -158,7 +153,8 @@ const HomeTabs: FC = ({ position={position} /> )} - {tab === 'settings' && shouldShowSettingsTab && } + {tab === 'settings' && isTopicView && } + {tab === 'settings' && isSessionView && } ) @@ -214,7 +210,7 @@ const CustomTabs = styled.div` const TabItem = styled.button<{ active: boolean }>` flex: 1; - height: 32px; + height: 30px; border: none; background: transparent; color: ${(props) => (props.active ? 'var(--color-text)' : 'var(--color-text-secondary)')}; @@ -239,7 +235,7 @@ const TabItem = styled.button<{ active: boolean }>` &::after { content: ''; position: absolute; - bottom: -9px; + bottom: -8px; left: 50%; transform: translateX(-50%); width: ${(props) => (props.active ? '30px' : '0')}; diff --git a/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx b/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx index 2a19b5441..ad228d227 100644 --- a/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/AccessibleDirsSetting.tsx @@ -71,11 +71,11 @@ export const AccessibleDirsSetting: React.FC = ({ ba }> {t('agent.session.accessible_paths.label')} -
    +
      {base.accessible_paths.map((path) => (
    • + className="flex items-center justify-between gap-2 rounded-medium border border-default-200 px-2 py-1"> {path} diff --git a/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx index af9dcfd75..e0329404d 100644 --- a/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx @@ -18,9 +18,10 @@ import { SettingsContainer, SettingsItem, SettingsTitle } from './shared' interface AgentEssentialSettingsProps { agent: GetAgentResponse | undefined | null update: ReturnType['updateAgent'] + showModelSetting?: boolean } -const AgentEssentialSettings: FC = ({ agent, update }) => { +const AgentEssentialSettings: FC = ({ agent, update, showModelSetting = true }) => { const { t } = useTranslation() if (!agent) return null @@ -36,7 +37,7 @@ const AgentEssentialSettings: FC = ({ agent, update - + {showModelSetting && } diff --git a/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx b/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx index 364e464b5..26346bc9a 100644 --- a/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/NameSetting.tsx @@ -25,6 +25,7 @@ export const NameSetting: React.FC = ({ base, update }) => { setName(value)} onBlur={() => { if (name !== base.name) {