import { logEvent } from 'src/services/analytics/index.js' import { getCurrentProjectConfig, saveCurrentProjectConfig, } from '../utils/config.js' import { logError } from '../utils/log.js' import { getSettingsForSource, updateSettingsForSource, } from '../utils/settings/settings.js' /** * Migration: Move MCP server approval fields from project config to local settings * This migrates both enableAllProjectMcpServers and enabledMcpjsonServers to the * settings system for better management and consistency. */ export function migrateEnableAllProjectMcpServersToSettings(): void { const projectConfig = getCurrentProjectConfig() // Check if any field exists in project config const hasEnableAll = projectConfig.enableAllProjectMcpServers !== undefined const hasEnabledServers = projectConfig.enabledMcpjsonServers && projectConfig.enabledMcpjsonServers.length > 0 const hasDisabledServers = projectConfig.disabledMcpjsonServers && projectConfig.disabledMcpjsonServers.length > 0 if (!hasEnableAll && !hasEnabledServers && !hasDisabledServers) { return } try { const existingSettings = getSettingsForSource('localSettings') || {} const updates: Partial<{ enableAllProjectMcpServers: boolean enabledMcpjsonServers: string[] disabledMcpjsonServers: string[] }> = {} const fieldsToRemove: Array< | 'enableAllProjectMcpServers' | 'enabledMcpjsonServers' | 'disabledMcpjsonServers' > = [] // Migrate enableAllProjectMcpServers if it exists and hasn't been migrated if ( hasEnableAll && existingSettings.enableAllProjectMcpServers === undefined ) { updates.enableAllProjectMcpServers = projectConfig.enableAllProjectMcpServers fieldsToRemove.push('enableAllProjectMcpServers') } else if (hasEnableAll) { // Already migrated, just mark for removal fieldsToRemove.push('enableAllProjectMcpServers') } // Migrate enabledMcpjsonServers if it exists if (hasEnabledServers && projectConfig.enabledMcpjsonServers) { const existingEnabledServers = existingSettings.enabledMcpjsonServers || [] // Merge the servers (avoiding duplicates) updates.enabledMcpjsonServers = [ ...new Set([ ...existingEnabledServers, ...projectConfig.enabledMcpjsonServers, ]), ] fieldsToRemove.push('enabledMcpjsonServers') } // Migrate disabledMcpjsonServers if it exists if (hasDisabledServers && projectConfig.disabledMcpjsonServers) { const existingDisabledServers = existingSettings.disabledMcpjsonServers || [] // Merge the servers (avoiding duplicates) updates.disabledMcpjsonServers = [ ...new Set([ ...existingDisabledServers, ...projectConfig.disabledMcpjsonServers, ]), ] fieldsToRemove.push('disabledMcpjsonServers') } // Update settings if there are any updates if (Object.keys(updates).length > 0) { updateSettingsForSource('localSettings', updates) } // Remove migrated fields from project config if ( fieldsToRemove.includes('enableAllProjectMcpServers') || fieldsToRemove.includes('enabledMcpjsonServers') || fieldsToRemove.includes('disabledMcpjsonServers') ) { saveCurrentProjectConfig(current => { const { enableAllProjectMcpServers: _enableAll, enabledMcpjsonServers: _enabledServers, disabledMcpjsonServers: _disabledServers, ...configWithoutFields } = current return configWithoutFields }) } // Log the migration event logEvent('tengu_migrate_mcp_approval_fields_success', { migratedCount: fieldsToRemove.length, }) } catch (e: unknown) { // Log migration failure but don't throw to avoid breaking startup logError(e) logEvent('tengu_migrate_mcp_approval_fields_error', {}) } }