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
JavaScript
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);
}
}
}