import { StatusCard } from '@agentscope-ai/chat'; import { Button, Popover } from '@agentscope-ai/design'; import { Flex } from 'antd'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { createStyles } from 'antd-style' import ApprovalCancelPopover from './ApprovalCancelPopover'; import { AgentScopeRuntimeContentType, AgentScopeRuntimeMessageRole, AgentScopeRuntimeMessageType, IAgentScopeRuntimeMessage, IDataContent } from '../types'; import { useChatAnywhereInput } from '../../Context/ChatAnywhereInputContext'; import { emit } from "../../Context/useChatAnywhereEventEmitter"; import { useTranslation } from '../../Context/ChatAnywhereI18nContext'; const useStyles = createStyles(({ css, token }) => ({ desc: css` font-size: 12px; color: ${token.colorTextTertiary}; `, })); export default function Approval({ data }: { data: IAgentScopeRuntimeMessage }) { const inputContext = useChatAnywhereInput(v => v); const { styles } = useStyles(); const { t } = useTranslation(); const [status, setStatus] = useState<'pending' | 'confirmed' | 'canceled'>('pending'); const title = t?.('approval.title') || '人工干预'; const description = useMemo(() => { if (status === 'pending') return t?.('approval.pending') || '请确认是否执行该操作'; if (status === 'confirmed') return t?.('approval.confirmed') || '确认执行任务'; return t?.('approval.canceled') || '取消执行任务'; }, [status, t]); const handleConfirm = useCallback((status: 'confirmed' | 'canceled', reason?: string) => { setStatus(status); inputContext.setLoading(false); inputContext.setDisabled(false); const request = data // @ts-ignore const id = request.content[0]?.data?.id; const response = { type: AgentScopeRuntimeMessageType.MCP_APPROVAL_RESPONSE, role: AgentScopeRuntimeMessageRole.USER, content: [ { type: AgentScopeRuntimeContentType.DATA, data: { "approve": status === 'confirmed', "id": id, "approval_request_id": id, "reason": reason } }, ], } emit({ type: 'handleApproval', data: { input: [ request, response, ] } }) }, [data]); const actions = useMemo(() => { if (status === 'pending') { return handleConfirm('canceled', reason)} /> } return null; }, [status, t]); useEffect(() => { if (status === 'pending') { inputContext.setLoading(t?.('approval.taskRunning') || '当前有正在执行的任务,无法发送新的任务'); inputContext.setDisabled(true); } }, [status, t]); return { }} title={ {title} {description} } actions={actions} /> }