@steadwing/openalerts 0.2.4 → 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.
- package/README.md +198 -137
- package/dist/channels/console.d.ts +6 -0
- package/dist/channels/console.d.ts.map +1 -0
- package/dist/channels/console.js +10 -0
- package/dist/channels/console.js.map +1 -0
- package/dist/channels/telegram.d.ts +12 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +28 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/webhook.d.ts +8 -0
- package/dist/channels/webhook.d.ts.map +1 -0
- package/dist/channels/webhook.js +15 -0
- package/dist/channels/webhook.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +234 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +86 -0
- package/dist/config.js.map +1 -0
- package/dist/core/alert-channel.d.ts +3 -10
- package/dist/core/alert-channel.d.ts.map +1 -0
- package/dist/core/alert-channel.js +9 -30
- package/dist/core/alert-channel.js.map +1 -0
- package/dist/core/bounded-map.d.ts +1 -0
- package/dist/core/bounded-map.d.ts.map +1 -0
- package/dist/core/bounded-map.js +1 -0
- package/dist/core/bounded-map.js.map +1 -0
- package/dist/core/engine.d.ts +6 -18
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +49 -98
- package/dist/core/engine.js.map +1 -0
- package/dist/core/evaluator.d.ts +1 -0
- package/dist/core/evaluator.d.ts.map +1 -0
- package/dist/core/evaluator.js +1 -0
- package/dist/core/evaluator.js.map +1 -0
- package/dist/core/event-bus.d.ts +1 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +1 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/formatter.d.ts +1 -0
- package/dist/core/formatter.d.ts.map +1 -0
- package/dist/core/formatter.js +1 -0
- package/dist/core/formatter.js.map +1 -0
- package/dist/core/rules.d.ts +1 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +98 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/store.d.ts +6 -9
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +43 -96
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +2 -1
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +31 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/queries.d.ts +157 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +221 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +5 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +177 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/readers/openclaw.d.ts +11 -0
- package/dist/readers/openclaw.d.ts.map +1 -0
- package/dist/readers/openclaw.js +267 -0
- package/dist/readers/openclaw.js.map +1 -0
- package/dist/server/dashboard.d.ts +2 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +765 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +28 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes.d.ts +6 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +146 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/sse.d.ts +21 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +53 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/watchers/files.d.ts +19 -0
- package/dist/watchers/files.d.ts.map +1 -0
- package/dist/watchers/files.js +105 -0
- package/dist/watchers/files.js.map +1 -0
- package/dist/watchers/gateway-adapter.d.ts +18 -0
- package/dist/watchers/gateway-adapter.d.ts.map +1 -0
- package/dist/watchers/gateway-adapter.js +273 -0
- package/dist/watchers/gateway-adapter.js.map +1 -0
- package/dist/watchers/gateway.d.ts +27 -0
- package/dist/watchers/gateway.d.ts.map +1 -0
- package/dist/watchers/gateway.js +131 -0
- package/dist/watchers/gateway.js.map +1 -0
- package/package.json +29 -43
- package/LICENSE +0 -201
- package/dist/core/index.d.ts +0 -12
- package/dist/core/index.js +0 -23
- package/dist/core/llm-enrichment.d.ts +0 -21
- package/dist/core/llm-enrichment.js +0 -180
- package/dist/core/platform.d.ts +0 -17
- package/dist/core/platform.js +0 -93
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -213
- package/dist/plugin/adapter.d.ts +0 -150
- package/dist/plugin/adapter.js +0 -530
- package/dist/plugin/commands.d.ts +0 -18
- package/dist/plugin/commands.js +0 -103
- package/dist/plugin/dashboard-html.d.ts +0 -7
- package/dist/plugin/dashboard-html.js +0 -938
- package/dist/plugin/dashboard-routes.d.ts +0 -7
- package/dist/plugin/dashboard-routes.js +0 -336
- package/dist/plugin/gateway-client.d.ts +0 -39
- package/dist/plugin/gateway-client.js +0 -193
- package/dist/plugin/log-bridge.d.ts +0 -22
- package/dist/plugin/log-bridge.js +0 -363
- package/openclaw.plugin.json +0 -57
package/dist/cli.js
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* openalerts CLI
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* openalerts start Start monitoring daemon
|
|
7
|
+
* openalerts start --port 4242 Custom port
|
|
8
|
+
* openalerts start --config ./openalerts.config.json
|
|
9
|
+
* openalerts status Print engine state (if running)
|
|
10
|
+
* openalerts init Create default config file
|
|
11
|
+
* openalerts test Send test alert (daemon must be running)
|
|
12
|
+
*/
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import os from "node:os";
|
|
15
|
+
import { openDb, pruneDb } from "./db/index.js";
|
|
16
|
+
import { loadConfig, detectGatewayToken, writeDefaultConfig } from "./config.js";
|
|
17
|
+
import { loadAll } from "./readers/openclaw.js";
|
|
18
|
+
import { FileWatcher } from "./watchers/files.js";
|
|
19
|
+
import { GatewayClient } from "./watchers/gateway.js";
|
|
20
|
+
import { translateGatewayEvent } from "./watchers/gateway-adapter.js";
|
|
21
|
+
import { OpenAlertsEngine } from "./core/engine.js";
|
|
22
|
+
import { TelegramChannel } from "./channels/telegram.js";
|
|
23
|
+
import { WebhookChannel } from "./channels/webhook.js";
|
|
24
|
+
import { ConsoleChannel } from "./channels/console.js";
|
|
25
|
+
import { startHttpServer } from "./server/index.js";
|
|
26
|
+
// ── CLI arg parsing ───────────────────────────────────────────────────────────
|
|
27
|
+
const args = process.argv.slice(2);
|
|
28
|
+
const command = args[0] ?? "start";
|
|
29
|
+
function getFlag(name, defaultVal) {
|
|
30
|
+
const idx = args.indexOf(name);
|
|
31
|
+
if (idx !== -1 && args[idx + 1])
|
|
32
|
+
return args[idx + 1];
|
|
33
|
+
return defaultVal;
|
|
34
|
+
}
|
|
35
|
+
// ── Commands ──────────────────────────────────────────────────────────────────
|
|
36
|
+
if (command === "init") {
|
|
37
|
+
const configPath = getFlag("--config") ?? path.join(os.homedir(), ".openalerts", "config.json");
|
|
38
|
+
writeDefaultConfig(configPath);
|
|
39
|
+
console.log(`[init] Created config at ${configPath}`);
|
|
40
|
+
console.log(`[init] Edit it and run: openalerts start`);
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
if (command === "test") {
|
|
44
|
+
const port = parseInt(getFlag("--port") ?? "4242");
|
|
45
|
+
fetch(`http://127.0.0.1:${port}/api/test`, { method: "POST" })
|
|
46
|
+
.then(r => r.json())
|
|
47
|
+
.then(d => { console.log("[test]", d); process.exit(0); })
|
|
48
|
+
.catch(err => { console.error("[test] Failed (is daemon running?):", err.message); process.exit(1); });
|
|
49
|
+
// guard: exit after 5s if fetch hangs
|
|
50
|
+
setTimeout(() => process.exit(1), 5000);
|
|
51
|
+
process.exitCode = 0; // allow async
|
|
52
|
+
}
|
|
53
|
+
else if (command === "status") {
|
|
54
|
+
const port = parseInt(getFlag("--port") ?? "4242");
|
|
55
|
+
fetch(`http://127.0.0.1:${port}/api/engine`)
|
|
56
|
+
.then(r => r.json())
|
|
57
|
+
.then(d => { console.log(JSON.stringify(d, null, 2)); process.exit(0); })
|
|
58
|
+
.catch(err => { console.error("[status] Failed (is daemon running?):", err.message); process.exit(1); });
|
|
59
|
+
setTimeout(() => process.exit(1), 5000);
|
|
60
|
+
}
|
|
61
|
+
else if (command === "start") {
|
|
62
|
+
const configPath = getFlag("--config");
|
|
63
|
+
const portArg = getFlag("--port");
|
|
64
|
+
const config = loadConfig(configPath);
|
|
65
|
+
if (portArg)
|
|
66
|
+
config.server.port = parseInt(portArg);
|
|
67
|
+
// Auto-detect gateway token if not configured
|
|
68
|
+
if (!config.gatewayToken) {
|
|
69
|
+
config.gatewayToken = detectGatewayToken(config.watch.openclawDir);
|
|
70
|
+
if (config.gatewayToken) {
|
|
71
|
+
console.log("[config] Auto-detected gateway operator token");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
startDaemon(config);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.error(`Unknown command: ${command}`);
|
|
78
|
+
console.error("Usage: openalerts [start|init|status|test] [--port N] [--config path]");
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
// ── Daemon startup ────────────────────────────────────────────────────────────
|
|
82
|
+
async function startDaemon(config) {
|
|
83
|
+
console.log("[openalerts] Starting…");
|
|
84
|
+
console.log(`[openalerts] State dir: ${config.stateDir}`);
|
|
85
|
+
console.log(`[openalerts] Watching: ${config.watch.openclawDir}`);
|
|
86
|
+
// ── 1. Open database ───────────────────────────────────────────────────────
|
|
87
|
+
const db = openDb(config.stateDir);
|
|
88
|
+
console.log("[db] SQLite opened");
|
|
89
|
+
// ── 2. Build alert channels ────────────────────────────────────────────────
|
|
90
|
+
const channels = [];
|
|
91
|
+
for (const ch of config.channels) {
|
|
92
|
+
if (ch.type === "telegram" && ch.token && ch.chatId) {
|
|
93
|
+
channels.push(new TelegramChannel(ch.token, ch.chatId));
|
|
94
|
+
console.log("[channels] Telegram channel added");
|
|
95
|
+
}
|
|
96
|
+
else if (ch.type === "webhook" && ch.webhookUrl) {
|
|
97
|
+
channels.push(new WebhookChannel(ch.webhookUrl));
|
|
98
|
+
console.log("[channels] Webhook channel added");
|
|
99
|
+
}
|
|
100
|
+
else if (ch.type === "console") {
|
|
101
|
+
channels.push(new ConsoleChannel());
|
|
102
|
+
console.log("[channels] Console channel added");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (channels.length === 0) {
|
|
106
|
+
channels.push(new ConsoleChannel());
|
|
107
|
+
console.log("[channels] No channels configured — using console fallback");
|
|
108
|
+
}
|
|
109
|
+
// ── 3. Start alert engine ──────────────────────────────────────────────────
|
|
110
|
+
const engine = new OpenAlertsEngine({
|
|
111
|
+
stateDir: path.join(config.stateDir, "events"),
|
|
112
|
+
config: {
|
|
113
|
+
quiet: config.quiet,
|
|
114
|
+
rules: config.rules,
|
|
115
|
+
},
|
|
116
|
+
channels,
|
|
117
|
+
diagnosisHint: 'Run "openclaw doctor" in your terminal',
|
|
118
|
+
db,
|
|
119
|
+
});
|
|
120
|
+
engine.start();
|
|
121
|
+
// ── 4. Initial file load ───────────────────────────────────────────────────
|
|
122
|
+
console.log("[loader] Loading OpenClaw files…");
|
|
123
|
+
try {
|
|
124
|
+
loadAll(db, config.watch);
|
|
125
|
+
console.log("[loader] Initial load complete");
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.warn(`[loader] Initial load warning: ${err}`);
|
|
129
|
+
}
|
|
130
|
+
// ── 5. Gateway connection state (declared early so closure captures it) ──────
|
|
131
|
+
let gatewayConnected = false;
|
|
132
|
+
let startupGwAlertFired = false;
|
|
133
|
+
// ── 6. Start HTTP server + SSE ─────────────────────────────────────────────
|
|
134
|
+
const httpServer = startHttpServer(config.server, db, engine, () => gatewayConnected);
|
|
135
|
+
// Wire engine events to SSE (push live alerts/diagnostics to dashboard)
|
|
136
|
+
engine.bus.on(event => {
|
|
137
|
+
httpServer.sse.emit("diagnostic", {
|
|
138
|
+
event_type: event.type, ts: event.ts,
|
|
139
|
+
summary: `${event.type}${event.outcome ? `:${event.outcome}` : ""}`,
|
|
140
|
+
channel: event.channel, session_key: event.sessionKey, agent_id: event.agentId,
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
// ── 7. File watcher ────────────────────────────────────────────────────────
|
|
144
|
+
const fileWatcher = new FileWatcher(db, config.watch, (changed) => {
|
|
145
|
+
console.log(`[watcher] Changed: ${path.basename(changed)}`);
|
|
146
|
+
// Push updated state to SSE clients
|
|
147
|
+
try {
|
|
148
|
+
import("./db/queries.js").then(({ getDashboardState }) => {
|
|
149
|
+
httpServer.sse.emit("state", getDashboardState(db));
|
|
150
|
+
}).catch(() => { });
|
|
151
|
+
}
|
|
152
|
+
catch { /* ignore */ }
|
|
153
|
+
});
|
|
154
|
+
fileWatcher.start();
|
|
155
|
+
// ── 8. Gateway WebSocket ───────────────────────────────────────────────────
|
|
156
|
+
const gwClient = new GatewayClient({
|
|
157
|
+
url: config.gatewayUrl,
|
|
158
|
+
token: config.gatewayToken,
|
|
159
|
+
});
|
|
160
|
+
gwClient.on("ready", () => {
|
|
161
|
+
gatewayConnected = true;
|
|
162
|
+
console.log("[gateway] Connected to OpenClaw gateway ✓");
|
|
163
|
+
// Push updated state (heartbeats, sessions) to dashboard
|
|
164
|
+
import("./db/queries.js").then(({ getDashboardState }) => {
|
|
165
|
+
httpServer.sse.emit("state", getDashboardState(db));
|
|
166
|
+
}).catch(() => { });
|
|
167
|
+
});
|
|
168
|
+
gwClient.on("disconnected", () => {
|
|
169
|
+
const wasConnected = gatewayConnected;
|
|
170
|
+
gatewayConnected = false;
|
|
171
|
+
if (wasConnected) {
|
|
172
|
+
console.log("[gateway] Lost connection — reconnecting…");
|
|
173
|
+
engine.ingest({ type: "infra.heartbeat", ts: Date.now(), outcome: "error" });
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
gwClient.on("error", (err) => {
|
|
177
|
+
// ECONNREFUSED = openclaw not running, suppress noisy repeat logs
|
|
178
|
+
if (!err.message.includes("ECONNREFUSED") && !err.message.includes("connect ECONNREFUSED")) {
|
|
179
|
+
console.warn(`[gateway] ${err.message}`);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// All real gateway event names from OpenClaw's WS protocol
|
|
183
|
+
const GW_EVENTS = ["health", "tick", "agent", "chat", "cron.run", "exec.started", "exec.output", "exec.completed"];
|
|
184
|
+
for (const evt of GW_EVENTS) {
|
|
185
|
+
gwClient.on(evt, (payload) => {
|
|
186
|
+
const result = translateGatewayEvent(evt, payload, db);
|
|
187
|
+
if (result.event)
|
|
188
|
+
engine.ingest(result.event);
|
|
189
|
+
if (result.sseType && result.ssePayload) {
|
|
190
|
+
httpServer.sse.emit(result.sseType, result.ssePayload);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
gwClient.start();
|
|
195
|
+
// Fire gateway-down alert if not connected within 30s of startup
|
|
196
|
+
setTimeout(() => {
|
|
197
|
+
if (!gatewayConnected && !startupGwAlertFired) {
|
|
198
|
+
startupGwAlertFired = true;
|
|
199
|
+
console.warn("[gateway] Not connected after 30s — OpenClaw may be down");
|
|
200
|
+
engine.ingest({ type: "infra.heartbeat", ts: Date.now(), outcome: "error" });
|
|
201
|
+
// Manually fire a gateway-down style alert via 3 consecutive heartbeat failures
|
|
202
|
+
for (let i = 0; i < 3; i++) {
|
|
203
|
+
engine.ingest({ type: "infra.heartbeat", ts: Date.now() + i, outcome: "error" });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}, 30_000);
|
|
207
|
+
// ── 9. Periodic tasks ─────────────────────────────────────────────────────
|
|
208
|
+
// Re-sync files + DB prune every 5 minutes
|
|
209
|
+
const syncInterval = setInterval(() => {
|
|
210
|
+
try {
|
|
211
|
+
loadAll(db, config.watch);
|
|
212
|
+
}
|
|
213
|
+
catch { /* ignore */ }
|
|
214
|
+
try {
|
|
215
|
+
pruneDb(db);
|
|
216
|
+
}
|
|
217
|
+
catch { /* ignore */ }
|
|
218
|
+
}, 5 * 60 * 1000);
|
|
219
|
+
// ── 10. Graceful shutdown ──────────────────────────────────────────────────
|
|
220
|
+
function shutdown(sig) {
|
|
221
|
+
console.log(`\n[openalerts] ${sig} — shutting down…`);
|
|
222
|
+
clearInterval(syncInterval);
|
|
223
|
+
gwClient.stop();
|
|
224
|
+
fileWatcher.stop();
|
|
225
|
+
engine.stop();
|
|
226
|
+
httpServer.close();
|
|
227
|
+
db.close();
|
|
228
|
+
process.exit(0);
|
|
229
|
+
}
|
|
230
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
231
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
232
|
+
console.log("[openalerts] Running. Press Ctrl+C to stop.");
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface ChannelConfig {
|
|
2
|
+
type: "telegram" | "discord" | "slack" | "webhook" | "console";
|
|
3
|
+
token?: string;
|
|
4
|
+
chatId?: string;
|
|
5
|
+
webhookUrl?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RuleOverride {
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
threshold?: number;
|
|
11
|
+
cooldownMinutes?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface WatchConfig {
|
|
14
|
+
/** Path to ~/.openclaw or custom openclaw data dir */
|
|
15
|
+
openclawDir: string;
|
|
16
|
+
/** Workspaces to watch (relative to openclawDir or absolute) */
|
|
17
|
+
workspaces: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface ServerConfig {
|
|
20
|
+
port: number;
|
|
21
|
+
host: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AppConfig {
|
|
24
|
+
/** OpenClaw gateway WebSocket URL */
|
|
25
|
+
gatewayUrl: string;
|
|
26
|
+
/** Gateway operator token (gateway.auth.token from openclaw.json) */
|
|
27
|
+
gatewayToken: string;
|
|
28
|
+
/** Where openalerts stores its own data */
|
|
29
|
+
stateDir: string;
|
|
30
|
+
/** File watching config */
|
|
31
|
+
watch: WatchConfig;
|
|
32
|
+
/** HTTP server config */
|
|
33
|
+
server: ServerConfig;
|
|
34
|
+
/** Alert channels */
|
|
35
|
+
channels: ChannelConfig[];
|
|
36
|
+
/** Per-rule overrides */
|
|
37
|
+
rules?: Record<string, RuleOverride>;
|
|
38
|
+
/** Suppress outbound alerts (log only) */
|
|
39
|
+
quiet?: boolean;
|
|
40
|
+
/** Hourly alert cap (default 10) */
|
|
41
|
+
maxAlertsPerHour?: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function loadConfig(configPath?: string): AppConfig;
|
|
44
|
+
export declare function writeDefaultConfig(targetPath: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Auto-detect the OpenClaw gateway operator token.
|
|
47
|
+
* Primary source: gateway.auth.token in openclaw.json (the master operator token).
|
|
48
|
+
* This is the correct token for WS connect with client.id = "cli".
|
|
49
|
+
*/
|
|
50
|
+
export declare function detectGatewayToken(openclawDir: string): string;
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAE/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,yBAAyB;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,qBAAqB;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAkBD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAsBzD;AAYD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAgB3D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAa9D"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const DEFAULTS = {
|
|
5
|
+
gatewayUrl: "ws://127.0.0.1:18789",
|
|
6
|
+
gatewayToken: "",
|
|
7
|
+
stateDir: path.join(os.homedir(), ".openalerts"),
|
|
8
|
+
watch: {
|
|
9
|
+
openclawDir: path.join(os.homedir(), ".openclaw"),
|
|
10
|
+
workspaces: ["workspace", "workspace-study"],
|
|
11
|
+
},
|
|
12
|
+
server: {
|
|
13
|
+
port: 4242,
|
|
14
|
+
host: "127.0.0.1",
|
|
15
|
+
},
|
|
16
|
+
channels: [],
|
|
17
|
+
quiet: false,
|
|
18
|
+
};
|
|
19
|
+
export function loadConfig(configPath) {
|
|
20
|
+
const candidates = [
|
|
21
|
+
configPath,
|
|
22
|
+
path.join(process.cwd(), "openalerts.config.json"),
|
|
23
|
+
path.join(os.homedir(), ".openalerts", "config.json"),
|
|
24
|
+
// legacy path migration
|
|
25
|
+
path.join(os.homedir(), ".openalerts-watch", "config.json"),
|
|
26
|
+
path.join(os.homedir(), ".config", "openalerts", "config.json"),
|
|
27
|
+
].filter(Boolean);
|
|
28
|
+
for (const p of candidates) {
|
|
29
|
+
if (fs.existsSync(p)) {
|
|
30
|
+
try {
|
|
31
|
+
const raw = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
32
|
+
return mergeConfig(DEFAULTS, raw);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error(`[openalerts] Failed to parse config at ${p}: ${err}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { ...DEFAULTS };
|
|
40
|
+
}
|
|
41
|
+
function mergeConfig(base, override) {
|
|
42
|
+
return {
|
|
43
|
+
...base,
|
|
44
|
+
...override,
|
|
45
|
+
watch: { ...base.watch, ...(override.watch ?? {}) },
|
|
46
|
+
server: { ...base.server, ...(override.server ?? {}) },
|
|
47
|
+
channels: override.channels ?? base.channels,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function writeDefaultConfig(targetPath) {
|
|
51
|
+
const openclawDir = path.join(os.homedir(), ".openclaw");
|
|
52
|
+
const autoToken = detectGatewayToken(openclawDir);
|
|
53
|
+
const sample = {
|
|
54
|
+
...DEFAULTS,
|
|
55
|
+
gatewayToken: autoToken || "PASTE_YOUR_OPERATOR_TOKEN_HERE",
|
|
56
|
+
channels: [
|
|
57
|
+
{
|
|
58
|
+
type: "telegram",
|
|
59
|
+
token: "YOUR_BOT_TOKEN",
|
|
60
|
+
chatId: "YOUR_CHAT_ID",
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
};
|
|
64
|
+
fs.mkdirSync(path.dirname(targetPath), { recursive: true });
|
|
65
|
+
fs.writeFileSync(targetPath, JSON.stringify(sample, null, 2) + "\n");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Auto-detect the OpenClaw gateway operator token.
|
|
69
|
+
* Primary source: gateway.auth.token in openclaw.json (the master operator token).
|
|
70
|
+
* This is the correct token for WS connect with client.id = "cli".
|
|
71
|
+
*/
|
|
72
|
+
export function detectGatewayToken(openclawDir) {
|
|
73
|
+
// Primary: master token from openclaw.json gateway.auth.token
|
|
74
|
+
const configPath = path.join(openclawDir, "openclaw.json");
|
|
75
|
+
try {
|
|
76
|
+
const data = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
77
|
+
const gw = data.gateway;
|
|
78
|
+
const auth = gw?.auth;
|
|
79
|
+
if (typeof auth?.token === "string" && auth.token) {
|
|
80
|
+
return auth.token;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch { /* ignore */ }
|
|
84
|
+
return "";
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,16 @@
|
|
|
1
1
|
import type { AlertChannel, AlertEvent, OpenAlertsLogger } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Dispatches alerts to all registered channels.
|
|
4
|
-
* Fire-and-forget: individual channel failures don't block others.
|
|
5
|
-
*/
|
|
6
2
|
export declare class AlertDispatcher {
|
|
7
3
|
private channels;
|
|
8
4
|
private logger;
|
|
9
|
-
private diagnosisHint
|
|
5
|
+
private diagnosisHint;
|
|
10
6
|
constructor(opts: {
|
|
11
7
|
channels?: AlertChannel[];
|
|
12
8
|
logger?: OpenAlertsLogger;
|
|
13
9
|
diagnosisHint?: string;
|
|
14
10
|
});
|
|
15
|
-
/** Add a channel at runtime. */
|
|
16
11
|
addChannel(channel: AlertChannel): void;
|
|
17
|
-
/** Send an alert to all registered channels. */
|
|
18
|
-
dispatch(alert: AlertEvent): Promise<void>;
|
|
19
|
-
/** Whether any channels are registered. */
|
|
20
12
|
get hasChannels(): boolean;
|
|
21
|
-
/** Number of registered channels. */
|
|
22
13
|
get channelCount(): number;
|
|
14
|
+
dispatch(alert: AlertEvent): Promise<void>;
|
|
23
15
|
}
|
|
16
|
+
//# sourceMappingURL=alert-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-channel.d.ts","sourceRoot":"","sources":["../../src/core/alert-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG7E,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAS;gBAElB,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;IAMlG,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIvC,IAAI,WAAW,IAAI,OAAO,CAAqC;IAC/D,IAAI,YAAY,IAAI,MAAM,CAAiC;IAErD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAWjD"}
|
|
@@ -1,44 +1,23 @@
|
|
|
1
|
-
import { formatAlertMessage } from "./formatter.js";
|
|
2
|
-
/**
|
|
3
|
-
* Dispatches alerts to all registered channels.
|
|
4
|
-
* Fire-and-forget: individual channel failures don't block others.
|
|
5
|
-
*/
|
|
1
|
+
import { formatAlertMessage as formatAlert } from "./formatter.js";
|
|
6
2
|
export class AlertDispatcher {
|
|
7
|
-
channels
|
|
3
|
+
channels;
|
|
8
4
|
logger;
|
|
9
5
|
diagnosisHint;
|
|
10
6
|
constructor(opts) {
|
|
11
|
-
this.channels = opts.channels
|
|
7
|
+
this.channels = opts.channels ? [...opts.channels] : [];
|
|
12
8
|
this.logger = opts.logger ?? console;
|
|
13
|
-
this.diagnosisHint = opts.diagnosisHint;
|
|
9
|
+
this.diagnosisHint = opts.diagnosisHint ?? "";
|
|
14
10
|
}
|
|
15
|
-
/** Add a channel at runtime. */
|
|
16
11
|
addChannel(channel) {
|
|
17
12
|
this.channels.push(channel);
|
|
18
13
|
}
|
|
19
|
-
|
|
14
|
+
get hasChannels() { return this.channels.length > 0; }
|
|
15
|
+
get channelCount() { return this.channels.length; }
|
|
20
16
|
async dispatch(alert) {
|
|
21
17
|
if (this.channels.length === 0)
|
|
22
18
|
return;
|
|
23
|
-
const formatted =
|
|
24
|
-
|
|
25
|
-
});
|
|
26
|
-
const results = this.channels.map(async (ch) => {
|
|
27
|
-
try {
|
|
28
|
-
await ch.send(alert, formatted);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
this.logger.error(`[openalerts] alert channel "${ch.name}" failed: ${String(err)}`);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
await Promise.allSettled(results);
|
|
35
|
-
}
|
|
36
|
-
/** Whether any channels are registered. */
|
|
37
|
-
get hasChannels() {
|
|
38
|
-
return this.channels.length > 0;
|
|
39
|
-
}
|
|
40
|
-
/** Number of registered channels. */
|
|
41
|
-
get channelCount() {
|
|
42
|
-
return this.channels.length;
|
|
19
|
+
const formatted = formatAlert(alert, { diagnosisHint: this.diagnosisHint });
|
|
20
|
+
await Promise.allSettled(this.channels.map(ch => Promise.resolve(ch.send(alert, formatted)).catch(err => this.logger.warn(`[channel:${ch.name}] send failed: ${String(err)}`))));
|
|
43
21
|
}
|
|
44
22
|
}
|
|
23
|
+
//# sourceMappingURL=alert-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-channel.js","sourceRoot":"","sources":["../../src/core/alert-channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAiB;IACzB,MAAM,CAAmB;IACzB,aAAa,CAAS;IAE9B,YAAY,IAAsF;QAChG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,UAAU,CAAC,OAAqB;QAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW,KAAc,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,YAAY,KAAa,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3D,KAAK,CAAC,QAAQ,CAAC,KAAiB;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACvC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5E,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CACrB,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,kBAAkB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CACrE,CACF,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-map.d.ts","sourceRoot":"","sources":["../../src/core/bounded-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAQF,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC;IAM7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;gBAEO,OAAO,EAAE,iBAAiB;IAMvD,kBAAkB;IAClB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAkB3B,kBAAkB;IAClB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAwB1B,0BAA0B;IAC1B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAgBpB,mBAAmB;IACnB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQvB,wBAAwB;IACxB,KAAK,IAAI,IAAI;IASb,uBAAuB;IACvB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mBAAmB;IACnB,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAI3B,qBAAqB;IACrB,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC;IAI7B,sBAAsB;IACtB,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAInC,gBAAgB;IAChB,QAAQ,IAAI,eAAe;IAU3B,+CAA+C;IAC/C,OAAO,CAAC,WAAW;CAgBpB"}
|
package/dist/core/bounded-map.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-map.js","sourceRoot":"","sources":["../../src/core/bounded-map.ts"],"names":[],"mappings":"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"}
|
package/dist/core/engine.d.ts
CHANGED
|
@@ -1,48 +1,36 @@
|
|
|
1
1
|
import { OpenAlertsEventBus } from "./event-bus.js";
|
|
2
2
|
import { type AlertEvent, type EvaluatorState, type OpenAlertsEvent, type OpenAlertsInitOptions, type StoredEvent } from "./types.js";
|
|
3
|
-
|
|
4
|
-
* OpenAlertsEngine — central orchestrator for monitoring and alerting.
|
|
5
|
-
*
|
|
6
|
-
* Framework-agnostic. Adapters (OpenClaw, Nanobot, LangChain, etc.)
|
|
7
|
-
* translate their events into OpenAlertsEvent and feed them to `ingest()`.
|
|
8
|
-
*/
|
|
3
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
9
4
|
export declare class OpenAlertsEngine {
|
|
10
5
|
readonly bus: OpenAlertsEventBus;
|
|
11
6
|
readonly state: EvaluatorState;
|
|
12
7
|
private config;
|
|
13
8
|
private stateDir;
|
|
14
9
|
private dispatcher;
|
|
15
|
-
private platform;
|
|
16
10
|
private enricher;
|
|
17
11
|
private logger;
|
|
18
12
|
private logPrefix;
|
|
13
|
+
private db;
|
|
19
14
|
private watchdogTimer;
|
|
20
15
|
private pruneTimer;
|
|
21
16
|
private running;
|
|
22
17
|
private eventRing;
|
|
23
18
|
private static readonly RING_MAX;
|
|
24
|
-
constructor(options: OpenAlertsInitOptions
|
|
25
|
-
|
|
19
|
+
constructor(options: OpenAlertsInitOptions & {
|
|
20
|
+
db?: DatabaseSync | null;
|
|
21
|
+
});
|
|
26
22
|
start(): void;
|
|
27
|
-
/** Ingest a universal event. Can be called directly or via the event bus. */
|
|
28
23
|
ingest(event: OpenAlertsEvent): void;
|
|
29
|
-
/** Stop the engine: clear timers, flush platform, clear bus. */
|
|
30
24
|
stop(): void;
|
|
31
|
-
/** Add a channel at runtime (e.g., after detecting available transports). */
|
|
32
25
|
addChannel(channel: {
|
|
33
26
|
readonly name: string;
|
|
34
27
|
send(alert: AlertEvent, formatted: string): Promise<void> | void;
|
|
35
28
|
}): void;
|
|
36
|
-
/** Fire a test alert to verify delivery. */
|
|
37
29
|
sendTestAlert(): void;
|
|
38
|
-
/** Whether the platform sync is connected. */
|
|
39
|
-
get platformConnected(): boolean;
|
|
40
|
-
/** Whether the engine is running. */
|
|
41
30
|
get isRunning(): boolean;
|
|
42
|
-
/** Read recent stored events (for /alerts command). */
|
|
43
31
|
getRecentEvents(limit?: number): StoredEvent[];
|
|
44
|
-
/** Get recent full events from the in-memory ring buffer (for dashboard history). */
|
|
45
32
|
getRecentLiveEvents(limit?: number): OpenAlertsEvent[];
|
|
46
33
|
private handleEvent;
|
|
47
34
|
private fireAlert;
|
|
48
35
|
}
|
|
36
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAEL,KAAK,UAAU,EAEf,KAAK,cAAc,EAEnB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAE1B,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAE/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,EAAE,CAAsB;IAEhC,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAO;gBAE3B,OAAO,EAAE,qBAAqB,GAAG;QAAE,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;KAAE;IAmBzE,KAAK,IAAI,IAAI;IAoCb,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAEpC,IAAI,IAAI,IAAI;IASZ,UAAU,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI;IAItH,aAAa,IAAI,IAAI;IAUrB,IAAI,SAAS,IAAI,OAAO,CAAyB;IAEjD,eAAe,CAAC,KAAK,SAAM,GAAG,WAAW,EAAE;IAC3C,mBAAmB,CAAC,KAAK,SAAM,GAAG,eAAe,EAAE;IAEnD,OAAO,CAAC,WAAW;YAgCL,SAAS;CA8BxB"}
|