/** * @license * Copyright 2025 Qwen * SPDX-License-Identifier: Apache-2.0 */ import { useState } from 'react'; import { Box, Text } from 'ink'; import { theme } from '../../../semantic-colors.js'; import { useKeypress } from '../../../hooks/useKeypress.js'; import { RadioButtonSelect } from '../../shared/RadioButtonSelect.js'; import { t } from '../../../../i18n/index.js'; import type { ServerDetailStepProps } from '../types.js'; import { getStatusColor, getStatusIcon, formatServerCommand, } from '../utils.js'; type ServerAction = 'view-tools' | 'reconnect' | 'toggle-disable'; export const ServerDetailStep: React.FC = ({ server, onViewTools, onReconnect, onDisable, onBack, }) => { const [selectedAction, setSelectedAction] = useState('view-tools'); const statusColor = server ? getStatusColor(server.status) : 'gray'; const actions = [ { key: 'view-tools', get label() { return t('View tools'); }, value: 'view-tools' as const, }, { key: 'reconnect', get label() { return t('Reconnect'); }, value: 'reconnect' as const, }, { key: 'toggle-disable', get label() { return server?.isDisabled ? t('Enable') : t('Disable'); }, value: 'toggle-disable' as const, }, ]; useKeypress( (key) => { if (key.name === 'escape') { onBack(); } else if (key.name === 'return') { switch (selectedAction) { case 'view-tools': onViewTools(); break; case 'reconnect': onReconnect?.(); break; case 'toggle-disable': onDisable?.(); break; default: break; } } }, { isActive: true }, ); if (!server) { return ( {t('No server selected')} ); } return ( {/* 服务器详情 */} {t('Status:')} {getStatusIcon(server.status)} {t(server.status)} {server.isDisabled && ( {t('(disabled)')} )} {t('Source:')} {server.scope === 'user' ? t('User Settings') : server.scope === 'workspace' ? t('Workspace Settings') : t('Extension')} {t('Command:')} {formatServerCommand(server)} {server.config.cwd && ( {t('Working Directory:')} {server.config.cwd} )} {t('Capabilities:')} {server.toolCount > 0 ? t('tools') : ''} {server.toolCount > 0 && server.promptCount > 0 ? ', ' : ''} {server.promptCount > 0 ? t('prompts') : ''} {t('Tools:')} {server.toolCount}{' '} {server.toolCount === 1 ? t('tool') : t('tools')} {server.errorMessage && ( {t('Error:')} {server.errorMessage} )} {/* 操作列表 */} items={actions} onHighlight={(value: ServerAction) => setSelectedAction(value)} onSelect={(value: ServerAction) => { switch (value) { case 'view-tools': onViewTools(); break; case 'reconnect': onReconnect?.(); break; case 'toggle-disable': onDisable?.(); break; default: break; } }} /> ); };