This commit is contained in:
Andrew Pareles
2025-05-21 02:02:12 -07:00
parent d2b159e04f
commit abbee45f95
2 changed files with 26 additions and 27 deletions
@@ -101,7 +101,7 @@ class MCPService extends Disposable implements IMCPService {
console.log('MCP Config file created:', mcpConfigUri.toString());
}
await this._updateStateWithCurrentConfigFile();
await this._refreshMCPServers();
// Add a watcher to the MCP config file
await this._addMCPConfigFileWatcher();
@@ -179,7 +179,7 @@ class MCPService extends Disposable implements IMCPService {
this._register(this.fileService.onDidFilesChange(async e => {
if (!e.contains(mcpConfigUri)) return
await this._updateStateWithCurrentConfigFile();
await this._refreshMCPServers();
}));
}
@@ -225,10 +225,10 @@ class MCPService extends Disposable implements IMCPService {
return allTools;
}
// toggle MCP server and update isOn in void settings
public async toggleServer(serverName: string, isOn: boolean): Promise<void> {
this.channel.call('toggleServer', { serverName, isOn })
// Update the server state in the local mcpServers list
await this.voidSettingsService.setMCPServerState(serverName, isOn);
await this.voidSettingsService.setMCPServerState(serverName, { isOn });
}
// utility functions
@@ -250,33 +250,34 @@ class MCPService extends Disposable implements IMCPService {
}
// Handle server state changes
private async _updateStateWithCurrentConfigFile(): Promise<void> {
private async _refreshMCPServers(): Promise<void> {
this._setHasError(undefined)
// TODO!!! set is loading
const mcpConfigFile = await this._parseMCPConfigFile();
if (!mcpConfigFile) { console.log(`Not setting state: MCP config file not found`); return }
if (!mcpConfigFile?.mcpServers) { console.log(`Not setting state: MCP config file did not have an 'mcpServers' field`); return }
const savedServerStates = this.voidSettingsService.state.mcpServerStateOfName;
const currMCPStateOfName = this.voidSettingsService.state.mcpServerStateOfName;
const availableServers = Object.keys(mcpConfigFile.mcpServers);
// Handle added servers
const addedServers = availableServers.filter(serverName => !savedServerStates[serverName]);
const addedServers = availableServers.filter(serverName => !currMCPStateOfName[serverName].isOn);
const addedServersObject = addedServers.reduce((acc, serverName) => {
acc[serverName] = { isOn: true };
return acc;
}, {} as MCPServerStateOfName);
await this.voidSettingsService.addMCPServers(addedServersObject);
await this.voidSettingsService.addMCPServerStateOfName(addedServersObject);
// Handle removed servers
const removedServers = Object.keys(savedServerStates).filter(serverName => availableServers.indexOf(serverName) === -1);
await this.voidSettingsService.removeMCPServers(removedServers);
const removedServers = Object.keys(currMCPStateOfName).filter(serverName => availableServers.indexOf(serverName) === -1);
await this.voidSettingsService.removeMCPServerStateNames(removedServers);
// Compile the updated server list as MCPServerStates
const updatedServers = Object.keys(savedServerStates).reduce((acc, serverName) => {
const updatedServers = Object.keys(currMCPStateOfName).reduce((acc, serverName) => {
if (availableServers.includes(serverName)) {
acc[serverName] = savedServerStates[serverName];
acc[serverName] = currMCPStateOfName[serverName];
}
return acc;
}, {} as MCPServerStateOfName);
@@ -13,7 +13,7 @@ import { IStorageService, StorageScope, StorageTarget } from '../../../../platfo
import { IMetricsService } from './metricsService.js';
import { defaultProviderSettings, getModelCapabilities, ModelOverrides } from './modelCapabilities.js';
import { VOID_SETTINGS_STORAGE_KEY } from './storageKeys.js';
import { defaultSettingsOfProvider, FeatureName, ProviderName, ModelSelectionOfFeature, SettingsOfProvider, SettingName, providerNames, ModelSelection, modelSelectionsEqual, featureNames, VoidStatefulModelInfo, GlobalSettings, GlobalSettingName, defaultGlobalSettings, ModelSelectionOptions, OptionsOfModelSelection, ChatMode, OverridesOfModel, defaultOverridesOfModel, MCPServerStateOfName } from './voidSettingsTypes.js';
import { defaultSettingsOfProvider, FeatureName, ProviderName, ModelSelectionOfFeature, SettingsOfProvider, SettingName, providerNames, ModelSelection, modelSelectionsEqual, featureNames, VoidStatefulModelInfo, GlobalSettings, GlobalSettingName, defaultGlobalSettings, ModelSelectionOptions, OptionsOfModelSelection, ChatMode, OverridesOfModel, defaultOverridesOfModel, MCPServerStateOfName, MCPServerState } from './voidSettingsTypes.js';
// name is the name in the dropdown
@@ -76,9 +76,9 @@ export interface IVoidSettingsService {
addModel(providerName: ProviderName, modelName: string): void;
deleteModel(providerName: ProviderName, modelName: string): boolean;
addMCPServers(newMCPStates: MCPServerStateOfName): Promise<void>;
removeMCPServers(serverNames: string[]): Promise<void>;
setMCPServerState(serverName: string, newIsOn: boolean): Promise<void>;
addMCPServerStateOfName(serverStateOfName: MCPServerStateOfName): Promise<void>;
removeMCPServerStateNames(serverNames: string[]): Promise<void>;
setMCPServerState(serverName: string, state: MCPServerState): Promise<void>;
}
@@ -541,7 +541,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService {
}
// MCP Server State
private _setMCPServerStates = async (newStates: MCPServerStateOfName) => {
private _setMCPServerStateOfName = async (newStates: MCPServerStateOfName) => {
const newState: VoidSettingsState = {
...this.state,
mcpServerStateOfName: {
@@ -555,17 +555,17 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService {
this._metricsService.capture('Set MCP Server States', { newStates });
}
addMCPServers = async (newMCPStates: MCPServerStateOfName) => {
addMCPServerStateOfName = async (newMCPStates: MCPServerStateOfName) => {
const { mcpServerStateOfName: mcpServerStates } = this.state
const newMCPServerStates = {
...mcpServerStates,
...newMCPStates,
}
await this._setMCPServerStates(newMCPServerStates)
await this._setMCPServerStateOfName(newMCPServerStates)
this._metricsService.capture('Add MCP Server', { servers: Object.keys(newMCPStates).join(', ') });
}
removeMCPServers = async (serverNames: string[]) => {
removeMCPServerStateNames = async (serverNames: string[]) => {
const { mcpServerStateOfName: mcpServerStates } = this.state
const newMCPServerStates = {
...mcpServerStates,
@@ -575,21 +575,19 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService {
delete newMCPServerStates[serverName]
}
})
await this._setMCPServerStates(newMCPServerStates)
await this._setMCPServerStateOfName(newMCPServerStates)
this._metricsService.capture('Remove MCP Server', { servers: serverNames.join(', ') });
}
setMCPServerState = async (serverName: string, newIsOn: boolean) => {
setMCPServerState = async (serverName: string, state: MCPServerState) => {
const { mcpServerStateOfName: mcpServerStates } = this.state
if (!(serverName in mcpServerStates)) return // if not in list, do nothing
const newMCPServerStates = {
...mcpServerStates,
[serverName]: {
isOn: newIsOn,
},
[serverName]: state,
}
await this._setMCPServerStates(newMCPServerStates)
this._metricsService.capture('Update MCP Server State', { serverName, newIsOn });
await this._setMCPServerStateOfName(newMCPServerStates)
this._metricsService.capture('Update MCP Server State', { serverName, state });
}
}