Merge branch 'feat/mcp-frontend' into deploy/dev

pull/22036/head
Joel 11 months ago
commit eb342f0f61

@ -32,7 +32,7 @@ const CardView: FC<ICardViewProps> = ({ appId, isInPanel, className }) => {
const appDetail = useAppStore(state => state.appDetail) const appDetail = useAppStore(state => state.appDetail)
const setAppDetail = useAppStore(state => state.setAppDetail) const setAppDetail = useAppStore(state => state.setAppDetail)
const showMCPCard = isInPanel && (appDetail?.mode === 'advanced-chat' || appDetail?.mode === 'workflow') const showMCPCard = isInPanel
const updateAppDetail = async () => { const updateAppDetail = async () => {
try { try {

@ -27,6 +27,7 @@ import {
} from '@/service/use-tools' } from '@/service/use-tools'
import { BlockEnum } from '@/app/components/workflow/types' import { BlockEnum } from '@/app/components/workflow/types'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
import { fetchAppDetail } from '@/service/apps'
export type IAppCardProps = { export type IAppCardProps = {
appInfo: AppDetailResponse & Partial<AppSSO> appInfo: AppDetailResponse & Partial<AppSSO>
@ -36,6 +37,7 @@ function MCPServiceCard({
appInfo, appInfo,
}: IAppCardProps) { }: IAppCardProps) {
const { t } = useTranslation() const { t } = useTranslation()
const appId = appInfo.id
const { mutateAsync: updateMCPServer } = useUpdateMCPServer() const { mutateAsync: updateMCPServer } = useUpdateMCPServer()
const { mutateAsync: refreshMCPServerCode, isPending: genLoading } = useRefreshMCPServerCode() const { mutateAsync: refreshMCPServerCode, isPending: genLoading } = useRefreshMCPServerCode()
const invalidateMCPServerDetail = useInvalidateMCPServerDetail() const invalidateMCPServerDetail = useInvalidateMCPServerDetail()
@ -43,11 +45,33 @@ function MCPServiceCard({
const [showConfirmDelete, setShowConfirmDelete] = useState(false) const [showConfirmDelete, setShowConfirmDelete] = useState(false)
const [showMCPServerModal, setShowMCPServerModal] = useState(false) const [showMCPServerModal, setShowMCPServerModal] = useState(false)
const { data: currentWorkflow } = useAppWorkflow(appInfo.id) const isAdvancedApp = appInfo?.mode === 'advanced-chat' || appInfo?.mode === 'workflow'
const { data: detail } = useMCPServerDetail(appInfo.id) const isBasicApp = !isAdvancedApp
const { data: currentWorkflow } = useAppWorkflow(isAdvancedApp ? appId : '')
const [basicAppConfig, setBasicAppConfig] = useState<any>({})
const basicAppInputForm = useMemo(() => {
if(!isBasicApp || !basicAppConfig?.user_input_form)
return []
return basicAppConfig.user_input_form.map((item: any) => {
const type = Object.keys(item)[0]
return {
...item[type],
type: type || 'text-input',
}
})
}, [basicAppConfig.user_input_form, isBasicApp])
useEffect(() => {
if(isBasicApp && appId) {
(async () => {
const res = await fetchAppDetail({ url: '/apps', id: appId })
setBasicAppConfig(res?.model_config || {})
})()
}
}, [appId, isBasicApp])
const { data: detail } = useMCPServerDetail(appId)
const { id, status, server_code } = detail ?? {} const { id, status, server_code } = detail ?? {}
const appUnpublished = !currentWorkflow?.graph const appUnpublished = isAdvancedApp ? !currentWorkflow?.graph : !basicAppConfig.updated_at
const serverPublished = !!id const serverPublished = !!id
const serverActivated = status === 'active' const serverActivated = status === 'active'
const serverURL = serverPublished ? `${appInfo.api_base_url.replace('/v1', '')}/mcp/server/${server_code}/mcp` : '***********' const serverURL = serverPublished ? `${appInfo.api_base_url.replace('/v1', '')}/mcp/server/${server_code}/mcp` : '***********'
@ -56,15 +80,18 @@ function MCPServiceCard({
const [activated, setActivated] = useState(serverActivated) const [activated, setActivated] = useState(serverActivated)
const latestParams = useMemo(() => { const latestParams = useMemo(() => {
if(isAdvancedApp) {
if (!currentWorkflow?.graph) if (!currentWorkflow?.graph)
return [] return []
const startNode = currentWorkflow?.graph.nodes.find(node => node.data.type === BlockEnum.Start) as any const startNode = currentWorkflow?.graph.nodes.find(node => node.data.type === BlockEnum.Start) as any
return startNode?.data.variables as any[] || [] return startNode?.data.variables as any[] || []
}, [currentWorkflow]) }
return basicAppInputForm
}, [currentWorkflow, basicAppInputForm, isAdvancedApp])
const onGenCode = async () => { const onGenCode = async () => {
await refreshMCPServerCode(detail?.id || '') await refreshMCPServerCode(detail?.id || '')
invalidateMCPServerDetail(appInfo.id) invalidateMCPServerDetail(appId)
} }
const onChangeStatus = async (state: boolean) => { const onChangeStatus = async (state: boolean) => {
@ -76,23 +103,23 @@ function MCPServiceCard({
} }
await updateMCPServer({ await updateMCPServer({
appID: appInfo.id, appID: appId,
id: id || '', id: id || '',
description: detail?.description || '', description: detail?.description || '',
parameters: detail?.parameters || {}, parameters: detail?.parameters || {},
status: 'active', status: 'active',
}) })
invalidateMCPServerDetail(appInfo.id) invalidateMCPServerDetail(appId)
} }
else { else {
await updateMCPServer({ await updateMCPServer({
appID: appInfo.id, appID: appId,
id: id || '', id: id || '',
description: detail?.description || '', description: detail?.description || '',
parameters: detail?.parameters || {}, parameters: detail?.parameters || {},
status: 'inactive', status: 'inactive',
}) })
invalidateMCPServerDetail(appInfo.id) invalidateMCPServerDetail(appId)
} }
} }
@ -106,7 +133,7 @@ function MCPServiceCard({
setActivated(serverActivated) setActivated(serverActivated)
}, [serverActivated]) }, [serverActivated])
if (!currentWorkflow) if (!currentWorkflow && isAdvancedApp)
return null return null
return ( return (
@ -190,7 +217,7 @@ function MCPServiceCard({
{showMCPServerModal && ( {showMCPServerModal && (
<MCPServerModal <MCPServerModal
show={showMCPServerModal} show={showMCPServerModal}
appID={appInfo.id} appID={appId}
data={serverPublished ? detail : undefined} data={serverPublished ? detail : undefined}
latestParams={latestParams} latestParams={latestParams}
onHide={handleServerModalHide} onHide={handleServerModalHide}

@ -21,7 +21,6 @@ import PluginList, { type ListProps } from '@/app/components/workflow/block-sele
import { PluginType } from '../../plugins/types' import { PluginType } from '../../plugins/types'
import { useMarketplacePlugins } from '../../plugins/marketplace/hooks' import { useMarketplacePlugins } from '../../plugins/marketplace/hooks'
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
import useCheckVerticalScrollbar from './use-check-vertical-scrollbar'
type AllToolsProps = { type AllToolsProps = {
className?: string className?: string
@ -107,7 +106,6 @@ const AllTools = ({
const pluginRef = useRef<ListRef>(null) const pluginRef = useRef<ListRef>(null)
const wrapElemRef = useRef<HTMLDivElement>(null) const wrapElemRef = useRef<HTMLDivElement>(null)
const hasVerticalScrollbar = useCheckVerticalScrollbar(wrapElemRef)
const isSupportGroupView = [ToolTypeEnum.All, ToolTypeEnum.BuiltIn].includes(activeTab) const isSupportGroupView = [ToolTypeEnum.All, ToolTypeEnum.BuiltIn].includes(activeTab)
return ( return (
@ -150,7 +148,6 @@ const AllTools = ({
hasSearchText={!!searchText} hasSearchText={!!searchText}
selectedTools={selectedTools} selectedTools={selectedTools}
canChooseMCPTool={canChooseMCPTool} canChooseMCPTool={canChooseMCPTool}
hasScrollBar={hasVerticalScrollbar}
/> />
{/* Plugins from marketplace */} {/* Plugins from marketplace */}
{enable_marketplace && <PluginList {enable_marketplace && <PluginList

@ -28,7 +28,6 @@ type ToolsProps = {
indexBarClassName?: string indexBarClassName?: string
selectedTools?: ToolValue[] selectedTools?: ToolValue[]
canChooseMCPTool?: boolean canChooseMCPTool?: boolean
hasScrollBar?: boolean
} }
const Blocks = ({ const Blocks = ({
onSelect, onSelect,

Loading…
Cancel
Save