openalerts 0.2.6

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.
Files changed (102) hide show
  1. package/README.md +253 -0
  2. package/dist/channels/console.d.ts +6 -0
  3. package/dist/channels/console.d.ts.map +1 -0
  4. package/dist/channels/console.js +10 -0
  5. package/dist/channels/console.js.map +1 -0
  6. package/dist/channels/telegram.d.ts +12 -0
  7. package/dist/channels/telegram.d.ts.map +1 -0
  8. package/dist/channels/telegram.js +28 -0
  9. package/dist/channels/telegram.js.map +1 -0
  10. package/dist/channels/webhook.d.ts +8 -0
  11. package/dist/channels/webhook.d.ts.map +1 -0
  12. package/dist/channels/webhook.js +15 -0
  13. package/dist/channels/webhook.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +234 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/config.d.ts +51 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +86 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/core/alert-channel.d.ts +16 -0
  23. package/dist/core/alert-channel.d.ts.map +1 -0
  24. package/dist/core/alert-channel.js +23 -0
  25. package/dist/core/alert-channel.js.map +1 -0
  26. package/dist/core/bounded-map.d.ts +52 -0
  27. package/dist/core/bounded-map.d.ts.map +1 -0
  28. package/dist/core/bounded-map.js +129 -0
  29. package/dist/core/bounded-map.js.map +1 -0
  30. package/dist/core/engine.d.ts +36 -0
  31. package/dist/core/engine.d.ts.map +1 -0
  32. package/dist/core/engine.js +162 -0
  33. package/dist/core/engine.js.map +1 -0
  34. package/dist/core/evaluator.d.ts +19 -0
  35. package/dist/core/evaluator.d.ts.map +1 -0
  36. package/dist/core/evaluator.js +168 -0
  37. package/dist/core/evaluator.js.map +1 -0
  38. package/dist/core/event-bus.d.ts +18 -0
  39. package/dist/core/event-bus.d.ts.map +1 -0
  40. package/dist/core/event-bus.js +32 -0
  41. package/dist/core/event-bus.js.map +1 -0
  42. package/dist/core/formatter.d.ts +15 -0
  43. package/dist/core/formatter.d.ts.map +1 -0
  44. package/dist/core/formatter.js +125 -0
  45. package/dist/core/formatter.js.map +1 -0
  46. package/dist/core/rules.d.ts +3 -0
  47. package/dist/core/rules.d.ts.map +1 -0
  48. package/dist/core/rules.js +410 -0
  49. package/dist/core/rules.js.map +1 -0
  50. package/dist/core/store.d.ts +9 -0
  51. package/dist/core/store.d.ts.map +1 -0
  52. package/dist/core/store.js +72 -0
  53. package/dist/core/store.js.map +1 -0
  54. package/dist/core/types.d.ts +158 -0
  55. package/dist/core/types.d.ts.map +1 -0
  56. package/dist/core/types.js +18 -0
  57. package/dist/core/types.js.map +1 -0
  58. package/dist/db/index.d.ts +6 -0
  59. package/dist/db/index.d.ts.map +1 -0
  60. package/dist/db/index.js +31 -0
  61. package/dist/db/index.js.map +1 -0
  62. package/dist/db/queries.d.ts +157 -0
  63. package/dist/db/queries.d.ts.map +1 -0
  64. package/dist/db/queries.js +221 -0
  65. package/dist/db/queries.js.map +1 -0
  66. package/dist/db/schema.d.ts +5 -0
  67. package/dist/db/schema.d.ts.map +1 -0
  68. package/dist/db/schema.js +177 -0
  69. package/dist/db/schema.js.map +1 -0
  70. package/dist/readers/openclaw.d.ts +11 -0
  71. package/dist/readers/openclaw.d.ts.map +1 -0
  72. package/dist/readers/openclaw.js +267 -0
  73. package/dist/readers/openclaw.js.map +1 -0
  74. package/dist/server/dashboard.d.ts +2 -0
  75. package/dist/server/dashboard.d.ts.map +1 -0
  76. package/dist/server/dashboard.js +765 -0
  77. package/dist/server/dashboard.js.map +1 -0
  78. package/dist/server/index.d.ts +10 -0
  79. package/dist/server/index.d.ts.map +1 -0
  80. package/dist/server/index.js +28 -0
  81. package/dist/server/index.js.map +1 -0
  82. package/dist/server/routes.d.ts +6 -0
  83. package/dist/server/routes.d.ts.map +1 -0
  84. package/dist/server/routes.js +146 -0
  85. package/dist/server/routes.js.map +1 -0
  86. package/dist/server/sse.d.ts +21 -0
  87. package/dist/server/sse.d.ts.map +1 -0
  88. package/dist/server/sse.js +53 -0
  89. package/dist/server/sse.js.map +1 -0
  90. package/dist/watchers/files.d.ts +19 -0
  91. package/dist/watchers/files.d.ts.map +1 -0
  92. package/dist/watchers/files.js +105 -0
  93. package/dist/watchers/files.js.map +1 -0
  94. package/dist/watchers/gateway-adapter.d.ts +18 -0
  95. package/dist/watchers/gateway-adapter.d.ts.map +1 -0
  96. package/dist/watchers/gateway-adapter.js +273 -0
  97. package/dist/watchers/gateway-adapter.js.map +1 -0
  98. package/dist/watchers/gateway.d.ts +27 -0
  99. package/dist/watchers/gateway.d.ts.map +1 -0
  100. package/dist/watchers/gateway.js +131 -0
  101. package/dist/watchers/gateway.js.map +1 -0
  102. package/package.json +48 -0
