@agentgazer/server 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alerts/evaluator.d.ts +21 -0
- package/dist/alerts/evaluator.d.ts.map +1 -1
- package/dist/alerts/evaluator.js +243 -79
- package/dist/alerts/evaluator.js.map +1 -1
- package/dist/db.d.ts +108 -2
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +536 -11
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.js +1 -1
- package/dist/middleware/auth.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +116 -3
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +55 -5
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/events.d.ts.map +1 -1
- package/dist/routes/events.js +27 -14
- package/dist/routes/events.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +13 -0
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/openclaw.d.ts +3 -0
- package/dist/routes/openclaw.d.ts.map +1 -0
- package/dist/routes/openclaw.js +139 -0
- package/dist/routes/openclaw.js.map +1 -0
- package/dist/routes/overview.d.ts +9 -0
- package/dist/routes/overview.d.ts.map +1 -0
- package/dist/routes/overview.js +101 -0
- package/dist/routes/overview.js.map +1 -0
- package/dist/routes/providers.d.ts +15 -0
- package/dist/routes/providers.d.ts.map +1 -0
- package/dist/routes/providers.js +317 -0
- package/dist/routes/providers.js.map +1 -0
- package/dist/routes/settings.d.ts +7 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +134 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +11 -0
- package/dist/server.js.map +1 -1
- package/dist/services/provider-validator.d.ts +2 -0
- package/dist/services/provider-validator.d.ts.map +1 -0
- package/dist/services/provider-validator.js +8 -0
- package/dist/services/provider-validator.js.map +1 -0
- package/package.json +2 -2
|
@@ -3,6 +3,27 @@ export interface EvaluatorOptions {
|
|
|
3
3
|
db: Database.Database;
|
|
4
4
|
interval?: number;
|
|
5
5
|
}
|
|
6
|
+
export interface KillSwitchEventData {
|
|
7
|
+
agent_id: string;
|
|
8
|
+
score: number;
|
|
9
|
+
window_size: number;
|
|
10
|
+
threshold: number;
|
|
11
|
+
details: {
|
|
12
|
+
similarPrompts: number;
|
|
13
|
+
similarResponses: number;
|
|
14
|
+
repeatedToolCalls: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Fire kill_switch alerts for an agent.
|
|
19
|
+
* Called immediately when a kill_switch event is triggered by the proxy.
|
|
20
|
+
*/
|
|
21
|
+
export declare function fireKillSwitchAlert(db: Database.Database, data: KillSwitchEventData): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Reset kill_switch alert state when agent is reactivated.
|
|
24
|
+
* Called when agent status changes from inactive to active.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resetKillSwitchAlerts(db: Database.Database, agentId: string): void;
|
|
6
27
|
export declare function startEvaluator(options: EvaluatorOptions): {
|
|
7
28
|
stop: () => void;
|
|
8
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/alerts/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAU3C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/alerts/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAU3C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AA+fD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAiDf;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAelF;AAMD,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAuB9E"}
|
package/dist/alerts/evaluator.js
CHANGED
|
@@ -3,6 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fireKillSwitchAlert = fireKillSwitchAlert;
|
|
7
|
+
exports.resetKillSwitchAlerts = resetKillSwitchAlerts;
|
|
6
8
|
exports.startEvaluator = startEvaluator;
|
|
7
9
|
const nodemailer_1 = __importDefault(require("nodemailer"));
|
|
8
10
|
const shared_1 = require("@agentgazer/shared");
|
|
@@ -11,6 +13,7 @@ const log = (0, shared_1.createLogger)("evaluator");
|
|
|
11
13
|
// Prepared-statement SQL
|
|
12
14
|
// ---------------------------------------------------------------------------
|
|
13
15
|
const SQL_ENABLED_RULES = `SELECT * FROM alert_rules WHERE enabled = 1`;
|
|
16
|
+
const SQL_KILL_SWITCH_RULES = `SELECT * FROM alert_rules WHERE enabled = 1 AND rule_type = 'kill_switch' AND agent_id = ?`;
|
|
14
17
|
const SQL_AGENT_BY_ID = `SELECT * FROM agents WHERE agent_id = ?`;
|
|
15
18
|
const SQL_ERROR_RATE = `
|
|
16
19
|
SELECT
|
|
@@ -21,17 +24,15 @@ const SQL_ERROR_RATE = `
|
|
|
21
24
|
AND event_type IN ('llm_call', 'completion')
|
|
22
25
|
AND timestamp >= ?
|
|
23
26
|
`;
|
|
24
|
-
const
|
|
27
|
+
const SQL_BUDGET_SPEND = `
|
|
25
28
|
SELECT COALESCE(SUM(cost_usd), 0) AS total_cost
|
|
26
29
|
FROM agent_events
|
|
27
30
|
WHERE agent_id = ?
|
|
28
31
|
AND event_type IN ('llm_call', 'completion')
|
|
29
32
|
AND timestamp >= ?
|
|
30
33
|
`;
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
WHERE alert_rule_id = ? AND delivered_at > datetime('now', '-15 minutes')
|
|
34
|
-
LIMIT 1
|
|
34
|
+
const SQL_UPDATE_RULE_STATE = `
|
|
35
|
+
UPDATE alert_rules SET state = ?, last_triggered_at = ?, updated_at = datetime('now') WHERE id = ?
|
|
35
36
|
`;
|
|
36
37
|
const SQL_INSERT_HISTORY = `
|
|
37
38
|
INSERT INTO alert_history (alert_rule_id, agent_id, rule_type, message, delivered_via)
|
|
@@ -161,16 +162,101 @@ async function sendTelegram(payload, telegramConfig) {
|
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
// ---------------------------------------------------------------------------
|
|
164
|
-
//
|
|
165
|
+
// Notification delivery helper
|
|
165
166
|
// ---------------------------------------------------------------------------
|
|
167
|
+
async function deliverNotification(db, rule, message, isRecovery = false) {
|
|
168
|
+
const timestamp = new Date().toISOString();
|
|
169
|
+
const ruleType = isRecovery ? `${rule.rule_type}_recovery` : rule.rule_type;
|
|
170
|
+
const payload = {
|
|
171
|
+
agent_id: rule.agent_id,
|
|
172
|
+
rule_type: ruleType,
|
|
173
|
+
message,
|
|
174
|
+
timestamp,
|
|
175
|
+
};
|
|
176
|
+
const notificationType = rule.notification_type || "webhook";
|
|
177
|
+
if (notificationType === "webhook" && rule.webhook_url) {
|
|
178
|
+
postWebhook(rule.webhook_url, payload);
|
|
179
|
+
db.prepare(SQL_INSERT_HISTORY).run(rule.id, rule.agent_id, ruleType, message, "webhook");
|
|
180
|
+
}
|
|
181
|
+
else if (notificationType === "email") {
|
|
182
|
+
try {
|
|
183
|
+
let smtpConfig = null;
|
|
184
|
+
if (rule.smtp_config) {
|
|
185
|
+
try {
|
|
186
|
+
smtpConfig = JSON.parse(rule.smtp_config);
|
|
187
|
+
}
|
|
188
|
+
catch { /* ignore */ }
|
|
189
|
+
}
|
|
190
|
+
await sendEmail(payload, smtpConfig, rule.email);
|
|
191
|
+
db.prepare(SQL_INSERT_HISTORY).run(rule.id, rule.agent_id, ruleType, message, "email");
|
|
192
|
+
}
|
|
193
|
+
catch (emailErr) {
|
|
194
|
+
log.error("Email delivery failed, history not recorded", { ruleId: rule.id, err: String(emailErr) });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else if (notificationType === "telegram") {
|
|
198
|
+
try {
|
|
199
|
+
let telegramConfig = null;
|
|
200
|
+
if (rule.telegram_config) {
|
|
201
|
+
try {
|
|
202
|
+
telegramConfig = JSON.parse(rule.telegram_config);
|
|
203
|
+
}
|
|
204
|
+
catch { /* ignore */ }
|
|
205
|
+
}
|
|
206
|
+
if (telegramConfig) {
|
|
207
|
+
await sendTelegram(payload, telegramConfig);
|
|
208
|
+
db.prepare(SQL_INSERT_HISTORY).run(rule.id, rule.agent_id, ruleType, message, "telegram");
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
log.warn("Telegram alert skipped: no telegram_config", { ruleId: rule.id });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (tgErr) {
|
|
215
|
+
log.error("Telegram delivery failed, history not recorded", { ruleId: rule.id, err: String(tgErr) });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// Budget period helpers
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
function getBudgetPeriodStart(period) {
|
|
223
|
+
const now = new Date();
|
|
224
|
+
switch (period) {
|
|
225
|
+
case "weekly": {
|
|
226
|
+
// Start of current week (Sunday)
|
|
227
|
+
const day = now.getUTCDay();
|
|
228
|
+
const diff = now.getUTCDate() - day;
|
|
229
|
+
const weekStart = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), diff, 0, 0, 0, 0));
|
|
230
|
+
return weekStart.toISOString();
|
|
231
|
+
}
|
|
232
|
+
case "monthly": {
|
|
233
|
+
// Start of current month
|
|
234
|
+
const monthStart = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1, 0, 0, 0, 0));
|
|
235
|
+
return monthStart.toISOString();
|
|
236
|
+
}
|
|
237
|
+
case "daily":
|
|
238
|
+
default: {
|
|
239
|
+
// Start of today (UTC midnight)
|
|
240
|
+
const todayStart = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0, 0, 0));
|
|
241
|
+
return todayStart.toISOString();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
166
245
|
function evaluateAgentDown(db, rule, config) {
|
|
167
246
|
const agent = db.prepare(SQL_AGENT_BY_ID).get(rule.agent_id);
|
|
168
247
|
if (!agent) {
|
|
169
|
-
|
|
170
|
-
|
|
248
|
+
return {
|
|
249
|
+
conditionMet: true,
|
|
250
|
+
message: `Agent "${rule.agent_id}" has never been registered`,
|
|
251
|
+
recoveryMessage: null,
|
|
252
|
+
};
|
|
171
253
|
}
|
|
172
254
|
if (!agent.updated_at) {
|
|
173
|
-
return
|
|
255
|
+
return {
|
|
256
|
+
conditionMet: true,
|
|
257
|
+
message: `Agent "${rule.agent_id}" has no recorded activity`,
|
|
258
|
+
recoveryMessage: null,
|
|
259
|
+
};
|
|
174
260
|
}
|
|
175
261
|
const lastActivity = new Date(agent.updated_at.endsWith("Z") || agent.updated_at.includes("+")
|
|
176
262
|
? agent.updated_at
|
|
@@ -179,32 +265,62 @@ function evaluateAgentDown(db, rule, config) {
|
|
|
179
265
|
const now = Date.now();
|
|
180
266
|
if (now - lastActivity > threshold) {
|
|
181
267
|
const minutesAgo = Math.round((now - lastActivity) / 60_000);
|
|
182
|
-
return
|
|
268
|
+
return {
|
|
269
|
+
conditionMet: true,
|
|
270
|
+
message: `Agent "${rule.agent_id}" has been inactive for ${minutesAgo} minutes (threshold: ${config.duration_minutes}m)`,
|
|
271
|
+
recoveryMessage: null,
|
|
272
|
+
};
|
|
183
273
|
}
|
|
184
|
-
|
|
274
|
+
// Agent is active - this is a recovery
|
|
275
|
+
return {
|
|
276
|
+
conditionMet: false,
|
|
277
|
+
message: null,
|
|
278
|
+
recoveryMessage: `Agent "${rule.agent_id}" is back online`,
|
|
279
|
+
};
|
|
185
280
|
}
|
|
186
281
|
function evaluateErrorRate(db, rule, config) {
|
|
187
282
|
const windowStart = new Date(Date.now() - config.window_minutes * 60 * 1000).toISOString();
|
|
188
283
|
const row = db.prepare(SQL_ERROR_RATE).get(rule.agent_id, windowStart);
|
|
189
284
|
if (row.total === 0) {
|
|
190
|
-
|
|
285
|
+
// No events in window - if we were alerting, consider it recovered
|
|
286
|
+
return {
|
|
287
|
+
conditionMet: false,
|
|
288
|
+
message: null,
|
|
289
|
+
recoveryMessage: rule.state !== "normal" ? `Agent "${rule.agent_id}" error rate returned to normal (no events)` : null,
|
|
290
|
+
};
|
|
191
291
|
}
|
|
192
292
|
const rate = (row.errors / row.total) * 100;
|
|
193
293
|
if (rate > config.threshold) {
|
|
194
|
-
return
|
|
294
|
+
return {
|
|
295
|
+
conditionMet: true,
|
|
296
|
+
message: `Agent "${rule.agent_id}" error rate is ${rate.toFixed(1)}% (${row.errors}/${row.total}) over the last ${config.window_minutes}m (threshold: ${config.threshold}%)`,
|
|
297
|
+
recoveryMessage: null,
|
|
298
|
+
};
|
|
195
299
|
}
|
|
196
|
-
|
|
300
|
+
// Error rate is within threshold - recovery
|
|
301
|
+
return {
|
|
302
|
+
conditionMet: false,
|
|
303
|
+
message: null,
|
|
304
|
+
recoveryMessage: `Agent "${rule.agent_id}" error rate returned to normal (${rate.toFixed(1)}%)`,
|
|
305
|
+
};
|
|
197
306
|
}
|
|
198
307
|
function evaluateBudget(db, rule, config) {
|
|
199
|
-
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
const since = todayUTC.toISOString();
|
|
203
|
-
const row = db.prepare(SQL_BUDGET_TODAY).get(rule.agent_id, since);
|
|
308
|
+
const since = getBudgetPeriodStart(rule.budget_period);
|
|
309
|
+
const row = db.prepare(SQL_BUDGET_SPEND).get(rule.agent_id, since);
|
|
310
|
+
const periodLabel = rule.budget_period || "daily";
|
|
204
311
|
if (row.total_cost > config.threshold) {
|
|
205
|
-
return
|
|
312
|
+
return {
|
|
313
|
+
conditionMet: true,
|
|
314
|
+
message: `Agent "${rule.agent_id}" ${periodLabel} spend is $${row.total_cost.toFixed(4)} (threshold: $${config.threshold})`,
|
|
315
|
+
recoveryMessage: null,
|
|
316
|
+
};
|
|
206
317
|
}
|
|
207
|
-
|
|
318
|
+
// Under budget - recovery (new period started or reset)
|
|
319
|
+
return {
|
|
320
|
+
conditionMet: false,
|
|
321
|
+
message: null,
|
|
322
|
+
recoveryMessage: `Agent "${rule.agent_id}" budget reset for new ${periodLabel} period`,
|
|
323
|
+
};
|
|
208
324
|
}
|
|
209
325
|
// ---------------------------------------------------------------------------
|
|
210
326
|
// Core tick
|
|
@@ -220,80 +336,64 @@ async function tick(db) {
|
|
|
220
336
|
}
|
|
221
337
|
for (const rule of rules) {
|
|
222
338
|
try {
|
|
339
|
+
// Skip kill_switch - handled separately via fireKillSwitchAlert()
|
|
340
|
+
if (rule.rule_type === "kill_switch") {
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
// Check if agent is inactive - skip evaluation
|
|
344
|
+
const agent = db.prepare(SQL_AGENT_BY_ID).get(rule.agent_id);
|
|
345
|
+
if (agent && agent.status === "inactive") {
|
|
346
|
+
log.debug("Skipping alert evaluation for inactive agent", { ruleId: rule.id, agentId: rule.agent_id });
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
223
349
|
const config = JSON.parse(rule.config);
|
|
224
|
-
let
|
|
350
|
+
let result;
|
|
225
351
|
switch (rule.rule_type) {
|
|
226
352
|
case "agent_down":
|
|
227
|
-
|
|
353
|
+
result = evaluateAgentDown(db, rule, config);
|
|
228
354
|
break;
|
|
229
355
|
case "error_rate":
|
|
230
|
-
|
|
356
|
+
result = evaluateErrorRate(db, rule, config);
|
|
231
357
|
break;
|
|
232
358
|
case "budget":
|
|
233
|
-
|
|
359
|
+
result = evaluateBudget(db, rule, config);
|
|
234
360
|
break;
|
|
235
361
|
default:
|
|
236
362
|
log.warn(`Unknown rule_type "${rule.rule_type}"`, { ruleId: rule.id });
|
|
237
363
|
continue;
|
|
238
364
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
const timestamp = new Date().toISOString();
|
|
250
|
-
const payload = {
|
|
251
|
-
agent_id: rule.agent_id,
|
|
252
|
-
rule_type: rule.rule_type,
|
|
253
|
-
message,
|
|
254
|
-
timestamp,
|
|
255
|
-
};
|
|
256
|
-
const notificationType = rule.notification_type || "webhook";
|
|
257
|
-
if (notificationType === "webhook" && rule.webhook_url) {
|
|
258
|
-
postWebhook(rule.webhook_url, payload);
|
|
259
|
-
db.prepare(SQL_INSERT_HISTORY).run(rule.id, rule.agent_id, rule.rule_type, message, "webhook");
|
|
260
|
-
}
|
|
261
|
-
else if (notificationType === "email") {
|
|
262
|
-
try {
|
|
263
|
-
let smtpConfig = null;
|
|
264
|
-
if (rule.smtp_config) {
|
|
265
|
-
try {
|
|
266
|
-
smtpConfig = JSON.parse(rule.smtp_config);
|
|
267
|
-
}
|
|
268
|
-
catch { /* ignore */ }
|
|
269
|
-
}
|
|
270
|
-
await sendEmail(payload, smtpConfig, rule.email);
|
|
271
|
-
db.prepare(SQL_INSERT_HISTORY).run(rule.id, rule.agent_id, rule.rule_type, message, "email");
|
|
365
|
+
const currentState = rule.state || "normal";
|
|
366
|
+
const now = new Date().toISOString();
|
|
367
|
+
if (result.conditionMet && result.message) {
|
|
368
|
+
// Condition is met
|
|
369
|
+
if (currentState === "normal") {
|
|
370
|
+
// First trigger - send notification and update state
|
|
371
|
+
log.info(`Alert fired: ${result.message}`, { ruleId: rule.id, ruleType: rule.rule_type, agentId: rule.agent_id });
|
|
372
|
+
await deliverNotification(db, rule, result.message);
|
|
373
|
+
const newState = rule.repeat_enabled ? "alerting" : "fired";
|
|
374
|
+
db.prepare(SQL_UPDATE_RULE_STATE).run(newState, now, rule.id);
|
|
272
375
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
try {
|
|
282
|
-
telegramConfig = JSON.parse(rule.telegram_config);
|
|
283
|
-
}
|
|
284
|
-
catch { /* ignore */ }
|
|
285
|
-
}
|
|
286
|
-
if (telegramConfig) {
|
|
287
|
-
await sendTelegram(payload, telegramConfig);
|
|
288
|
-
db.prepare(SQL_INSERT_HISTORY).run(rule.id, rule.agent_id, rule.rule_type, message, "telegram");
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
log.warn("Telegram alert skipped: no telegram_config", { ruleId: rule.id });
|
|
376
|
+
else if (currentState === "alerting" && rule.repeat_enabled) {
|
|
377
|
+
// Check if repeat interval has passed
|
|
378
|
+
const lastTriggered = rule.last_triggered_at ? new Date(rule.last_triggered_at).getTime() : 0;
|
|
379
|
+
const intervalMs = rule.repeat_interval_minutes * 60 * 1000;
|
|
380
|
+
if (Date.now() - lastTriggered >= intervalMs) {
|
|
381
|
+
log.info(`Alert repeat: ${result.message}`, { ruleId: rule.id, ruleType: rule.rule_type, agentId: rule.agent_id });
|
|
382
|
+
await deliverNotification(db, rule, result.message);
|
|
383
|
+
db.prepare(SQL_UPDATE_RULE_STATE).run("alerting", now, rule.id);
|
|
292
384
|
}
|
|
293
385
|
}
|
|
294
|
-
|
|
295
|
-
|
|
386
|
+
// If state is "fired" (one-time), do nothing until recovery
|
|
387
|
+
}
|
|
388
|
+
else if (!result.conditionMet && (currentState === "alerting" || currentState === "fired")) {
|
|
389
|
+
// Condition recovered
|
|
390
|
+
log.info(`Alert recovered`, { ruleId: rule.id, ruleType: rule.rule_type, agentId: rule.agent_id });
|
|
391
|
+
// Send recovery notification if enabled
|
|
392
|
+
if (rule.recovery_notify && result.recoveryMessage) {
|
|
393
|
+
await deliverNotification(db, rule, result.recoveryMessage, true);
|
|
296
394
|
}
|
|
395
|
+
// Reset state to normal
|
|
396
|
+
db.prepare(SQL_UPDATE_RULE_STATE).run("normal", null, rule.id);
|
|
297
397
|
}
|
|
298
398
|
}
|
|
299
399
|
catch (err) {
|
|
@@ -302,6 +402,70 @@ async function tick(db) {
|
|
|
302
402
|
}
|
|
303
403
|
}
|
|
304
404
|
// ---------------------------------------------------------------------------
|
|
405
|
+
// Kill Switch Alert Handler
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
/**
|
|
408
|
+
* Fire kill_switch alerts for an agent.
|
|
409
|
+
* Called immediately when a kill_switch event is triggered by the proxy.
|
|
410
|
+
*/
|
|
411
|
+
async function fireKillSwitchAlert(db, data) {
|
|
412
|
+
const rules = db.prepare(SQL_KILL_SWITCH_RULES).all(data.agent_id);
|
|
413
|
+
if (rules.length === 0) {
|
|
414
|
+
log.debug("No kill_switch alert rules for agent", { agentId: data.agent_id });
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
const message = [
|
|
418
|
+
`Kill switch triggered for agent "${data.agent_id}"`,
|
|
419
|
+
`Loop score: ${data.score.toFixed(1)} (threshold: ${data.threshold})`,
|
|
420
|
+
`Details: ${data.details.similarPrompts} similar prompts, ${data.details.similarResponses} similar responses, ${data.details.repeatedToolCalls} repeated tool calls`,
|
|
421
|
+
`Window size: ${data.window_size}`,
|
|
422
|
+
].join("\n");
|
|
423
|
+
const now = new Date().toISOString();
|
|
424
|
+
for (const rule of rules) {
|
|
425
|
+
try {
|
|
426
|
+
const currentState = rule.state || "normal";
|
|
427
|
+
// Check if we should send based on state and repeat settings
|
|
428
|
+
if (currentState === "fired" && !rule.repeat_enabled) {
|
|
429
|
+
log.debug("Kill switch alert skipped (already fired, one-time)", { ruleId: rule.id });
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
if (currentState === "alerting" && rule.repeat_enabled) {
|
|
433
|
+
// Check repeat interval
|
|
434
|
+
const lastTriggered = rule.last_triggered_at ? new Date(rule.last_triggered_at).getTime() : 0;
|
|
435
|
+
const intervalMs = rule.repeat_interval_minutes * 60 * 1000;
|
|
436
|
+
if (Date.now() - lastTriggered < intervalMs) {
|
|
437
|
+
log.debug("Kill switch alert skipped due to repeat interval", { ruleId: rule.id });
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
log.info(`Kill switch alert fired`, { ruleId: rule.id, agentId: data.agent_id, score: data.score });
|
|
442
|
+
await deliverNotification(db, rule, message);
|
|
443
|
+
const newState = rule.repeat_enabled ? "alerting" : "fired";
|
|
444
|
+
db.prepare(SQL_UPDATE_RULE_STATE).run(newState, now, rule.id);
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
log.error("Error firing kill_switch alert", { ruleId: rule.id, err: String(err) });
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Reset kill_switch alert state when agent is reactivated.
|
|
453
|
+
* Called when agent status changes from inactive to active.
|
|
454
|
+
*/
|
|
455
|
+
function resetKillSwitchAlerts(db, agentId) {
|
|
456
|
+
const rules = db.prepare(SQL_KILL_SWITCH_RULES).all(agentId);
|
|
457
|
+
for (const rule of rules) {
|
|
458
|
+
if (rule.state !== "normal") {
|
|
459
|
+
log.info("Resetting kill_switch alert state", { ruleId: rule.id, agentId });
|
|
460
|
+
if (rule.recovery_notify) {
|
|
461
|
+
const message = `Agent "${agentId}" has been reactivated`;
|
|
462
|
+
void deliverNotification(db, rule, message, true);
|
|
463
|
+
}
|
|
464
|
+
db.prepare(SQL_UPDATE_RULE_STATE).run("normal", null, rule.id);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
// ---------------------------------------------------------------------------
|
|
305
469
|
// Public API
|
|
306
470
|
// ---------------------------------------------------------------------------
|
|
307
471
|
function startEvaluator(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/alerts/evaluator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/alerts/evaluator.ts"],"names":[],"mappings":"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"}
|