@steadwing/openalerts 0.2.6 → 0.2.8

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 (55) hide show
  1. package/dist/cli.js +7 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/collections/collection-manager.d.ts +50 -0
  4. package/dist/collections/collection-manager.js +583 -0
  5. package/dist/collections/event-parser.d.ts +27 -0
  6. package/dist/collections/event-parser.js +321 -0
  7. package/dist/collections/index.d.ts +6 -0
  8. package/dist/collections/index.js +6 -0
  9. package/dist/collections/persistence.d.ts +25 -0
  10. package/dist/collections/persistence.js +213 -0
  11. package/dist/collections/types.d.ts +177 -0
  12. package/dist/collections/types.js +15 -0
  13. package/dist/core/index.d.ts +13 -0
  14. package/dist/core/index.js +23 -0
  15. package/dist/core/llm-enrichment.d.ts +21 -0
  16. package/dist/core/llm-enrichment.js +180 -0
  17. package/dist/core/platform.d.ts +17 -0
  18. package/dist/core/platform.js +93 -0
  19. package/dist/db/queries.d.ts.map +1 -1
  20. package/dist/db/queries.js +11 -5
  21. package/dist/db/queries.js.map +1 -1
  22. package/dist/index.d.ts +8 -0
  23. package/dist/index.js +600 -0
  24. package/dist/mcp/client.d.ts +52 -0
  25. package/dist/mcp/client.d.ts.map +1 -0
  26. package/dist/mcp/client.js +172 -0
  27. package/dist/mcp/client.js.map +1 -0
  28. package/dist/mcp/index.d.ts +5 -0
  29. package/dist/mcp/index.d.ts.map +1 -0
  30. package/dist/mcp/index.js +164 -0
  31. package/dist/mcp/index.js.map +1 -0
  32. package/dist/mcp/resources.d.ts +13 -0
  33. package/dist/mcp/resources.d.ts.map +1 -0
  34. package/dist/mcp/resources.js +99 -0
  35. package/dist/mcp/resources.js.map +1 -0
  36. package/dist/mcp/tools.d.ts +80 -0
  37. package/dist/mcp/tools.d.ts.map +1 -0
  38. package/dist/mcp/tools.js +304 -0
  39. package/dist/mcp/tools.js.map +1 -0
  40. package/dist/plugin/adapter.d.ts +150 -0
  41. package/dist/plugin/adapter.js +530 -0
  42. package/dist/plugin/commands.d.ts +18 -0
  43. package/dist/plugin/commands.js +103 -0
  44. package/dist/plugin/dashboard-html.d.ts +7 -0
  45. package/dist/plugin/dashboard-html.js +968 -0
  46. package/dist/plugin/dashboard-routes.d.ts +12 -0
  47. package/dist/plugin/dashboard-routes.js +444 -0
  48. package/dist/plugin/gateway-client.d.ts +39 -0
  49. package/dist/plugin/gateway-client.js +200 -0
  50. package/dist/plugin/log-bridge.d.ts +22 -0
  51. package/dist/plugin/log-bridge.js +363 -0
  52. package/dist/watchers/gateway-adapter.d.ts.map +1 -1
  53. package/dist/watchers/gateway-adapter.js +2 -1
  54. package/dist/watchers/gateway-adapter.js.map +1 -1
  55. package/package.json +2 -1