@@ -0,0 +1,410 @@
1
+ import { DEFAULTS, } from "./types.js";
2
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
3
+ function makeAlertId(ruleId, fingerprint, ts) {
4
+ return `${ruleId}:${fingerprint}:${ts}`;
5
+ }
6
+ function pushWindow(ctx, name, entry) {
7
+ let window = ctx.state.windows.get(name);
8
+ if (!window) {
9
+ window = [];
10
+ ctx.state.windows.set(name, window);
11
+ }
12
+ window.push(entry);
13
+ // Evict old entries beyond max
14
+ if (window.length > DEFAULTS.maxWindowEntries) {
15
+ window.splice(0, window.length - DEFAULTS.maxWindowEntries);
16
+ }
17
+ }
18
+ function countInWindow(ctx, name, windowMs) {
19
+ const window = ctx.state.windows.get(name);
20
+ if (!window)
21
+ return 0;
22
+ const cutoff = ctx.now - windowMs;
23
+ return window.filter((e) => e.ts >= cutoff).length;
24
+ }
25
+ function sumInWindow(ctx, name, windowMs) {
26
+ const window = ctx.state.windows.get(name);
27
+ if (!window)
28
+ return 0;
29
+ const cutoff = ctx.now - windowMs;
30
+ let total = 0;
31
+ for (const entry of window) {
32
+ if (entry.ts >= cutoff) {
33
+ total += entry.value ?? 0;
34
+ }
35
+ }
36
+ return total;
37
+ }
38
+ function pushSummedBucket(ctx, name, value, bucketMs, maxEntries) {
39
+ if (!Number.isFinite(value) || value <= 0)
40
+ return;
41
+ const bucketTs = Math.floor(ctx.now / bucketMs) * bucketMs;
42
+ let window = ctx.state.windows.get(name);
43
+ if (!window) {
44
+ window = [];
45
+ ctx.state.windows.set(name, window);
46
+ }
47
+ const last = window[window.length - 1];
48
+ if (last && last.ts === bucketTs) {
49
+ last.value = (last.value ?? 0) + value;
50
+ }
51
+ else {
52
+ window.push({ ts: bucketTs, value });
53
+ }
54
+ if (window.length > maxEntries) {
55
+ window.splice(0, window.length - maxEntries);
56
+ }
57
+ }
58
+ function getRuleThreshold(ctx, ruleId, defaultVal) {
59
+ return ctx.config.rules?.[ruleId]?.threshold ?? defaultVal;
60
+ }
61
+ function isRuleEnabled(ctx, ruleId) {
62
+ return ctx.config.rules?.[ruleId]?.enabled !== false;
63
+ }
64
+ // ─── Rule: infra-errors (was: webhook-errors) ───────────────────────────────
65
+ const infraErrors = {
66
+ id: "infra-errors",
67
+ defaultCooldownMs: 15 * 60 * 1000,
68
+ defaultThreshold: 1,
69
+ evaluate(event, ctx) {
70
+ if (event.type !== "infra.error")
71
+ return null;
72
+ if (!isRuleEnabled(ctx, "infra-errors"))
73
+ return null;
74
+ const channel = event.channel ?? "unknown";
75
+ pushWindow(ctx, "infra-errors", { ts: ctx.now });
76
+ const threshold = getRuleThreshold(ctx, "infra-errors", 1);
77
+ const windowMs = 60 * 1000; // 1 minute
78
+ const count = countInWindow(ctx, "infra-errors", windowMs);
79
+ if (count < threshold)
80
+ return null;
81
+ const fingerprint = `infra-errors:${channel}`;
82
+ return {
83
+ type: "alert",
84
+ id: makeAlertId("infra-errors", fingerprint, ctx.now),
85
+ ruleId: "infra-errors",
86
+ severity: "error",
87
+ title: "Infrastructure errors spike",
88
+ detail: `${count} infra error(s) on ${channel} in the last minute.${event.error ? ` Last: ${event.error}` : ""}`,
89
+ ts: ctx.now,
90
+ fingerprint,
91
+ };
92
+ },
93
+ };
94
+ // ─── Rule: llm-errors (was: message-errors) ─────────────────────────────────
95
+ const llmErrors = {
96
+ id: "llm-errors",
97
+ defaultCooldownMs: 15 * 60 * 1000,
98
+ defaultThreshold: 1,
99
+ evaluate(event, ctx) {
100
+ // Trigger on LLM call/error events AND agent errors (agent failing before/during LLM call)
101
+ if (event.type !== "llm.call" && event.type !== "llm.error" && event.type !== "agent.error")
102
+ return null;
103
+ if (!isRuleEnabled(ctx, "llm-errors"))
104
+ return null;
105
+ // Stats are tracked in the evaluator (independent of rule state).
106
+ // Only proceed for actual errors:
107
+ if (event.type === "llm.call") {
108
+ // Only explicit error/timeout outcomes trigger alerting; undefined = OK
109
+ if (event.outcome !== "error" && event.outcome !== "timeout")
110
+ return null;
111
+ }
112
+ // llm.error and agent.error are always errors — no outcome check needed
113
+ const channel = event.channel ?? "unknown";
114
+ pushWindow(ctx, "llm-errors", { ts: ctx.now });
115
+ const threshold = getRuleThreshold(ctx, "llm-errors", 1);
116
+ const windowMs = 60 * 1000; // 1 minute
117
+ const count = countInWindow(ctx, "llm-errors", windowMs);
118
+ if (count < threshold)
119
+ return null;
120
+ const fingerprint = `llm-errors:${channel}`;
121
+ const label = event.type === "agent.error" ? "agent error(s)" : "LLM error(s)";
122
+ return {
123
+ type: "alert",
124
+ id: makeAlertId("llm-errors", fingerprint, ctx.now),
125
+ ruleId: "llm-errors",
126
+ severity: "error",
127
+ title: "LLM call errors",
128
+ detail: `${count} ${label} on ${channel} in the last minute.${event.error ? ` Last: ${event.error}` : ""}`,
129
+ ts: ctx.now,
130
+ fingerprint,
131
+ };
132
+ },
133
+ };
134
+ // ─── Rule: session-stuck ─────────────────────────────────────────────────────
135
+ const sessionStuck = {
136
+ id: "session-stuck",
137
+ defaultCooldownMs: 30 * 60 * 1000,
138
+ defaultThreshold: 120_000, // 120 seconds
139
+ evaluate(event, ctx) {
140
+ if (event.type !== "session.stuck")
141
+ return null;
142
+ if (!isRuleEnabled(ctx, "session-stuck"))
143
+ return null;
144
+ // Stats tracked in evaluator (independent of rule state)
145
+ const ageMs = event.ageMs ?? 0;
146
+ const threshold = getRuleThreshold(ctx, "session-stuck", 120_000);
147
+ if (ageMs < threshold)
148
+ return null;
149
+ const sessionKey = event.sessionKey ?? "unknown";
150
+ const fingerprint = `session-stuck:${sessionKey}`;
151
+ const ageSec = Math.round(ageMs / 1000);
152
+ return {
153
+ type: "alert",
154
+ id: makeAlertId("session-stuck", fingerprint, ctx.now),
155
+ ruleId: "session-stuck",
156
+ severity: "warn",
157
+ title: "Session stuck",
158
+ detail: `Session ${sessionKey} stuck in processing for ${ageSec}s.`,
159
+ ts: ctx.now,
160
+ fingerprint,
161
+ };
162
+ },
163
+ };
164
+ // ─── Rule: heartbeat-fail ────────────────────────────────────────────────────
165
+ const heartbeatFail = {
166
+ id: "heartbeat-fail",
167
+ defaultCooldownMs: 30 * 60 * 1000,
168
+ defaultThreshold: 3, // consecutive failures
169
+ evaluate(event, ctx) {
170
+ if (event.type !== "infra.heartbeat")
171
+ return null;
172
+ if (!isRuleEnabled(ctx, "heartbeat-fail"))
173
+ return null;
174
+ const counterKey = "heartbeat-consecutive-fail";
175
+ if (event.outcome === "error") {
176
+ const count = (ctx.state.consecutives.get(counterKey) ?? 0) + 1;
177
+ ctx.state.consecutives.set(counterKey, count);
178
+ const threshold = getRuleThreshold(ctx, "heartbeat-fail", 3);
179
+ if (count < threshold)
180
+ return null;
181
+ const channel = event.channel ?? "";
182
+ const fingerprint = `heartbeat-fail:${channel}`;
183
+ return {
184
+ type: "alert",
185
+ id: makeAlertId("heartbeat-fail", fingerprint, ctx.now),
186
+ ruleId: "heartbeat-fail",
187
+ severity: "error",
188
+ title: "Heartbeat delivery failing",
189
+ detail: `${count} consecutive heartbeat failures.${channel ? ` Channel: ${channel}.` : ""}`,
190
+ ts: ctx.now,
191
+ fingerprint,
192
+ };
193
+ }
194
+ // Reset on any non-error (success, undefined, etc.)
195
+ ctx.state.consecutives.set(counterKey, 0);
196
+ return null;
197
+ },
198
+ };
199
+ // ─── Rule: queue-depth ───────────────────────────────────────────────────────
200
+ const queueDepth = {
201
+ id: "queue-depth",
202
+ defaultCooldownMs: 15 * 60 * 1000,
203
+ defaultThreshold: 10,
204
+ evaluate(event, ctx) {
205
+ // Fire on heartbeat (which carries queue depth) and dedicated queue_depth events
206
+ if (event.type !== "infra.heartbeat" && event.type !== "infra.queue_depth")
207
+ return null;
208
+ // Always update heartbeat timestamp regardless of rule state (gateway-down depends on it)
209
+ if (event.type === "infra.heartbeat") {
210
+ ctx.state.lastHeartbeatTs = ctx.now;
211
+ }
212
+ if (!isRuleEnabled(ctx, "queue-depth"))
213
+ return null;
214
+ const queued = event.queueDepth ?? 0;
215
+ const threshold = getRuleThreshold(ctx, "queue-depth", 10);
216
+ if (queued < threshold)
217
+ return null;
218
+ const fingerprint = "queue-depth";
219
+ return {
220
+ type: "alert",
221
+ id: makeAlertId("queue-depth", fingerprint, ctx.now),
222
+ ruleId: "queue-depth",
223
+ severity: "warn",
224
+ title: "Queue depth high",
225
+ detail: `${queued} items queued for processing.`,
226
+ ts: ctx.now,
227
+ fingerprint,
228
+ };
229
+ },
230
+ };
231
+ // ─── Rule: high-error-rate ───────────────────────────────────────────────────
232
+ const highErrorRate = {
233
+ id: "high-error-rate",
234
+ defaultCooldownMs: 30 * 60 * 1000,
235
+ defaultThreshold: 50, // percent
236
+ evaluate(event, ctx) {
237
+ if (event.type !== "llm.call" && event.type !== "llm.error" && event.type !== "agent.error")
238
+ return null;
239
+ if (!isRuleEnabled(ctx, "high-error-rate"))
240
+ return null;
241
+ // agent.error and llm.error are always errors; llm.call checks outcome (timeout counts as error)
242
+ const isError = event.type === "agent.error" ||
243
+ event.type === "llm.error" ||
244
+ event.outcome === "error" ||
245
+ event.outcome === "timeout";
246
+ pushWindow(ctx, "msg-outcomes", { ts: ctx.now, value: isError ? 1 : 0 });
247
+ const window = ctx.state.windows.get("msg-outcomes");
248
+ if (!window || window.length < 20)
249
+ return null; // Need 20 messages minimum
250
+ // Check last 20 messages
251
+ const recent = window.slice(-20);
252
+ const errors = recent.filter((e) => e.value === 1).length;
253
+ const rate = (errors / recent.length) * 100;
254
+ const threshold = getRuleThreshold(ctx, "high-error-rate", 50);
255
+ if (rate < threshold)
256
+ return null;
257
+ const fingerprint = "high-error-rate";
258
+ return {
259
+ type: "alert",
260
+ id: makeAlertId("high-error-rate", fingerprint, ctx.now),
261
+ ruleId: "high-error-rate",
262
+ severity: "error",
263
+ title: "High error rate",
264
+ detail: `${Math.round(rate)}% of the last ${recent.length} messages failed.`,
265
+ ts: ctx.now,
266
+ fingerprint,
267
+ };
268
+ },
269
+ };
270
+ // ─── Rule: cost-hourly-spike ────────────────────────────────────────────────
271
+ const costHourlySpike = {
272
+ id: "cost-hourly-spike",
273
+ defaultCooldownMs: 30 * 60 * 1000,
274
+ defaultThreshold: 5.0, // USD
275
+ evaluate(event, ctx) {
276
+ if (event.type !== "llm.token_usage")
277
+ return null;
278
+ if (!isRuleEnabled(ctx, "cost-hourly-spike"))
279
+ return null;
280
+ if (typeof event.costUsd !== "number" || !Number.isFinite(event.costUsd))
281
+ return null;
282
+ // Aggregate per-minute to keep 60m sums accurate under high event throughput.
283
+ pushSummedBucket(ctx, "cost-hourly-spike-usd", event.costUsd, 60_000, 120);
284
+ const hourlyUsd = sumInWindow(ctx, "cost-hourly-spike-usd", 60 * 60 * 1000);
285
+ const threshold = getRuleThreshold(ctx, "cost-hourly-spike", 5.0);
286
+ if (hourlyUsd <= threshold)
287
+ return null; // must exceed threshold
288
+ const fingerprint = "cost-hourly-spike";
289
+ return {
290
+ type: "alert",
291
+ id: makeAlertId("cost-hourly-spike", fingerprint, ctx.now),
292
+ ruleId: "cost-hourly-spike",
293
+ severity: "warn",
294
+ title: "Hourly LLM spend spike",
295
+ detail: `LLM spend reached $${hourlyUsd.toFixed(2)} in the last 60 minutes (threshold: $${threshold.toFixed(2)}).`,
296
+ ts: ctx.now,
297
+ fingerprint,
298
+ };
299
+ },
300
+ };
301
+ // ─── Rule: cost-daily-budget ────────────────────────────────────────────────
302
+ const costDailyBudget = {
303
+ id: "cost-daily-budget",
304
+ defaultCooldownMs: 6 * 60 * 60 * 1000,
305
+ defaultThreshold: 20.0, // USD
306
+ evaluate(event, ctx) {
307
+ if (event.type !== "llm.token_usage")
308
+ return null;
309
+ if (!isRuleEnabled(ctx, "cost-daily-budget"))
310
+ return null;
311
+ if (typeof event.costUsd !== "number" || !Number.isFinite(event.costUsd))
312
+ return null;
313
+ // Aggregate per-minute and retain >24h buckets for boundary-safe sums.
314
+ pushSummedBucket(ctx, "cost-daily-budget-usd", event.costUsd, 60_000, 1_500);
315
+ const dailyUsd = sumInWindow(ctx, "cost-daily-budget-usd", 24 * 60 * 60 * 1000);
316
+ const threshold = getRuleThreshold(ctx, "cost-daily-budget", 20.0);
317
+ if (dailyUsd <= threshold)
318
+ return null; // must exceed threshold
319
+ const fingerprint = "cost-daily-budget";
320
+ return {
321
+ type: "alert",
322
+ id: makeAlertId("cost-daily-budget", fingerprint, ctx.now),
323
+ ruleId: "cost-daily-budget",
324
+ severity: "error",
325
+ title: "Daily LLM budget exceeded",
326
+ detail: `LLM spend reached $${dailyUsd.toFixed(2)} in the last 24 hours (threshold: $${threshold.toFixed(2)}).`,
327
+ ts: ctx.now,
328
+ fingerprint,
329
+ };
330
+ },
331
+ };
332
+ // ─── Rule: tool-errors ───────────────────────────────────────────────────
333
+ const toolErrors = {
334
+ id: "tool-errors",
335
+ defaultCooldownMs: 15 * 60 * 1000,
336
+ defaultThreshold: 1, // 1 tool error in 1 minute
337
+ evaluate(event, ctx) {
338
+ if (event.type !== "tool.error")
339
+ return null;
340
+ if (!isRuleEnabled(ctx, "tool-errors"))
341
+ return null;
342
+ pushWindow(ctx, "tool-errors", { ts: ctx.now });
343
+ const threshold = getRuleThreshold(ctx, "tool-errors", 1);
344
+ const windowMs = 60 * 1000; // 1 minute
345
+ const count = countInWindow(ctx, "tool-errors", windowMs);
346
+ if (count < threshold)
347
+ return null;
348
+ const toolName = event.meta?.toolName ?? "unknown";
349
+ const fingerprint = `tool-errors:${toolName}`;
350
+ return {
351
+ type: "alert",
352
+ id: makeAlertId("tool-errors", fingerprint, ctx.now),
353
+ ruleId: "tool-errors",
354
+ severity: "warn",
355
+ title: "Tool errors spike",
356
+ detail: `${count} tool error(s) in the last minute.${event.error ? ` Last: ${event.error}` : ""}`,
357
+ ts: ctx.now,
358
+ fingerprint,
359
+ };
360
+ },
361
+ };
362
+ // ─── Rule: gateway-down ──────────────────────────────────────────────────────
363
+ const gatewayDown = {
364
+ id: "gateway-down",
365
+ defaultCooldownMs: 60 * 60 * 1000,
366
+ defaultThreshold: 30_000, // 30 seconds
367
+ evaluate(event, ctx) {
368
+ // This rule is called by the watchdog timer, not by events directly.
369
+ if (event.type !== "watchdog.tick")
370
+ return null;
371
+ if (!isRuleEnabled(ctx, "gateway-down"))
372
+ return null;
373
+ if (ctx.state.lastHeartbeatTs === 0)
374
+ return null; // No heartbeat received yet
375
+ const silenceMs = ctx.now - ctx.state.lastHeartbeatTs;
376
+ const threshold = getRuleThreshold(ctx, "gateway-down", DEFAULTS.gatewayDownThresholdMs);
377
+ if (silenceMs < threshold)
378
+ return null;
379
+ const fingerprint = "gateway-down";
380
+ const silenceSec = Math.round(silenceMs / 1000);
381
+ const lastTime = new Date(ctx.state.lastHeartbeatTs).toLocaleTimeString([], {
382
+ hour: "2-digit",
383
+ minute: "2-digit",
384
+ });
385
+ return {
386
+ type: "alert",
387
+ id: makeAlertId("gateway-down", fingerprint, ctx.now),
388
+ ruleId: "gateway-down",
389
+ severity: "critical",
390
+ title: "Gateway unresponsive",
391
+ detail: `No heartbeat received for ${silenceSec}s. Last successful: ${lastTime}.`,
392
+ ts: ctx.now,
393
+ fingerprint,
394
+ };
395
+ },
396
+ };
397
+ // ─── Export all rules ────────────────────────────────────────────────────────
398
+ export const ALL_RULES = [
399
+ infraErrors,
400
+ llmErrors,
401
+ sessionStuck,
402
+ heartbeatFail,
403
+ queueDepth,
404
+ highErrorRate,
405
+ costHourlySpike,
406
+ costDailyBudget,
407
+ toolErrors,
408
+ gatewayDown,
409
+ ];
410
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/core/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { StoredEvent } from "./types.js";
2
+ export declare function appendEvent(stateDir: string, event: StoredEvent): void;
3
+ export declare function readAllEvents(stateDir: string): StoredEvent[];
4
+ export declare function readRecentEvents(stateDir: string, limit?: number): StoredEvent[];
5
+ export declare function pruneLog(stateDir: string, opts: {
6
+ maxAgeMs: number;
7
+ maxSizeKb: number;
8
+ }): void;
9
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAItE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAO7D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE,CAG5E;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA6B9F"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * JSONL persistence for openalerts.
3
+ * Keeps a flat events.jsonl alongside SQLite as a backup/audit log.
4
+ */
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { LOG_FILENAME } from "./types.js";
8
+ export function appendEvent(stateDir, event) {
9
+ const logPath = path.join(stateDir, LOG_FILENAME);
10
+ fs.mkdirSync(stateDir, { recursive: true });
11
+ fs.appendFileSync(logPath, JSON.stringify(event) + "\n");
12
+ }
13
+ export function readAllEvents(stateDir) {
14
+ const logPath = path.join(stateDir, LOG_FILENAME);
15
+ if (!fs.existsSync(logPath))
16
+ return [];
17
+ const lines = fs.readFileSync(logPath, "utf8").split("\n").filter(Boolean);
18
+ return lines.slice(-1000).map(l => {
19
+ try {
20
+ return JSON.parse(l);
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }).filter(Boolean);
26
+ }
27
+ export function readRecentEvents(stateDir, limit = 50) {
28
+ const all = readAllEvents(stateDir);
29
+ return all.slice(-limit);
30
+ }
31
+ export function pruneLog(stateDir, opts) {
32
+ const logPath = path.join(stateDir, LOG_FILENAME);
33
+ if (!fs.existsSync(logPath))
34
+ return;
35
+ const stat = fs.statSync(logPath);
36
+ const cutoff = Date.now() - opts.maxAgeMs;
37
+ const oversized = stat.size > opts.maxSizeKb * 1024;
38
+ if (!oversized) {
39
+ const lines = fs.readFileSync(logPath, "utf8").split("\n").filter(Boolean);
40
+ const fresh = lines.filter(l => {
41
+ try {
42
+ return JSON.parse(l).ts >= cutoff;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ });
48
+ if (fresh.length === lines.length)
49
+ return;
50
+ const tmp = logPath + ".tmp";
51
+ fs.writeFileSync(tmp, fresh.join("\n") + "\n");
52
+ fs.renameSync(tmp, logPath);
53
+ return;
54
+ }
55
+ // Oversized: keep last 500 lines
56
+ const lines = fs.readFileSync(logPath, "utf8").split("\n").filter(Boolean);
57
+ const keep = lines.slice(-500);
58
+ const tmp = logPath + ".tmp";
59
+ fs.writeFileSync(tmp, keep.join("\n") + "\n");
60
+ try {
61
+ fs.renameSync(tmp, logPath);
62
+ }
63
+ catch {
64
+ // Windows rename fallback
65
+ fs.writeFileSync(logPath, keep.join("\n") + "\n");
66
+ try {
67
+ fs.unlinkSync(tmp);
68
+ }
69
+ catch { /* ignore */ }
70
+ }
71
+ }
72
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"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"}