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.

136 lines (135 loc) 5.01 kB
import fs from 'fs/promises'; import logger from '../../../logger.js'; export class ResourceTracker { jobResources = new Map(); trackJob(jobId) { this.jobResources.set(jobId, { tempDirs: [], caches: [], timers: [], otherResources: new Map() }); logger.debug(`Started tracking resources for job: ${jobId}`); } trackTempDir(jobId, dirPath) { const resources = this.jobResources.get(jobId); if (resources) { resources.tempDirs.push(dirPath); logger.debug(`Tracking temporary directory for job ${jobId}: ${dirPath}`); } else { logger.warn(`Cannot track temporary directory for unknown job: ${jobId}`); } } trackCache(jobId, cache) { const resources = this.jobResources.get(jobId); if (resources) { resources.caches.push(cache); logger.debug(`Tracking cache for job ${jobId}`); } else { logger.warn(`Cannot track cache for unknown job: ${jobId}`); } } trackTimer(jobId, timer) { const resources = this.jobResources.get(jobId); if (resources) { resources.timers.push(timer); logger.debug(`Tracking timer for job ${jobId}`); } else { logger.warn(`Cannot track timer for unknown job: ${jobId}`); } } trackResource(jobId, key, resource) { const resources = this.jobResources.get(jobId); if (resources) { resources.otherResources.set(key, resource); logger.debug(`Tracking resource ${key} for job ${jobId}`); } else { logger.warn(`Cannot track resource for unknown job: ${jobId}`); } } async cleanupJob(jobId) { const resources = this.jobResources.get(jobId); if (!resources) { logger.warn(`No resources to clean up for job: ${jobId}`); return; } logger.info(`Cleaning up resources for job: ${jobId}`); for (const timer of resources.timers) { try { clearTimeout(timer); clearInterval(timer); logger.debug(`Cleared timer for job ${jobId}`); } catch (error) { logger.warn(`Error clearing timer for job ${jobId}: ${error}`); } } for (const cache of resources.caches) { try { if (typeof cache.clear === 'function') { cache.clear(); logger.debug(`Cleared cache for job ${jobId}`); } else if (typeof cache.clearCache === 'function') { cache.clearCache(); logger.debug(`Cleared cache for job ${jobId} using clearCache method`); } else { logger.warn(`Cache for job ${jobId} does not have a clear or clearCache method`); } } catch (error) { logger.warn(`Error clearing cache for job ${jobId}: ${error}`); } } for (const dirPath of resources.tempDirs) { try { await fs.rm(dirPath, { recursive: true, force: true }); logger.debug(`Removed temporary directory for job ${jobId}: ${dirPath}`); } catch (error) { logger.warn(`Failed to remove temporary directory for job ${jobId}: ${dirPath}`, error); } } for (const [key, resource] of resources.otherResources.entries()) { try { if (typeof resource.dispose === 'function') { await resource.dispose(); logger.debug(`Disposed resource ${key} for job ${jobId}`); } else if (typeof resource.close === 'function') { await resource.close(); logger.debug(`Closed resource ${key} for job ${jobId}`); } else if (typeof resource.cleanup === 'function') { await resource.cleanup(); logger.debug(`Cleaned up resource ${key} for job ${jobId}`); } else { logger.debug(`No cleanup method found for resource ${key} for job ${jobId}`); } } catch (error) { logger.warn(`Error cleaning up resource ${key} for job ${jobId}: ${error}`); } } this.jobResources.delete(jobId); logger.info(`Completed cleanup for job: ${jobId}`); } getTrackedJobCount() { return this.jobResources.size; } getTrackedJobIds() { return Array.from(this.jobResources.keys()); } getJobResources(jobId) { return this.jobResources.get(jobId); } isJobTracked(jobId) { return this.jobResources.has(jobId); } }