import React from 'react'
import { Box, Text, useInput } from 'ink'
import { getTheme } from '../utils/theme'
import { MultiSelect } from '@inkjs/ui'
import {
saveCurrentProjectConfig,
getCurrentProjectConfig,
} from '../utils/config.js'
import { partition } from 'lodash-es'
import { MCPServerDialogCopy } from './MCPServerDialogCopy'
import { useExitOnCtrlCD } from '../hooks/useExitOnCtrlCD'
type Props = {
serverNames: string[]
onDone(): void
}
export function MCPServerMultiselectDialog({
serverNames,
onDone,
}: Props): React.ReactNode {
const theme = getTheme()
function onSubmit(selectedServers: string[]) {
const config = getCurrentProjectConfig()
// Initialize arrays if they don't exist
if (!config.approvedMcprcServers) {
config.approvedMcprcServers = []
}
if (!config.rejectedMcprcServers) {
config.rejectedMcprcServers = []
}
// Use partition to separate approved and rejected servers
const [approvedServers, rejectedServers] = partition(serverNames, server =>
selectedServers.includes(server),
)
// Add new servers directly to the respective lists
config.approvedMcprcServers.push(...approvedServers)
config.rejectedMcprcServers.push(...rejectedServers)
saveCurrentProjectConfig(config)
onDone()
}
const exitState = useExitOnCtrlCD(() => process.exit())
useInput((_input, key) => {
if (key.escape) {
// On escape, treat all servers as rejected
const config = getCurrentProjectConfig()
if (!config.rejectedMcprcServers) {
config.rejectedMcprcServers = []
}
for (const server of serverNames) {
if (!config.rejectedMcprcServers.includes(server)) {
config.rejectedMcprcServers.push(server)
}
}
saveCurrentProjectConfig(config)
onDone()
return
}
})
return (
<>
New MCP Servers Detected
This project contains a .mcprc file with {serverNames.length} MCP
servers that require your approval.
Please select the servers you want to enable:
({
label: server,
value: server,
}))}
defaultValue={serverNames}
onSubmit={onSubmit}
/>
{exitState.pending ? (
<>Press {exitState.keyName} again to exit>
) : (
<>Space to select · Enter to confirm · Esc to reject all>
)}
>
)
}