import partition from 'lodash-es/partition.js' import React, { useCallback } from 'react' import { logEvent } from 'src/services/analytics/index.js' import { Box, Text } from '@anthropic/ink' import { getSettings_DEPRECATED, updateSettingsForSource, } from '../utils/settings/settings.js' import { ConfigurableShortcutHint } from './ConfigurableShortcutHint.js' import { SelectMulti } from './CustomSelect/SelectMulti.js' import { Byline, Dialog, KeyboardShortcutHint } from '@anthropic/ink' import { MCPServerDialogCopy } from './MCPServerDialogCopy.js' type Props = { serverNames: string[] onDone(): void } export function MCPServerMultiselectDialog({ serverNames, onDone, }: Props): React.ReactNode { function onSubmit(selectedServers: string[]) { const currentSettings = getSettings_DEPRECATED() || {} const enabledServers = currentSettings.enabledMcpjsonServers || [] const disabledServers = currentSettings.disabledMcpjsonServers || [] // Use partition to separate approved and rejected servers const [approvedServers, rejectedServers] = partition(serverNames, server => selectedServers.includes(server), ) logEvent('tengu_mcp_multidialog_choice', { approved: approvedServers.length, rejected: rejectedServers.length, }) // Update settings with approved servers if (approvedServers.length > 0) { const newEnabledServers = [ ...new Set([...enabledServers, ...approvedServers]), ] updateSettingsForSource('localSettings', { enabledMcpjsonServers: newEnabledServers, }) } // Update settings with rejected servers if (rejectedServers.length > 0) { const newDisabledServers = [ ...new Set([...disabledServers, ...rejectedServers]), ] updateSettingsForSource('localSettings', { disabledMcpjsonServers: newDisabledServers, }) } onDone() } // Handle ESC to reject all servers const handleEscRejectAll = useCallback(() => { const currentSettings = getSettings_DEPRECATED() || {} const disabledServers = currentSettings.disabledMcpjsonServers || [] const newDisabledServers = [ ...new Set([...disabledServers, ...serverNames]), ] updateSettingsForSource('localSettings', { disabledMcpjsonServers: newDisabledServers, }) onDone() }, [serverNames, onDone]) return ( <> ({ label: server, value: server, }))} defaultValue={serverNames} onSubmit={onSubmit} onCancel={handleEscRejectAll} hideIndexes /> ) }