|
import { v4 as uuidv4 } from 'uuid'; |
|
import { IGroup, McpSettings } from '../types/index.js'; |
|
import { loadSettings, saveSettings } from '../config/index.js'; |
|
import { notifyToolChanged } from './mcpService.js'; |
|
|
|
|
|
export const getAllGroups = (): IGroup[] => { |
|
const settings = loadSettings(); |
|
return settings.groups || []; |
|
}; |
|
|
|
|
|
export const getGroupByIdOrName = (key: string): IGroup | undefined => { |
|
const settings = loadSettings(); |
|
const routingConfig = settings.systemConfig?.routing || { |
|
enableGlobalRoute: true, |
|
enableGroupNameRoute: true, |
|
}; |
|
const groups = getAllGroups(); |
|
return ( |
|
groups.find( |
|
(group) => group.id === key || (group.name === key && routingConfig.enableGroupNameRoute), |
|
) || undefined |
|
); |
|
}; |
|
|
|
|
|
export const createGroup = ( |
|
name: string, |
|
description?: string, |
|
servers: string[] = [], |
|
): IGroup | null => { |
|
try { |
|
const settings = loadSettings(); |
|
const groups = settings.groups || []; |
|
|
|
|
|
if (groups.some((group) => group.name === name)) { |
|
return null; |
|
} |
|
|
|
|
|
const validServers = servers.filter((serverName) => settings.mcpServers[serverName]); |
|
|
|
const newGroup: IGroup = { |
|
id: uuidv4(), |
|
name, |
|
description, |
|
servers: validServers, |
|
}; |
|
|
|
|
|
if (!settings.groups) { |
|
settings.groups = []; |
|
} |
|
|
|
settings.groups.push(newGroup); |
|
|
|
if (!saveSettings(settings)) { |
|
return null; |
|
} |
|
|
|
return newGroup; |
|
} catch (error) { |
|
console.error('Failed to create group:', error); |
|
return null; |
|
} |
|
}; |
|
|
|
|
|
export const updateGroup = (id: string, data: Partial<IGroup>): IGroup | null => { |
|
try { |
|
const settings = loadSettings(); |
|
if (!settings.groups) { |
|
return null; |
|
} |
|
|
|
const groupIndex = settings.groups.findIndex((group) => group.id === id); |
|
if (groupIndex === -1) { |
|
return null; |
|
} |
|
|
|
|
|
if (data.name && settings.groups.some((g) => g.name === data.name && g.id !== id)) { |
|
return null; |
|
} |
|
|
|
|
|
if (data.servers) { |
|
data.servers = data.servers.filter((serverName) => settings.mcpServers[serverName]); |
|
} |
|
|
|
const updatedGroup = { |
|
...settings.groups[groupIndex], |
|
...data, |
|
}; |
|
|
|
settings.groups[groupIndex] = updatedGroup; |
|
|
|
if (!saveSettings(settings)) { |
|
return null; |
|
} |
|
|
|
notifyToolChanged(); |
|
return updatedGroup; |
|
} catch (error) { |
|
console.error(`Failed to update group ${id}:`, error); |
|
return null; |
|
} |
|
}; |
|
|
|
|
|
export const updateGroupServers = (groupId: string, servers: string[]): IGroup | null => { |
|
try { |
|
const settings = loadSettings(); |
|
if (!settings.groups) { |
|
return null; |
|
} |
|
|
|
const groupIndex = settings.groups.findIndex((group) => group.id === groupId); |
|
if (groupIndex === -1) { |
|
return null; |
|
} |
|
|
|
|
|
const validServers = servers.filter((serverName) => settings.mcpServers[serverName]); |
|
|
|
settings.groups[groupIndex].servers = validServers; |
|
|
|
if (!saveSettings(settings)) { |
|
return null; |
|
} |
|
|
|
notifyToolChanged(); |
|
return settings.groups[groupIndex]; |
|
} catch (error) { |
|
console.error(`Failed to update servers for group ${groupId}:`, error); |
|
return null; |
|
} |
|
}; |
|
|
|
|
|
export const deleteGroup = (id: string): boolean => { |
|
try { |
|
const settings = loadSettings(); |
|
if (!settings.groups) { |
|
return false; |
|
} |
|
|
|
const initialLength = settings.groups.length; |
|
settings.groups = settings.groups.filter((group) => group.id !== id); |
|
|
|
if (settings.groups.length === initialLength) { |
|
return false; |
|
} |
|
|
|
return saveSettings(settings); |
|
} catch (error) { |
|
console.error(`Failed to delete group ${id}:`, error); |
|
return false; |
|
} |
|
}; |
|
|
|
|
|
export const addServerToGroup = (groupId: string, serverName: string): IGroup | null => { |
|
try { |
|
const settings = loadSettings(); |
|
if (!settings.groups) { |
|
return null; |
|
} |
|
|
|
|
|
if (!settings.mcpServers[serverName]) { |
|
return null; |
|
} |
|
|
|
const groupIndex = settings.groups.findIndex((group) => group.id === groupId); |
|
if (groupIndex === -1) { |
|
return null; |
|
} |
|
|
|
const group = settings.groups[groupIndex]; |
|
|
|
|
|
if (!group.servers.includes(serverName)) { |
|
group.servers.push(serverName); |
|
|
|
if (!saveSettings(settings)) { |
|
return null; |
|
} |
|
} |
|
|
|
notifyToolChanged(); |
|
return group; |
|
} catch (error) { |
|
console.error(`Failed to add server ${serverName} to group ${groupId}:`, error); |
|
return null; |
|
} |
|
}; |
|
|
|
|
|
export const removeServerFromGroup = (groupId: string, serverName: string): IGroup | null => { |
|
try { |
|
const settings = loadSettings(); |
|
if (!settings.groups) { |
|
return null; |
|
} |
|
|
|
const groupIndex = settings.groups.findIndex((group) => group.id === groupId); |
|
if (groupIndex === -1) { |
|
return null; |
|
} |
|
|
|
const group = settings.groups[groupIndex]; |
|
group.servers = group.servers.filter((name) => name !== serverName); |
|
|
|
if (!saveSettings(settings)) { |
|
return null; |
|
} |
|
|
|
return group; |
|
} catch (error) { |
|
console.error(`Failed to remove server ${serverName} from group ${groupId}:`, error); |
|
return null; |
|
} |
|
}; |
|
|
|
|
|
export const getServersInGroup = (groupId: string): string[] => { |
|
const group = getGroupByIdOrName(groupId); |
|
return group ? group.servers : []; |
|
}; |
|
|