@kdump/code-cli-any-llm
Version:
> A unified gateway for the Gemini, opencode, crush, and Qwen Code AI CLIs
147 lines • 6.69 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = __importDefault(require("express"));
const core_1 = require("@nestjs/core");
const app_module_1 = require("./app.module");
const validation_pipe_1 = require("./common/validation.pipe");
const global_exception_filter_1 = require("./filters/global-exception.filter");
const validation_exception_filter_1 = require("./filters/validation-exception.filter");
const cors_config_1 = require("./config/cors.config");
const config_1 = require("@nestjs/config");
const common_1 = require("@nestjs/common");
const global_config_service_1 = require("./config/global-config.service");
const performance_config_1 = require("./config/performance.config");
const gateway_logger_service_1 = require("./common/logger/gateway-logger.service");
async function bootstrap() {
const globalConfigService = new global_config_service_1.GlobalConfigService();
const globalConfigResult = globalConfigService.loadGlobalConfig();
const resolveLogLevels = (level) => {
const normalized = (level || 'info').toLowerCase();
const baseLevels = [
'fatal',
'error',
'warn',
'log',
'debug',
'verbose',
];
switch (normalized) {
case 'fatal':
return ['fatal'];
case 'error':
return ['fatal', 'error'];
case 'warn':
return ['fatal', 'error', 'warn'];
case 'info':
case 'log':
return ['fatal', 'error', 'warn', 'log'];
case 'debug':
return ['fatal', 'error', 'warn', 'log', 'debug'];
case 'verbose':
return baseLevels;
default:
return ['fatal', 'error', 'warn', 'log'];
}
};
const configuredLogLevel = globalConfigResult.config?.gateway?.logLevel || process.env.CAL_LOG_LEVEL;
const logLevels = resolveLogLevels(configuredLogLevel);
const parsePort = (value) => {
if (typeof value === 'number' && Number.isFinite(value)) {
return value;
}
if (typeof value === 'string') {
const trimmed = value.trim();
if (trimmed.length === 0) {
return undefined;
}
const parsed = Number(trimmed);
if (Number.isFinite(parsed)) {
return parsed;
}
}
return undefined;
};
const environmentPort = parsePort(process.env.CAL_PORT);
const configuredPort = parsePort(globalConfigResult.config?.gateway?.port);
const portForLogger = configuredPort ?? environmentPort ?? 23062;
const gatewayLogger = gateway_logger_service_1.GatewayLoggerService.create({
logDir: globalConfigResult.config?.gateway?.logDir ||
process.env.CAL_GATEWAY_LOG_DIR,
filePrefix: `gateway-${portForLogger}`,
logLevels,
});
common_1.Logger.overrideLogger(gatewayLogger);
const logger = new common_1.Logger('Bootstrap');
if (!globalConfigResult.isValid) {
logger.error('Global configuration validation failed:');
globalConfigResult.errors.forEach((error) => {
logger.error(` - ${error.field}: ${error.message}`);
logger.error(` Suggestion: ${error.suggestion}`);
});
logger.error(`\nConfiguration file path: ~/.code-cli-any-llm/config.yaml`);
logger.error('Please resolve the configuration issues and restart the application');
logger.error(`Gateway log file: ${gateway_logger_service_1.GatewayLoggerService.getLogFilePath()}`);
gateway_logger_service_1.GatewayLoggerService.close();
process.exit(1);
}
logger.log(`Global configuration loaded from: ${globalConfigResult.config.configSource}`);
logger.log(`Gateway log file: ${gateway_logger_service_1.GatewayLoggerService.getLogFilePath()}`);
if (globalConfigResult.warnings.length > 0) {
globalConfigResult.warnings.forEach((warning) => {
logger.warn(`Configuration warning: ${warning}`);
});
}
const app = await core_1.NestFactory.create(app_module_1.AppModule, { logger: gatewayLogger });
const bodySizeLimit = performance_config_1.performanceConfig.maxRequestBodySize;
app.use(express_1.default.json({ limit: bodySizeLimit }));
app.use(express_1.default.urlencoded({ limit: bodySizeLimit, extended: true }));
const configService = app.get(config_1.ConfigService);
app.useGlobalPipes(new validation_pipe_1.ValidationPipe());
app.useGlobalFilters(new global_exception_filter_1.GlobalExceptionFilter(), new validation_exception_filter_1.ValidationExceptionFilter());
app.enableCors(cors_config_1.corsConfig);
app.use((req, res, next) => {
if (req.path.startsWith('/api/v1beta/')) {
req.url = req.path.replace('/api/v1beta', '/api/v1');
}
next();
});
app.use((req, res, next) => {
if (req.path.startsWith('/api/v1/models/') &&
!req.path.startsWith('/api/v1/gemini/models/')) {
req.url = req.path.replace('/api/v1/models', '/api/v1/gemini/models');
}
next();
});
app.setGlobalPrefix('api/v1');
const port = parsePort(configService.get('gateway.port')) ?? portForLogger;
const server = (await app.listen(port));
const gracefulShutdown = (signal) => {
logger.log(`Received ${signal}. Shutting down gracefully...`);
server.close(() => {
logger.log('HTTP server closed');
gateway_logger_service_1.GatewayLoggerService.close();
process.exit(0);
});
setTimeout(() => {
logger.error('Could not close connections in time, forcefully shutting down');
gateway_logger_service_1.GatewayLoggerService.close();
process.exit(1);
}, 10000);
};
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
process.on('uncaughtException', (error) => {
logger.error('Uncaught Exception:', error);
gracefulShutdown('uncaughtException');
});
process.on('unhandledRejection', (reason, promise) => {
logger.error('Unhandled Rejection at:', promise, 'reason:', reason);
gracefulShutdown('unhandledRejection');
});
logger.log(`Application is running on: http://localhost:${port}`);
}
void bootstrap();
//# sourceMappingURL=main.js.map
;