git-contextor
Version:
A code context tool with vector search and real-time monitoring, with optional Git integration.
84 lines (66 loc) • 2.72 kB
JavaScript
const ConfigManager = require('../../core/ConfigManager');
const ServiceManager = require('../../core/ServiceManager');
const logger = require('../utils/logger');
const simpleGit = require('simple-git');
// Import all necessary services
const Indexer = require('../../core/Indexer');
const VectorStore = require('../../core/VectorStore');
const MemoryVectorStore = require('../../core/MemoryVectorStore');
const ContextOptimizer = require('../../core/ContextOptimizer');
const FileWatcher = require('../../core/FileWatcher');
async function serve() {
const repoPath = process.cwd();
const configManager = new ConfigManager(repoPath);
try {
await configManager.load();
const config = configManager.config;
// Environment validation
let isGitRepo = false;
try {
await simpleGit(repoPath).status();
isGitRepo = true;
logger.info('Git repository detected.');
} catch (error) {
logger.warn('No Git repository detected. Operating in non-Git mode.');
}
// Initialize services
const vectorStoreProvider = config.vectorStore.provider;
const qdrantHost = config.vectorStore.qdrant?.host;
let vectorStore;
if (vectorStoreProvider === 'qdrant' || (vectorStoreProvider === 'auto' && qdrantHost)) {
vectorStore = new VectorStore(config);
} else {
vectorStore = new MemoryVectorStore(config);
}
const indexer = new Indexer(repoPath, vectorStore, config);
indexer.isGitRepo = isGitRepo;
const contextOptimizer = new ContextOptimizer(vectorStore, config);
const fileWatcher = new FileWatcher(repoPath, indexer, config);
fileWatcher.isGitRepo = isGitRepo;
const services = { indexer, vectorStore, contextOptimizer, fileWatcher };
// Initialize ServiceManager
const serviceManager = new ServiceManager(repoPath, config, services);
// Initialize sharing service through ServiceManager
await serviceManager.sharingService.init();
// Start all services (ServiceManager handles initial indexing)
await serviceManager.start();
// Keep the process running
process.on('SIGTERM', async () => {
logger.info('Received SIGTERM, shutting down gracefully...');
await serviceManager.stop({ silent: true });
process.exit(0);
});
process.on('SIGINT', async () => {
logger.info('Received SIGINT, shutting down gracefully...');
await serviceManager.stop({ silent: true });
process.exit(0);
});
// Keep the process alive
process.stdin.resume();
} catch (error) {
logger.error('Failed to start Git Contextor service:', error.message);
logger.debug(error.stack);
process.exit(1);
}
}
module.exports = serve;