UNPKG

vibe-coder-mcp

Version:

Production-ready MCP server with complete agent integration, multi-transport support, and comprehensive development automation tools for AI-assisted workflows.

131 lines (130 loc) 4.83 kB
import { getTimeoutManager } from './timeout-manager.js'; import logger from '../../../logger.js'; export class LazyConfigContainer { config = null; configFactory; configName; constructor(configName, factory) { this.configName = configName; this.configFactory = factory; } getConfig() { if (!this.config) { try { this.config = this.configFactory(); logger.debug({ configName: this.configName }, 'Lazy configuration initialized successfully'); } catch (error) { logger.error({ err: error, configName: this.configName }, 'Failed to initialize lazy configuration'); throw new Error(`Failed to initialize ${this.configName}: ${error instanceof Error ? error.message : String(error)}`); } } return this.config; } isInitialized() { return this.config !== null; } reset() { this.config = null; logger.debug({ configName: this.configName }, 'Lazy configuration reset'); } } export function createLazyTimeoutConfig(configName, baseConfig, timeoutMappings, userOverrides) { const factory = () => { const timeoutManager = getTimeoutManager(); const timeoutValues = {}; for (const [configKey, timeoutOperation] of Object.entries(timeoutMappings)) { timeoutValues[configKey] = timeoutManager.getTimeout(timeoutOperation); } const finalConfig = { ...baseConfig, ...timeoutValues, ...userOverrides }; return finalConfig; }; return new LazyConfigContainer(configName, factory); } export function createLazyRetryConfig(configName, baseConfig, retryMappings, userOverrides) { const factory = () => { const timeoutManager = getTimeoutManager(); const retryConfig = timeoutManager.getRetryConfig(); const retryValues = {}; for (const [configKey, retryProperty] of Object.entries(retryMappings)) { retryValues[configKey] = retryConfig[retryProperty]; } const finalConfig = { ...baseConfig, ...retryValues, ...userOverrides }; return finalConfig; }; return new LazyConfigContainer(configName, factory); } export function memoizeConfig(configName, factory) { let memoizedConfig = null; return () => { if (!memoizedConfig) { try { memoizedConfig = factory(); logger.debug({ configName }, 'Configuration memoized successfully'); } catch (error) { logger.error({ err: error, configName }, 'Failed to memoize configuration'); throw new Error(`Failed to create ${configName}: ${error instanceof Error ? error.message : String(error)}`); } } return memoizedConfig; }; } export class EnvironmentAwareConfig { static isTestEnv = process.env.NODE_ENV === 'test'; static isDevEnv = process.env.NODE_ENV === 'development'; static isProdEnv = process.env.NODE_ENV === 'production'; static getTimeoutForEnv(baseTimeout, testTimeout) { if (this.isTestEnv && testTimeout !== undefined) { return testTimeout; } return baseTimeout; } static getConfigForEnv(prodConfig, devConfig, testConfig) { if (this.isTestEnv && testConfig) { return { ...prodConfig, ...testConfig }; } if (this.isDevEnv && devConfig) { return { ...prodConfig, ...devConfig }; } return prodConfig; } static allowsFallbacks() { return this.isTestEnv || this.isDevEnv; } } export class ConfigValidator { static validateRequired(config, requiredProps, configName) { const missing = requiredProps.filter(prop => config[prop] === undefined || config[prop] === null); if (missing.length > 0) { const errorMsg = `Missing required configuration properties in ${configName}: ${missing.join(', ')}`; logger.error({ missing, configName }, errorMsg); throw new Error(errorMsg); } } static validateTimeouts(config, timeoutProps, configName) { const invalid = timeoutProps.filter(prop => { const value = config[prop]; return typeof value !== 'number' || value <= 0; }); if (invalid.length > 0) { const errorMsg = `Invalid timeout values in ${configName}: ${invalid.join(', ')} must be positive numbers`; logger.error({ invalid, configName }, errorMsg); throw new Error(errorMsg); } } }