@@ -0,0 +1,304 @@
1
+ // ── Static rule catalogue (for get_rule_states when daemon is offline) ───────
2
+ const RULE_CATALOGUE = [
3
+ { id: "infra-errors", severity: "error", defaultThreshold: 1, defaultCooldownMin: 15, description: "Infrastructure errors spike (>= N in 1 min)" },
4
+ { id: "llm-errors", severity: "error", defaultThreshold: 1, defaultCooldownMin: 15, description: "LLM / agent call errors (>= N in 1 min)" },
5
+ { id: "session-stuck", severity: "warn", defaultThreshold: 120, defaultCooldownMin: 30, description: "Session inactive for >= N seconds" },
6
+ { id: "heartbeat-fail", severity: "error", defaultThreshold: 3, defaultCooldownMin: 30, description: ">= N consecutive heartbeat failures" },
7
+ { id: "queue-depth", severity: "warn", defaultThreshold: 10, defaultCooldownMin: 15, description: "Delivery queue >= N items" },
8
+ { id: "high-error-rate", severity: "error", defaultThreshold: 50, defaultCooldownMin: 30, description: ">= N% of last 20 LLM calls failed" },
9
+ { id: "cost-hourly-spike", severity: "warn", defaultThreshold: 5, defaultCooldownMin: 30, description: "LLM spend >= $N in last 60 minutes" },
10
+ { id: "cost-daily-budget", severity: "error", defaultThreshold: 20, defaultCooldownMin: 360, description: "LLM spend >= $N in last 24 hours" },
11
+ { id: "tool-errors", severity: "warn", defaultThreshold: 1, defaultCooldownMin: 15, description: "Tool execution errors (>= N in 1 min)" },
12
+ { id: "gateway-down", severity: "critical", defaultThreshold: 30, defaultCooldownMin: 60, description: "No gateway heartbeat for >= N seconds" },
13
+ ];
14
+ // ── Helpers ───────────────────────────────────────────────────────────────────
15
+ function text(content) {
16
+ return { content: [{ type: "text", text: content }] };
17
+ }
18
+ function ts(ms) {
19
+ return new Date(ms).toISOString();
20
+ }
21
+ function ago(ms) {
22
+ const diff = Date.now() - ms;
23
+ if (diff < 60_000)
24
+ return `${Math.round(diff / 1000)}s ago`;
25
+ if (diff < 3_600_000)
26
+ return `${Math.round(diff / 60_000)}m ago`;
27
+ return `${Math.round(diff / 3_600_000)}h ago`;
28
+ }
29
+ // ── Tool handlers ─────────────────────────────────────────────────────────────
30
+ export async function handleGetStatus(client) {
31
+ const [health, engine] = await Promise.all([
32
+ client.getHealth(),
33
+ client.getEngine(),
34
+ ]);
35
+ if (!health && !engine) {
36
+ return text("Daemon is not running.\n" +
37
+ "Start it with: openalerts start\n" +
38
+ "SQLite data may still be available via other tools.");
39
+ }
40
+ const lines = ["## OpenAlerts Status\n"];
41
+ if (health) {
42
+ lines.push(`**Daemon**: running`);
43
+ lines.push(`**Gateway**: ${health.gatewayConnected ? "connected" : "disconnected"}`);
44
+ lines.push(`**SSE clients**: ${health.sseClients}`);
45
+ lines.push(`**Checked at**: ${ts(health.ts)}\n`);
46
+ }
47
+ if (engine) {
48
+ const s = engine.stats;
49
+ lines.push(`**Uptime since**: ${ts(engine.startedAt)} (${ago(engine.startedAt)})`);
50
+ lines.push(`**Messages processed**: ${s.messagesProcessed ?? 0}`);
51
+ lines.push(`**Agent starts**: ${s.agentStarts ?? 0}`);
52
+ lines.push(`**Tool calls**: ${s.toolCalls ?? 0}`);
53
+ lines.push(`**Tool errors**: ${s.toolErrors ?? 0}`);
54
+ lines.push(`**LLM errors**: ${s.messageErrors ?? 0}`);
55
+ lines.push(`**Total tokens**: ${(s.totalTokens ?? 0).toLocaleString()}`);
56
+ lines.push(`**Total cost**: $${(s.totalCostUsd ?? 0).toFixed(4)}`);
57
+ lines.push(`**Alerts this hour**: ${engine.hourlyAlerts.count}`);
58
+ lines.push(`**Last heartbeat**: ${engine.lastHeartbeatTs ? ago(engine.lastHeartbeatTs) : "none"}`);
59
+ }
60
+ return text(lines.join("\n"));
61
+ }
62
+ export async function handleGetAlerts(client, args) {
63
+ let alerts = await client.getAlerts(args.limit ?? 50);
64
+ if (args.severity) {
65
+ alerts = alerts.filter(a => a.severity === args.severity);
66
+ }
67
+ if (args.rule_id) {
68
+ alerts = alerts.filter(a => a.rule_id === args.rule_id);
69
+ }
70
+ if (alerts.length === 0) {
71
+ return text("No alerts found matching the criteria.");
72
+ }
73
+ const lines = [`## Alerts (${alerts.length})\n`];
74
+ for (const a of alerts) {
75
+ const icon = { info: "ℹ️", warn: "⚠️", error: "🚨", critical: "🔥" }[a.severity] ?? "•";
76
+ lines.push(`${icon} **${a.title}** [${a.rule_id}] — ${ago(a.ts)}`);
77
+ lines.push(` ${a.detail}`);
78
+ lines.push(` _${ts(a.ts)}_\n`);
79
+ }
80
+ return text(lines.join("\n"));
81
+ }
82
+ export async function handleGetSessions(client, args) {
83
+ let sessions = await client.getSessions();
84
+ if (args.status) {
85
+ sessions = sessions.filter(s => s.status === args.status);
86
+ }
87
+ if (args.limit) {
88
+ sessions = sessions.slice(0, args.limit);
89
+ }
90
+ if (sessions.length === 0) {
91
+ return text("No sessions found.");
92
+ }
93
+ const lines = [`## Sessions (${sessions.length})\n`];
94
+ for (const s of sessions) {
95
+ lines.push(`**${s.session_key}**`);
96
+ if (s.agent_id)
97
+ lines.push(` Agent: ${s.agent_id}`);
98
+ if (s.platform)
99
+ lines.push(` Platform: ${s.platform}`);
100
+ if (s.status)
101
+ lines.push(` Status: ${s.status}`);
102
+ if (s.message_count)
103
+ lines.push(` Messages: ${s.message_count}`);
104
+ if (s.total_cost_usd)
105
+ lines.push(` Cost: $${s.total_cost_usd.toFixed(4)}`);
106
+ const tokens = (s.total_input_tokens ?? 0) + (s.total_output_tokens ?? 0);
107
+ if (tokens > 0)
108
+ lines.push(` Tokens: ${tokens.toLocaleString()}`);
109
+ if (s.last_activity_at)
110
+ lines.push(` Last activity: ${ago(s.last_activity_at)}`);
111
+ lines.push("");
112
+ }
113
+ return text(lines.join("\n"));
114
+ }
115
+ export async function handleGetSessionDetail(client, args) {
116
+ const [sessions, actions] = await Promise.all([
117
+ client.getSessions(),
118
+ client.getActions(args.action_limit ?? 50, args.session_key),
119
+ ]);
120
+ const session = sessions
121
+ .find(s => s.session_key === args.session_key);
122
+ if (!session) {
123
+ return text(`Session '${args.session_key}' not found.`);
124
+ }
125
+ const lines = [`## Session: ${args.session_key}\n`];
126
+ for (const [k, v] of Object.entries(session)) {
127
+ if (v != null)
128
+ lines.push(`**${k}**: ${v}`);
129
+ }
130
+ lines.push(`\n### Actions (${actions.length})\n`);
131
+ for (const a of actions) {
132
+ const icon = a.outcome === "error" ? "❌" : "✓";
133
+ lines.push(`${icon} [${ts(a.ts)}] ${a.type ?? a.event_type ?? "?"}` +
134
+ (a.tool_name ? ` — ${a.tool_name}` : "") +
135
+ (a.duration_ms ? ` (${a.duration_ms}ms)` : "") +
136
+ (a.error ? `\n Error: ${a.error}` : ""));
137
+ }
138
+ return text(lines.join("\n"));
139
+ }
140
+ export async function handleGetActivity(client, args) {
141
+ let activity = await client.getActivity(args.limit ?? 50, args.session_key);
142
+ if (args.subsystem) {
143
+ activity = activity.filter(e => e.subsystem === args.subsystem);
144
+ }
145
+ if (activity.length === 0) {
146
+ return text("No activity found.");
147
+ }
148
+ const lines = [`## Activity (${activity.length})\n`];
149
+ for (const e of activity) {
150
+ const subsysIcon = {
151
+ llm: "🤖", tool: "🔧", agent: "👤", infra: "⚙️", exec: "💻", sys: "📋",
152
+ };
153
+ const icon = subsysIcon[e.subsystem] ?? "•";
154
+ let line = `${icon} [${ts(e.ts)}] **${e.subsystem}** — ${e.message}`;
155
+ if (e.tool_name)
156
+ line += ` (${e.tool_name})`;
157
+ if (e.duration_ms)
158
+ line += ` ${e.duration_ms}ms`;
159
+ if (e.input_tokens || e.output_tokens) {
160
+ line += ` [in:${e.input_tokens ?? 0} out:${e.output_tokens ?? 0}]`;
161
+ }
162
+ lines.push(line);
163
+ }
164
+ return text(lines.join("\n"));
165
+ }
166
+ export async function handleGetRuleStates(client) {
167
+ const recentAlerts = await client.getAlerts(200);
168
+ const lastFiredMap = new Map();
169
+ for (const a of recentAlerts) {
170
+ const existing = lastFiredMap.get(a.rule_id);
171
+ if (!existing || a.ts > existing)
172
+ lastFiredMap.set(a.rule_id, a.ts);
173
+ }
174
+ const lines = ["## Alert Rules\n"];
175
+ for (const rule of RULE_CATALOGUE) {
176
+ const lastFired = lastFiredMap.get(rule.id);
177
+ const cooldownMs = rule.defaultCooldownMin * 60 * 1000;
178
+ const onCooldown = lastFired ? (Date.now() - lastFired) < cooldownMs : false;
179
+ const icon = { warn: "⚠️", error: "🚨", critical: "🔥" }[rule.severity] ?? "ℹ️";
180
+ lines.push(`${icon} **${rule.id}**`);
181
+ lines.push(` ${rule.description}`);
182
+ lines.push(` Threshold: ${rule.defaultThreshold} | Cooldown: ${rule.defaultCooldownMin}min`);
183
+ if (lastFired) {
184
+ lines.push(` Last fired: ${ago(lastFired)} (${ts(lastFired)})`);
185
+ lines.push(` On cooldown: ${onCooldown ? "yes" : "no"}`);
186
+ }
187
+ else {
188
+ lines.push(` Last fired: never`);
189
+ }
190
+ lines.push("");
191
+ }
192
+ return text(lines.join("\n"));
193
+ }
194
+ export async function handleGetAgents(client) {
195
+ const agents = await client.getAgents();
196
+ if (agents.length === 0) {
197
+ return text("No agents found in the database.");
198
+ }
199
+ const lines = [`## Agents (${agents.length})\n`];
200
+ for (const a of agents) {
201
+ lines.push(`${a.emoji ?? "🤖"} **${a.name ?? a.agent_id}** (${a.agent_id})`);
202
+ lines.push(` Updated: ${ago(a.updated_at)}`);
203
+ lines.push("");
204
+ }
205
+ return text(lines.join("\n"));
206
+ }
207
+ export async function handleSummarize(client) {
208
+ const [engine, alerts, sessions, activity] = await Promise.all([
209
+ client.getEngine(),
210
+ client.getAlerts(100),
211
+ client.getSessions(),
212
+ client.getActivity(200),
213
+ ]);
214
+ const now = Date.now();
215
+ const window1h = now - 3_600_000;
216
+ const window15m = now - 15 * 60_000;
217
+ const recentAlerts = alerts
218
+ .filter(a => a.ts > window1h);
219
+ const typedSessions = sessions;
220
+ const activeSessions = typedSessions.filter(s => s.last_activity_at && s.last_activity_at > window15m);
221
+ const typedActivity = activity;
222
+ const recentActivity = typedActivity.filter(e => e.ts > window1h);
223
+ const llmCalls = recentActivity.filter(e => e.subsystem === "llm").length;
224
+ const toolCalls = recentActivity.filter(e => e.subsystem === "tool").length;
225
+ const errors = recentActivity.filter(e => e.event_type.includes("error") || e.event_type.includes("fail")).length;
226
+ const lines = ["## OpenAlerts Summary\n"];
227
+ if (engine) {
228
+ const gw = engine.gatewayConnected;
229
+ lines.push(`**Daemon**: running since ${ago(engine.startedAt)}` +
230
+ ` | Gateway: ${gw === true ? "connected" : gw === false ? "disconnected" : "unknown"}`);
231
+ }
232
+ else {
233
+ lines.push("**Daemon**: not running (showing historical data from SQLite)");
234
+ }
235
+ lines.push("");
236
+ if (activeSessions.length > 0) {
237
+ lines.push(`**Active sessions** (last 15m): ${activeSessions.length}`);
238
+ for (const s of activeSessions.slice(0, 5)) {
239
+ lines.push(` • ${s.session_key}` + (s.total_cost_usd ? ` — $${s.total_cost_usd.toFixed(4)}` : ""));
240
+ }
241
+ }
242
+ else {
243
+ lines.push(`**Active sessions**: none in last 15 minutes`);
244
+ }
245
+ lines.push(`**Total sessions**: ${typedSessions.length}`);
246
+ lines.push("");
247
+ lines.push(`**Activity (last 1h)**: ${recentActivity.length} events`);
248
+ if (llmCalls > 0)
249
+ lines.push(` • LLM calls: ${llmCalls}`);
250
+ if (toolCalls > 0)
251
+ lines.push(` • Tool calls: ${toolCalls}`);
252
+ if (errors > 0)
253
+ lines.push(` • ⚠️ Errors: ${errors}`);
254
+ lines.push("");
255
+ if (engine?.stats) {
256
+ const s = engine.stats;
257
+ if (s.totalCostUsd > 0) {
258
+ lines.push(`**Cost (24h)**: $${s.totalCostUsd.toFixed(4)} | Tokens: ${(s.totalTokens ?? 0).toLocaleString()}`);
259
+ lines.push("");
260
+ }
261
+ }
262
+ if (recentAlerts.length > 0) {
263
+ lines.push(`**Alerts fired (last 1h)**: ${recentAlerts.length}`);
264
+ for (const a of recentAlerts.slice(0, 5)) {
265
+ const icon = { warn: "⚠️", error: "🚨", critical: "🔥" }[a.severity] ?? "ℹ️";
266
+ lines.push(` ${icon} ${a.title} [${a.rule_id}] — ${ago(a.ts)}`);
267
+ }
268
+ }
269
+ else {
270
+ lines.push(`**Alerts (last 1h)**: none ✓`);
271
+ }
272
+ return text(lines.join("\n"));
273
+ }
274
+ export async function handleFireTestAlert(client) {
275
+ const result = await client.fireTestAlert();
276
+ if (result.ok) {
277
+ return text(`Test alert fired successfully. ${result.message ?? ""}`);
278
+ }
279
+ return text(`Failed to fire test alert: ${result.error ?? "unknown error"}`);
280
+ }
281
+ export async function handleGetCronJobs(client) {
282
+ const jobs = await client.getCronJobs();
283
+ if (jobs.length === 0) {
284
+ return text("No cron jobs found.");
285
+ }
286
+ const lines = [`## Cron Jobs (${jobs.length})\n`];
287
+ for (const j of jobs) {
288
+ const statusIcon = j.last_status === "error" ? "❌" : j.last_status === "ok" ? "✓" : "•";
289
+ lines.push(`${statusIcon} **${j.name ?? j.id}**`);
290
+ if (j.schedule_expr)
291
+ lines.push(` Schedule: ${j.schedule_expr}`);
292
+ if (j.agent_id)
293
+ lines.push(` Agent: ${j.agent_id}`);
294
+ if (j.last_run_at)
295
+ lines.push(` Last run: ${ago(j.last_run_at)}`);
296
+ if (j.next_run_at)
297
+ lines.push(` Next run: ${new Date(j.next_run_at).toISOString()}`);
298
+ if (j.consecutive_errors)
299
+ lines.push(` Consecutive errors: ${j.consecutive_errors}`);
300
+ lines.push("");
301
+ }
302
+ return text(lines.join("\n"));
303
+ }
304
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import type { AlertChannel, AlertEnricher, AlertEvent, AlertTarget, MonitorConfig, OpenAlertsEvent } from "../core/index.js";
2
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
3
+ /**
4
+ * Translate an OpenClaw diagnostic event into a universal OpenAlertsEvent.
5
+ * Returns null for unmapped event types.
6
+ */
7
+ export declare function translateOpenClawEvent(event: {
8
+ type: string;
9
+ [key: string]: unknown;
10
+ }): OpenAlertsEvent | null;
11
+ /** Translate after_tool_call hook data into OpenAlertsEvent. */
12
+ export declare function translateToolCallHook(data: {
13
+ toolName: string;
14
+ params: Record<string, unknown>;
15
+ result?: unknown;
16
+ error?: string;
17
+ durationMs?: number;
18
+ }, context: {
19
+ sessionId?: string;
20
+ agentId?: string;
21
+ }): OpenAlertsEvent;
22
+ /** Translate before_agent_start hook data into OpenAlertsEvent. */
23
+ export declare function translateAgentStartHook(data: {
24
+ prompt: string;
25
+ messages?: unknown[];
26
+ }, context: {
27
+ sessionId?: string;
28
+ agentId?: string;
29
+ }): OpenAlertsEvent;
30
+ /** Translate agent_end hook data into OpenAlertsEvent. */
31
+ export declare function translateAgentEndHook(data: {
32
+ messages: unknown[];
33
+ success: boolean;
34
+ error?: string;
35
+ durationMs?: number;
36
+ }, context: {
37
+ sessionId?: string;
38
+ agentId?: string;
39
+ }): OpenAlertsEvent;
40
+ /** Translate session_start hook data into OpenAlertsEvent. */
41
+ export declare function translateSessionStartHook(data: {
42
+ sessionId: string;
43
+ resumedFrom?: string;
44
+ }): OpenAlertsEvent;
45
+ /** Translate session_end hook data into OpenAlertsEvent. */
46
+ export declare function translateSessionEndHook(data: {
47
+ sessionId: string;
48
+ messageCount: number;
49
+ durationMs?: number;
50
+ }): OpenAlertsEvent;
51
+ /** Translate message_sent hook data into OpenAlertsEvent (delivery tracking). */
52
+ export declare function translateMessageSentHook(data: {
53
+ to: string;
54
+ content: string;
55
+ success: boolean;
56
+ error?: string;
57
+ }, context: {
58
+ channel?: string;
59
+ sessionId?: string;
60
+ }): OpenAlertsEvent;
61
+ /** Translate gateway_start hook data into OpenAlertsEvent. */
62
+ export declare function translateGatewayStartHook(data: {
63
+ port: number;
64
+ }): OpenAlertsEvent;
65
+ /** Translate gateway_stop hook data into OpenAlertsEvent. */
66
+ export declare function translateGatewayStopHook(data: {
67
+ reason?: string;
68
+ }): OpenAlertsEvent;
69
+ /** Translate message_received hook data into OpenAlertsEvent (inbound tracking). */
70
+ export declare function translateMessageReceivedHook(data: {
71
+ from: string;
72
+ content: string;
73
+ timestamp?: number;
74
+ metadata?: Record<string, unknown>;
75
+ }, context: {
76
+ channelId?: string;
77
+ accountId?: string;
78
+ }): OpenAlertsEvent;
79
+ /** Translate before_tool_call hook data into OpenAlertsEvent (tool start tracking). */
80
+ export declare function translateBeforeToolCallHook(data: {
81
+ toolName: string;
82
+ params: Record<string, unknown>;
83
+ }, context: {
84
+ sessionId?: string;
85
+ agentId?: string;
86
+ }): OpenAlertsEvent;
87
+ /** Translate before_compaction hook data into OpenAlertsEvent. */
88
+ export declare function translateBeforeCompactionHook(data: {
89
+ messageCount: number;
90
+ tokenCount?: number;
91
+ }, context: {
92
+ sessionKey?: string;
93
+ agentId?: string;
94
+ }): OpenAlertsEvent;
95
+ /** Translate after_compaction hook data into OpenAlertsEvent. */
96
+ export declare function translateAfterCompactionHook(data: {
97
+ messageCount: number;
98
+ tokenCount?: number;
99
+ compactedCount: number;
100
+ }, context: {
101
+ sessionKey?: string;
102
+ agentId?: string;
103
+ }): OpenAlertsEvent;
104
+ /** Translate message_sending hook data into OpenAlertsEvent (pre-send tracking). */
105
+ export declare function translateMessageSendingHook(data: {
106
+ to: string;
107
+ content: string;
108
+ metadata?: Record<string, unknown>;
109
+ }, context: {
110
+ channelId?: string;
111
+ accountId?: string;
112
+ }): OpenAlertsEvent;
113
+ /** Translate tool_result_persist hook data into OpenAlertsEvent. */
114
+ export declare function translateToolResultPersistHook(data: {
115
+ toolName?: string;
116
+ toolCallId?: string;
117
+ isSynthetic?: boolean;
118
+ }, context: {
119
+ sessionKey?: string;
120
+ agentId?: string;
121
+ toolName?: string;
122
+ }): OpenAlertsEvent;
123
+ /**
124
+ * AlertChannel that sends through OpenClaw's runtime channel API.
125
+ * Bridges the universal AlertChannel interface to OpenClaw's messaging system.
126
+ */
127
+ export declare class OpenClawAlertChannel implements AlertChannel {
128
+ readonly name: string;
129
+ private api;
130
+ private target;
131
+ private warnedMissing;
132
+ constructor(api: OpenClawPluginApi, target: AlertTarget);
133
+ send(alert: AlertEvent, formatted: string): Promise<void>;
134
+ }
135
+ /**
136
+ * Resolve the alert target from plugin config or by auto-detecting from OpenClaw config.
137
+ */
138
+ export declare function resolveAlertTarget(api: OpenClawPluginApi, pluginConfig: MonitorConfig): Promise<AlertTarget | null>;
139
+ export declare function parseConfig(raw: Record<string, unknown> | undefined): MonitorConfig;
140
+ /**
141
+ * Create an AlertEnricher from the OpenClaw plugin API.
142
+ * Reads the model from api.config.agents.defaults.model.primary (e.g. "openai/gpt-5-nano")
143
+ * and resolves the API key from process.env.
144
+ * Returns null if no model is configured or enricher can't be created.
145
+ */
146
+ export declare function createOpenClawEnricher(api: OpenClawPluginApi, logger?: {
147
+ info: (msg: string) => void;
148
+ warn: (msg: string) => void;
149
+ error: (msg: string) => void;
150
+ }): AlertEnricher | null;