@nanocollective/nanocoder
Version:
A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter
66 lines • 2.37 kB
JavaScript
/**
* Alert management and sending
*/
import { loggerProvider } from '../../logger-provider.js';
// Get logger instance directly to avoid circular dependencies
const getLogger = () => loggerProvider.getLogger();
const logger = getLogger();
/**
* Send health alert
*/
export async function sendAlert(result, config, lastAlert, correlationId) {
if (!config.alerts.enabled)
return;
// Check cooldown
if (lastAlert && Date.now() - lastAlert < config.alerts.cooldown) {
return;
}
const alertMessage = `Health Alert: ${result.status.toUpperCase()} - Score: ${result.score}/100`;
const alertDetails = {
status: result.status,
score: result.score,
summary: result.summary,
recommendations: result.recommendations,
timestamp: result.timestamp,
correlationId,
};
// Send to configured channels
for (const channel of config.alerts.channels) {
switch (channel) {
case 'console':
logger.error(alertMessage, {
...alertDetails,
source: 'health-monitor-alert',
});
break;
case 'file':
// Could implement file-based alerting
logger.warn(alertMessage, {
...alertDetails,
source: 'health-monitor-alert',
});
break;
case 'webhook':
if (config.alerts.webhookUrl) {
try {
// TODO: implement webhook call here
logger.info('Webhook alert would be sent', {
url: config.alerts.webhookUrl,
correlationId,
source: 'health-monitor-alert',
});
}
catch (error) {
logger.error('Failed to send webhook alert', {
url: config.alerts.webhookUrl,
error: error instanceof Error ? error.message : error,
correlationId,
source: 'health-monitor-alert',
});
}
}
break;
}
}
}
//# sourceMappingURL=alert-manager.js.map