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,168 @@
1
+ import { ALL_RULES } from "./rules.js";
2
+ import { DEFAULTS, } from "./types.js";
3
+ /** Create a fresh evaluator state. */
4
+ export function createEvaluatorState() {
5
+ const now = Date.now();
6
+ return {
7
+ windows: new Map(),
8
+ cooldowns: new Map(),
9
+ consecutives: new Map(),
10
+ hourlyAlerts: { count: 0, resetAt: now + 60 * 60 * 1000 },
11
+ lastHeartbeatTs: 0,
12
+ startedAt: now,
13
+ stats: {
14
+ messagesProcessed: 0,
15
+ messageErrors: 0,
16
+ messagesReceived: 0,
17
+ webhookErrors: 0,
18
+ stuckSessions: 0,
19
+ toolCalls: 0,
20
+ toolErrors: 0,
21
+ agentStarts: 0,
22
+ agentErrors: 0,
23
+ sessionsStarted: 0,
24
+ compactions: 0,
25
+ totalTokens: 0,
26
+ totalCostUsd: 0,
27
+ lastResetTs: now,
28
+ },
29
+ };
30
+ }
31
+ /**
32
+ * Warm the evaluator state from persisted events.
33
+ * Replays recent events to rebuild windows/counters without re-firing alerts.
34
+ */
35
+ export function warmFromHistory(state, events) {
36
+ for (const event of events) {
37
+ if (event.type === "alert") {
38
+ // Restore cooldowns from recent alerts
39
+ state.cooldowns.set(event.fingerprint, event.ts);
40
+ }
41
+ // Don't replay diagnostic/heartbeat events through rules —
42
+ // that would re-fire alerts. Just restore cooldown state.
43
+ }
44
+ }
45
+ /**
46
+ * Process a single event through all rules.
47
+ * Returns alerts that should be fired (already filtered by cooldown + hourly cap).
48
+ */
49
+ export function processEvent(state, config, event) {
50
+ const now = Date.now();
51
+ // Reset 24h stats daily
52
+ if (now - state.stats.lastResetTs > 24 * 60 * 60 * 1000) {
53
+ state.stats.messagesProcessed = 0;
54
+ state.stats.messageErrors = 0;
55
+ state.stats.messagesReceived = 0;
56
+ state.stats.webhookErrors = 0;
57
+ state.stats.stuckSessions = 0;
58
+ state.stats.toolCalls = 0;
59
+ state.stats.toolErrors = 0;
60
+ state.stats.agentStarts = 0;
61
+ state.stats.agentErrors = 0;
62
+ state.stats.sessionsStarted = 0;
63
+ state.stats.compactions = 0;
64
+ state.stats.totalTokens = 0;
65
+ state.stats.totalCostUsd = 0;
66
+ state.stats.lastResetTs = now;
67
+ }
68
+ // Track event types in stats (independent of rule enabled state)
69
+ if (event.type === "infra.error") {
70
+ state.stats.webhookErrors++;
71
+ }
72
+ if (event.type === "tool.call" || event.type === "tool.error") {
73
+ state.stats.toolCalls++;
74
+ if (event.type === "tool.error")
75
+ state.stats.toolErrors++;
76
+ }
77
+ if (event.type === "agent.start") {
78
+ state.stats.agentStarts++;
79
+ }
80
+ if (event.type === "agent.error") {
81
+ state.stats.agentErrors++;
82
+ }
83
+ if (event.type === "session.start") {
84
+ state.stats.sessionsStarted++;
85
+ }
86
+ if (event.type === "session.stuck") {
87
+ state.stats.stuckSessions++;
88
+ }
89
+ if (event.type === "llm.call" || event.type === "llm.error" || event.type === "agent.error") {
90
+ state.stats.messagesProcessed++;
91
+ if (event.type === "llm.error" || event.type === "agent.error" ||
92
+ event.outcome === "error" || event.outcome === "timeout") {
93
+ state.stats.messageErrors++;
94
+ }
95
+ }
96
+ if (event.type === "llm.token_usage") {
97
+ if (typeof event.tokenCount === "number")
98
+ state.stats.totalTokens += event.tokenCount;
99
+ if (typeof event.costUsd === "number")
100
+ state.stats.totalCostUsd += event.costUsd;
101
+ }
102
+ if (event.type === "custom" && event.meta?.openclawHook === "message_received") {
103
+ state.stats.messagesReceived++;
104
+ }
105
+ if (event.type === "custom" && event.meta?.compaction === true) {
106
+ state.stats.compactions++;
107
+ }
108
+ // Reset hourly cap if expired
109
+ if (now >= state.hourlyAlerts.resetAt) {
110
+ state.hourlyAlerts.count = 0;
111
+ state.hourlyAlerts.resetAt = now + 60 * 60 * 1000;
112
+ }
113
+ const ctx = { state, config, now };
114
+ const fired = [];
115
+ for (const rule of ALL_RULES) {
116
+ let alert;
117
+ try {
118
+ alert = rule.evaluate(event, ctx);
119
+ }
120
+ catch {
121
+ // One broken rule must never block the rest
122
+ continue;
123
+ }
124
+ if (!alert)
125
+ continue;
126
+ // Check cooldown
127
+ const cooldownMs = resolveCooldownMs(config, rule);
128
+ const lastFired = state.cooldowns.get(alert.fingerprint);
129
+ if (lastFired && now - lastFired < cooldownMs)
130
+ continue;
131
+ // Check hourly cap
132
+ if (state.hourlyAlerts.count >= DEFAULTS.maxAlertsPerHour)
133
+ continue;
134
+ // Fire the alert
135
+ state.cooldowns.set(alert.fingerprint, now);
136
+ state.hourlyAlerts.count++;
137
+ fired.push(alert);
138
+ }
139
+ // Prune cooldown map if too large
140
+ if (state.cooldowns.size > DEFAULTS.maxCooldownEntries) {
141
+ const entries = [...state.cooldowns.entries()].sort((a, b) => a[1] - b[1]);
142
+ const toRemove = entries.slice(0, entries.length - DEFAULTS.maxCooldownEntries);
143
+ for (const [key] of toRemove) {
144
+ state.cooldowns.delete(key);
145
+ }
146
+ }
147
+ return fired;
148
+ }
149
+ /**
150
+ * Run the watchdog tick — checks for gateway-down condition.
151
+ * Called every 30 seconds by the engine timer.
152
+ */
153
+ export function processWatchdogTick(state, config) {
154
+ return processEvent(state, config, { type: "watchdog.tick", ts: Date.now() });
155
+ }
156
+ /** Resolve the effective cooldown for a rule. */
157
+ function resolveCooldownMs(config, rule) {
158
+ const override = config.rules?.[rule.id]?.cooldownMinutes;
159
+ if (typeof override === "number" && override > 0) {
160
+ return override * 60 * 1000;
161
+ }
162
+ const globalOverride = config.cooldownMinutes;
163
+ if (typeof globalOverride === "number" && globalOverride > 0) {
164
+ return globalOverride * 60 * 1000;
165
+ }
166
+ return rule.defaultCooldownMs;
167
+ }
168
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/core/evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { OpenAlertsEvent } from "./types.js";
2
+ export type EventListener = (event: OpenAlertsEvent) => void;
3
+ /**
4
+ * Simple pub/sub event bus for OpenAlertsEvents.
5
+ * Replaces framework-specific event subscriptions (e.g., OpenClaw's onDiagnosticEvent).
6
+ */
7
+ export declare class OpenAlertsEventBus {
8
+ private listeners;
9
+ /** Subscribe to all events. Returns an unsubscribe function. */
10
+ on(listener: EventListener): () => void;
11
+ /** Emit an event to all listeners. Errors in listeners are caught and logged. */
12
+ emit(event: OpenAlertsEvent): void;
13
+ /** Remove all listeners. */
14
+ clear(): void;
15
+ /** Current listener count. */
16
+ get size(): number;
17
+ }
18
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAE7D;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAA4B;IAE7C,gEAAgE;IAChE,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAKvC,iFAAiF;IACjF,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAUlC,4BAA4B;IAC5B,KAAK,IAAI,IAAI;IAIb,8BAA8B;IAC9B,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Simple pub/sub event bus for OpenAlertsEvents.
3
+ * Replaces framework-specific event subscriptions (e.g., OpenClaw's onDiagnosticEvent).
4
+ */
5
+ export class OpenAlertsEventBus {
6
+ listeners = new Set();
7
+ /** Subscribe to all events. Returns an unsubscribe function. */
8
+ on(listener) {
9
+ this.listeners.add(listener);
10
+ return () => { this.listeners.delete(listener); };
11
+ }
12
+ /** Emit an event to all listeners. Errors in listeners are caught and logged. */
13
+ emit(event) {
14
+ for (const listener of this.listeners) {
15
+ try {
16
+ listener(event);
17
+ }
18
+ catch (err) {
19
+ console.error("[openalerts] event listener error:", err);
20
+ }
21
+ }
22
+ }
23
+ /** Remove all listeners. */
24
+ clear() {
25
+ this.listeners.clear();
26
+ }
27
+ /** Current listener count. */
28
+ get size() {
29
+ return this.listeners.size;
30
+ }
31
+ }
32
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE7C,gEAAgE;IAChE,EAAE,CAAC,QAAuB;QACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC,KAAsB;QACzB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,8BAA8B;IAC9B,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { AlertEvent, EvaluatorState, StoredEvent } from "./types.js";
2
+ export declare function formatAlertMessage(alert: AlertEvent, opts?: {
3
+ diagnosisHint?: string;
4
+ }): string;
5
+ export declare function formatHealthOutput(opts: {
6
+ state: EvaluatorState;
7
+ channelActivity: Array<{
8
+ channel: string;
9
+ lastInbound: number | null;
10
+ }>;
11
+ activeAlerts: AlertEvent[];
12
+ platformConnected: boolean;
13
+ }): string;
14
+ export declare function formatAlertsOutput(events: StoredEvent[]): string;
15
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/core/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI1E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAa/F;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,KAAK,EAAE,cAAc,CAAC;IACtB,eAAe,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACxE,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,MAAM,CAqET;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAsChE"}
@@ -0,0 +1,125 @@
1
+ // ─── Alert Messages (sent to user's channel) ────────────────────────────────
2
+ export function formatAlertMessage(alert, opts) {
3
+ const prefix = alert.severity === "critical"
4
+ ? "[OpenAlerts] CRITICAL: "
5
+ : "[OpenAlerts] ";
6
+ const lines = [prefix + alert.title, "", alert.detail, "", "/health for full status."];
7
+ if (alert.severity === "critical" && opts?.diagnosisHint) {
8
+ lines[lines.length - 1] = opts.diagnosisHint;
9
+ }
10
+ return lines.join("\n");
11
+ }
12
+ // ─── /health Command Output ──────────────────────────────────────────────────
13
+ export function formatHealthOutput(opts) {
14
+ const { state, channelActivity, activeAlerts, platformConnected } = opts;
15
+ const uptime = formatDuration(Date.now() - state.startedAt);
16
+ const heartbeatAgo = state.lastHeartbeatTs > 0
17
+ ? `${formatDuration(Date.now() - state.lastHeartbeatTs)} ago`
18
+ : "none yet";
19
+ const status = activeAlerts.length > 0 ? "DEGRADED" : "OK";
20
+ const lines = [
21
+ "System Health -- OpenAlerts",
22
+ "",
23
+ `Status: ${status}`,
24
+ `Uptime: ${uptime} | Last heartbeat: ${heartbeatAgo}`,
25
+ ];
26
+ // Active alerts
27
+ if (activeAlerts.length > 0) {
28
+ lines.push("");
29
+ lines.push(`!! ${activeAlerts.length} active alert${activeAlerts.length > 1 ? "s" : ""}:`);
30
+ for (const a of activeAlerts.slice(0, 5)) {
31
+ const ago = formatDuration(Date.now() - a.ts);
32
+ lines.push(` [${a.severity.toUpperCase()}] ${a.title} (${ago} ago)`);
33
+ }
34
+ }
35
+ // Channel activity
36
+ if (channelActivity.length > 0) {
37
+ lines.push("");
38
+ lines.push("Channels:");
39
+ for (const ch of channelActivity) {
40
+ const ago = ch.lastInbound
41
+ ? `active (${formatDuration(Date.now() - ch.lastInbound)} ago)`
42
+ : "no activity";
43
+ lines.push(` ${ch.channel.padEnd(10)}: ${ago}`);
44
+ }
45
+ }
46
+ // 24h stats
47
+ lines.push("");
48
+ const s = state.stats;
49
+ const rcvd = s.messagesReceived > 0 ? `, ${s.messagesReceived} received` : "";
50
+ lines.push(`24h: ${s.messagesProcessed} msgs processed${rcvd}, ${s.messageErrors} errors, ${s.stuckSessions} stuck`);
51
+ if (s.toolCalls > 0 || s.agentStarts > 0 || s.sessionsStarted > 0) {
52
+ const parts = [];
53
+ if (s.toolCalls > 0)
54
+ parts.push(`${s.toolCalls} tools${s.toolErrors > 0 ? ` (${s.toolErrors} err)` : ""}`);
55
+ if (s.agentStarts > 0)
56
+ parts.push(`${s.agentStarts} agents${s.agentErrors > 0 ? ` (${s.agentErrors} err)` : ""}`);
57
+ if (s.sessionsStarted > 0)
58
+ parts.push(`${s.sessionsStarted} sessions`);
59
+ if (s.compactions > 0)
60
+ parts.push(`${s.compactions} compactions`);
61
+ lines.push(` ${parts.join(", ")}`);
62
+ }
63
+ if (s.totalTokens > 0) {
64
+ const tokenStr = s.totalTokens >= 1000 ? `${(s.totalTokens / 1000).toFixed(1)}k` : `${s.totalTokens}`;
65
+ const costStr = s.totalCostUsd > 0 ? ` ($${s.totalCostUsd.toFixed(4)})` : "";
66
+ lines.push(` ${tokenStr} tokens${costStr}`);
67
+ }
68
+ // Platform
69
+ lines.push("");
70
+ lines.push(platformConnected
71
+ ? "Platform: connected (openalerts.dev)"
72
+ : "Platform: not connected (add apiKey for diagnosis)");
73
+ return lines.join("\n");
74
+ }
75
+ // ─── /alerts Command Output ──────────────────────────────────────────────────
76
+ export function formatAlertsOutput(events) {
77
+ const alerts = events.filter((e) => e.type === "alert");
78
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
79
+ const recent = alerts.filter((a) => a.ts >= cutoff);
80
+ if (recent.length === 0) {
81
+ return [
82
+ "Recent Alerts",
83
+ "",
84
+ "No alerts in the last 24h. All systems normal.",
85
+ ].join("\n");
86
+ }
87
+ const lines = [
88
+ `Recent Alerts (${recent.length} in 24h)`,
89
+ "",
90
+ ];
91
+ // Show most recent first, cap at 10
92
+ const shown = recent.slice(-10).reverse();
93
+ for (const alert of shown) {
94
+ const time = new Date(alert.ts).toLocaleTimeString([], {
95
+ hour: "2-digit",
96
+ minute: "2-digit",
97
+ });
98
+ lines.push(`[${alert.severity.toUpperCase()}] ${time} -- ${alert.title}`);
99
+ lines.push(` ${alert.detail}`);
100
+ lines.push("");
101
+ }
102
+ if (recent.length > 10) {
103
+ lines.push(`Showing 10 of ${recent.length} alerts.`);
104
+ }
105
+ return lines.join("\n").trimEnd();
106
+ }
107
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
108
+ function formatDuration(ms) {
109
+ if (ms < 0)
110
+ ms = 0;
111
+ const sec = Math.floor(ms / 1000);
112
+ if (sec < 60)
113
+ return `${sec}s`;
114
+ const min = Math.floor(sec / 60);
115
+ if (min < 60)
116
+ return `${min}m`;
117
+ const hr = Math.floor(min / 60);
118
+ const remainMin = min % 60;
119
+ if (hr < 24)
120
+ return remainMin > 0 ? `${hr}h ${remainMin}m` : `${hr}h`;
121
+ const days = Math.floor(hr / 24);
122
+ const remainHr = hr % 24;
123
+ return remainHr > 0 ? `${days}d ${remainHr}h` : `${days}d`;
124
+ }
125
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/core/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type AlertRuleDefinition } from "./types.js";
2
+ export declare const ALL_RULES: AlertRuleDefinition[];
3
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/core/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,mBAAmB,EAIxB,MAAM,YAAY,CAAC;AAmepB,eAAO,MAAM,SAAS,EAAE,mBAAmB,EAW1C,CAAC"}