@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.
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/collections/collection-manager.d.ts +50 -0
- package/dist/collections/collection-manager.js +583 -0
- package/dist/collections/event-parser.d.ts +27 -0
- package/dist/collections/event-parser.js +321 -0
- package/dist/collections/index.d.ts +6 -0
- package/dist/collections/index.js +6 -0
- package/dist/collections/persistence.d.ts +25 -0
- package/dist/collections/persistence.js +213 -0
- package/dist/collections/types.d.ts +177 -0
- package/dist/collections/types.js +15 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.js +23 -0
- package/dist/core/llm-enrichment.d.ts +21 -0
- package/dist/core/llm-enrichment.js +180 -0
- package/dist/core/platform.d.ts +17 -0
- package/dist/core/platform.js +93 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +11 -5
- package/dist/db/queries.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +600 -0
- package/dist/mcp/client.d.ts +52 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +172 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +164 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/resources.d.ts +13 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +99 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/tools.d.ts +80 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +304 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/plugin/adapter.d.ts +150 -0
- package/dist/plugin/adapter.js +530 -0
- package/dist/plugin/commands.d.ts +18 -0
- package/dist/plugin/commands.js +103 -0
- package/dist/plugin/dashboard-html.d.ts +7 -0
- package/dist/plugin/dashboard-html.js +968 -0
- package/dist/plugin/dashboard-routes.d.ts +12 -0
- package/dist/plugin/dashboard-routes.js +444 -0
- package/dist/plugin/gateway-client.d.ts +39 -0
- package/dist/plugin/gateway-client.js +200 -0
- package/dist/plugin/log-bridge.d.ts +22 -0
- package/dist/plugin/log-bridge.js +363 -0
- package/dist/watchers/gateway-adapter.d.ts.map +1 -1
- package/dist/watchers/gateway-adapter.js +2 -1
- package/dist/watchers/gateway-adapter.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAlerts MCP Client
|
|
3
|
+
* Fetches data from the REST API (localhost:4242) with direct SQLite fallback.
|
|
4
|
+
*/
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { DatabaseSync } from "node:sqlite";
|
|
8
|
+
import { getRecentAlerts, getRecentActions, getAllSessions, getAllAgents, getAllCronJobs, getActivityLog, getRecentDiagnostics, getRecentHeartbeats, getDashboardState, } from "../db/queries.js";
|
|
9
|
+
export const DEFAULT_PORT = 4242;
|
|
10
|
+
export const DEFAULT_DB_PATH = path.join(os.homedir(), ".openalerts", "openalerts.db");
|
|
11
|
+
// ── Client ───────────────────────────────────────────────────────────────────
|
|
12
|
+
export class OpenAlertsClient {
|
|
13
|
+
port;
|
|
14
|
+
dbPath;
|
|
15
|
+
_db = null;
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
this.port = opts?.port ?? DEFAULT_PORT;
|
|
18
|
+
this.dbPath = opts?.dbPath ?? DEFAULT_DB_PATH;
|
|
19
|
+
}
|
|
20
|
+
get baseUrl() {
|
|
21
|
+
return `http://127.0.0.1:${this.port}`;
|
|
22
|
+
}
|
|
23
|
+
/** Try REST API; returns null on any error. */
|
|
24
|
+
async api(endpoint, init) {
|
|
25
|
+
try {
|
|
26
|
+
const res = await fetch(`${this.baseUrl}${endpoint}`, {
|
|
27
|
+
...init,
|
|
28
|
+
signal: AbortSignal.timeout(3000),
|
|
29
|
+
});
|
|
30
|
+
if (!res.ok)
|
|
31
|
+
return null;
|
|
32
|
+
return res.json();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Get or lazily open a read-only SQLite connection. */
|
|
39
|
+
db() {
|
|
40
|
+
if (this._db)
|
|
41
|
+
return this._db;
|
|
42
|
+
try {
|
|
43
|
+
this._db = new DatabaseSync(this.dbPath, { open: true });
|
|
44
|
+
return this._db;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
close() {
|
|
51
|
+
try {
|
|
52
|
+
this._db?.close();
|
|
53
|
+
}
|
|
54
|
+
catch { /* ignore */ }
|
|
55
|
+
this._db = null;
|
|
56
|
+
}
|
|
57
|
+
// ── Health / Engine ────────────────────────────────────────────────────────
|
|
58
|
+
async getHealth() {
|
|
59
|
+
return this.api("/health");
|
|
60
|
+
}
|
|
61
|
+
async getEngine() {
|
|
62
|
+
return this.api("/api/engine");
|
|
63
|
+
}
|
|
64
|
+
// ── Alerts ─────────────────────────────────────────────────────────────────
|
|
65
|
+
async getAlerts(limit = 50) {
|
|
66
|
+
const fromApi = await this.api(`/api/alerts?limit=${limit}`);
|
|
67
|
+
if (fromApi)
|
|
68
|
+
return fromApi;
|
|
69
|
+
const db = this.db();
|
|
70
|
+
if (!db)
|
|
71
|
+
return [];
|
|
72
|
+
return getRecentAlerts(db, limit);
|
|
73
|
+
}
|
|
74
|
+
// ── Sessions ───────────────────────────────────────────────────────────────
|
|
75
|
+
async getSessions() {
|
|
76
|
+
const state = await this.api("/api/state");
|
|
77
|
+
if (state?.sessions)
|
|
78
|
+
return state.sessions;
|
|
79
|
+
const db = this.db();
|
|
80
|
+
if (!db)
|
|
81
|
+
return [];
|
|
82
|
+
return getAllSessions(db);
|
|
83
|
+
}
|
|
84
|
+
// ── Activity ───────────────────────────────────────────────────────────────
|
|
85
|
+
async getActivity(limit = 100, sessionKey) {
|
|
86
|
+
const q = sessionKey
|
|
87
|
+
? `/api/activity?limit=${limit}&session=${encodeURIComponent(sessionKey)}`
|
|
88
|
+
: `/api/activity?limit=${limit}`;
|
|
89
|
+
const fromApi = await this.api(q);
|
|
90
|
+
if (fromApi)
|
|
91
|
+
return fromApi;
|
|
92
|
+
const db = this.db();
|
|
93
|
+
if (!db)
|
|
94
|
+
return [];
|
|
95
|
+
return getActivityLog(db, limit, sessionKey);
|
|
96
|
+
}
|
|
97
|
+
// ── Actions ────────────────────────────────────────────────────────────────
|
|
98
|
+
async getActions(limit = 100, sessionKey) {
|
|
99
|
+
const q = sessionKey
|
|
100
|
+
? `/api/actions?limit=${limit}&session=${encodeURIComponent(sessionKey)}`
|
|
101
|
+
: `/api/actions?limit=${limit}`;
|
|
102
|
+
const fromApi = await this.api(q);
|
|
103
|
+
if (fromApi)
|
|
104
|
+
return fromApi;
|
|
105
|
+
const db = this.db();
|
|
106
|
+
if (!db)
|
|
107
|
+
return [];
|
|
108
|
+
return getRecentActions(db, limit, sessionKey);
|
|
109
|
+
}
|
|
110
|
+
// ── Agents ─────────────────────────────────────────────────────────────────
|
|
111
|
+
async getAgents() {
|
|
112
|
+
const state = await this.api("/api/state");
|
|
113
|
+
if (state?.agents)
|
|
114
|
+
return state.agents;
|
|
115
|
+
const db = this.db();
|
|
116
|
+
if (!db)
|
|
117
|
+
return [];
|
|
118
|
+
return getAllAgents(db);
|
|
119
|
+
}
|
|
120
|
+
// ── Cron jobs ──────────────────────────────────────────────────────────────
|
|
121
|
+
async getCronJobs() {
|
|
122
|
+
const state = await this.api("/api/state");
|
|
123
|
+
if (state?.cronJobs)
|
|
124
|
+
return state.cronJobs;
|
|
125
|
+
const db = this.db();
|
|
126
|
+
if (!db)
|
|
127
|
+
return [];
|
|
128
|
+
return getAllCronJobs(db);
|
|
129
|
+
}
|
|
130
|
+
// ── Full state snapshot ────────────────────────────────────────────────────
|
|
131
|
+
async getFullState() {
|
|
132
|
+
const fromApi = await this.api("/api/state");
|
|
133
|
+
if (fromApi)
|
|
134
|
+
return fromApi;
|
|
135
|
+
const db = this.db();
|
|
136
|
+
if (!db)
|
|
137
|
+
return null;
|
|
138
|
+
return getDashboardState(db);
|
|
139
|
+
}
|
|
140
|
+
// ── Diagnostics & heartbeats ───────────────────────────────────────────────
|
|
141
|
+
async getDiagnostics(limit = 50) {
|
|
142
|
+
const fromApi = await this.api(`/api/diagnostics?limit=${limit}`);
|
|
143
|
+
if (fromApi)
|
|
144
|
+
return fromApi;
|
|
145
|
+
const db = this.db();
|
|
146
|
+
if (!db)
|
|
147
|
+
return [];
|
|
148
|
+
return getRecentDiagnostics(db, limit);
|
|
149
|
+
}
|
|
150
|
+
async getHeartbeats(limit = 10) {
|
|
151
|
+
const fromApi = await this.api(`/api/heartbeats?limit=${limit}`);
|
|
152
|
+
if (fromApi)
|
|
153
|
+
return fromApi;
|
|
154
|
+
const db = this.db();
|
|
155
|
+
if (!db)
|
|
156
|
+
return [];
|
|
157
|
+
return getRecentHeartbeats(db, limit);
|
|
158
|
+
}
|
|
159
|
+
// ── Test alert ─────────────────────────────────────────────────────────────
|
|
160
|
+
async fireTestAlert() {
|
|
161
|
+
const result = await this.api("/api/test", { method: "POST" });
|
|
162
|
+
if (result)
|
|
163
|
+
return result;
|
|
164
|
+
return { ok: false, error: "Daemon not running. Start with: openalerts start" };
|
|
165
|
+
}
|
|
166
|
+
// ── Daemon status ──────────────────────────────────────────────────────────
|
|
167
|
+
async isDaemonRunning() {
|
|
168
|
+
const h = await this.getHealth();
|
|
169
|
+
return h?.ok === true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AA2IA,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD7F"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAlerts MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Exposes OpenAlerts monitoring data to any MCP-compatible AI assistant.
|
|
5
|
+
* Communicates via stdio. Start with: openalerts mcp
|
|
6
|
+
*
|
|
7
|
+
* Tools: get_status, get_alerts, get_sessions, get_session_detail,
|
|
8
|
+
* get_activity, get_rule_states, get_agents, get_cron_jobs,
|
|
9
|
+
* summarize, fire_test_alert
|
|
10
|
+
*
|
|
11
|
+
* Resources: openalerts://status, openalerts://alerts/recent,
|
|
12
|
+
* openalerts://sessions/active, openalerts://rules
|
|
13
|
+
*/
|
|
14
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
15
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
16
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
17
|
+
import { OpenAlertsClient } from "./client.js";
|
|
18
|
+
import { RESOURCES, readResource } from "./resources.js";
|
|
19
|
+
import { handleGetStatus, handleGetAlerts, handleGetSessions, handleGetSessionDetail, handleGetActivity, handleGetRuleStates, handleGetAgents, handleGetCronJobs, handleSummarize, handleFireTestAlert, } from "./tools.js";
|
|
20
|
+
// ── Tool definitions ──────────────────────────────────────────────────────────
|
|
21
|
+
const TOOLS = [
|
|
22
|
+
{
|
|
23
|
+
name: "get_status",
|
|
24
|
+
description: "Get OpenAlerts daemon health, gateway connection status, and 24h statistics (messages, errors, tokens, cost).",
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "get_alerts",
|
|
32
|
+
description: "Get recent fired alerts. Optionally filter by severity or rule ID.",
|
|
33
|
+
inputSchema: {
|
|
34
|
+
type: "object",
|
|
35
|
+
properties: {
|
|
36
|
+
limit: { type: "number", description: "Max alerts to return (default 50)" },
|
|
37
|
+
severity: { type: "string", enum: ["info", "warn", "error", "critical"], description: "Filter by severity" },
|
|
38
|
+
rule_id: { type: "string", description: "Filter by rule ID (e.g. llm-errors, gateway-down)" },
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "get_sessions",
|
|
44
|
+
description: "List agent monitoring sessions with status, message count, cost, and last activity.",
|
|
45
|
+
inputSchema: {
|
|
46
|
+
type: "object",
|
|
47
|
+
properties: {
|
|
48
|
+
status: { type: "string", description: "Filter by status (e.g. active, completed, error)" },
|
|
49
|
+
limit: { type: "number", description: "Max sessions to return" },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "get_session_detail",
|
|
55
|
+
description: "Get full detail for a specific session including all its actions/events.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
type: "object",
|
|
58
|
+
properties: {
|
|
59
|
+
session_key: { type: "string", description: "Session key to look up" },
|
|
60
|
+
action_limit: { type: "number", description: "Max actions to return (default 50)" },
|
|
61
|
+
},
|
|
62
|
+
required: ["session_key"],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "get_activity",
|
|
67
|
+
description: "Get the unified activity feed — agent steps, tool calls, LLM calls, infra events.",
|
|
68
|
+
inputSchema: {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
limit: { type: "number", description: "Max entries to return (default 50)" },
|
|
72
|
+
session_key: { type: "string", description: "Filter by session key" },
|
|
73
|
+
subsystem: { type: "string", enum: ["llm", "tool", "agent", "infra", "exec", "sys"], description: "Filter by subsystem" },
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "get_rule_states",
|
|
79
|
+
description: "List all 10 alert rules with their thresholds, cooldowns, and last-fired timestamps.",
|
|
80
|
+
inputSchema: {
|
|
81
|
+
type: "object",
|
|
82
|
+
properties: {},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "get_agents",
|
|
87
|
+
description: "List all known agents with their IDs, names, and last-updated timestamps.",
|
|
88
|
+
inputSchema: {
|
|
89
|
+
type: "object",
|
|
90
|
+
properties: {},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "get_cron_jobs",
|
|
95
|
+
description: "List all scheduled cron jobs with their last run status, schedule, and consecutive errors.",
|
|
96
|
+
inputSchema: {
|
|
97
|
+
type: "object",
|
|
98
|
+
properties: {},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "summarize",
|
|
103
|
+
description: "Get a concise narrative summary of what's happening right now — active sessions, recent alerts, activity, cost, and gateway status.",
|
|
104
|
+
inputSchema: {
|
|
105
|
+
type: "object",
|
|
106
|
+
properties: {},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: "fire_test_alert",
|
|
111
|
+
description: "Send a test alert through all configured channels to verify delivery is working. Requires daemon to be running.",
|
|
112
|
+
inputSchema: {
|
|
113
|
+
type: "object",
|
|
114
|
+
properties: {},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
// ── Server bootstrap ──────────────────────────────────────────────────────────
|
|
119
|
+
export async function startMcpServer(opts) {
|
|
120
|
+
const client = new OpenAlertsClient(opts);
|
|
121
|
+
const server = new Server({ name: "openalerts", version: "1.0.0" }, {
|
|
122
|
+
capabilities: { tools: {}, resources: {} },
|
|
123
|
+
instructions: "OpenAlerts MCP server. Use 'summarize' for a quick overview, " +
|
|
124
|
+
"'get_status' for daemon health, 'get_alerts' for recent alerts, " +
|
|
125
|
+
"and 'get_activity' for live agent events. " +
|
|
126
|
+
"Data comes from the running daemon (localhost:4242) or SQLite fallback.",
|
|
127
|
+
});
|
|
128
|
+
// ── List tools ─────────────────────────────────────────────────────────────
|
|
129
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
130
|
+
// ── Call tool ──────────────────────────────────────────────────────────────
|
|
131
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
132
|
+
const { name, arguments: args } = request.params;
|
|
133
|
+
const a = (args ?? {});
|
|
134
|
+
switch (name) {
|
|
135
|
+
case "get_status": return handleGetStatus(client);
|
|
136
|
+
case "get_alerts": return handleGetAlerts(client, a);
|
|
137
|
+
case "get_sessions": return handleGetSessions(client, a);
|
|
138
|
+
case "get_session_detail": return handleGetSessionDetail(client, a);
|
|
139
|
+
case "get_activity": return handleGetActivity(client, a);
|
|
140
|
+
case "get_rule_states": return handleGetRuleStates(client);
|
|
141
|
+
case "get_agents": return handleGetAgents(client);
|
|
142
|
+
case "get_cron_jobs": return handleGetCronJobs(client);
|
|
143
|
+
case "summarize": return handleSummarize(client);
|
|
144
|
+
case "fire_test_alert": return handleFireTestAlert(client);
|
|
145
|
+
default:
|
|
146
|
+
return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true };
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
// ── List resources ─────────────────────────────────────────────────────────
|
|
150
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({ resources: RESOURCES }));
|
|
151
|
+
// ── Read resource ──────────────────────────────────────────────────────────
|
|
152
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
153
|
+
const { uri } = request.params;
|
|
154
|
+
const text = await readResource(uri, client);
|
|
155
|
+
return {
|
|
156
|
+
contents: [{ uri, mimeType: "text/plain", text }],
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
// ── Connect stdio transport ────────────────────────────────────────────────
|
|
160
|
+
const transport = new StdioServerTransport();
|
|
161
|
+
await server.connect(transport);
|
|
162
|
+
process.on("exit", () => client.close());
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAlerts MCP Resources
|
|
3
|
+
* Static context that clients can subscribe to or read on-demand.
|
|
4
|
+
*/
|
|
5
|
+
import type { OpenAlertsClient } from "./client.js";
|
|
6
|
+
export declare const RESOURCES: {
|
|
7
|
+
uri: string;
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
mimeType: string;
|
|
11
|
+
}[];
|
|
12
|
+
export declare function readResource(uri: string, client: OpenAlertsClient): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,eAAO,MAAM,SAAS;;;;;GAyBrB,CAAC;AASF,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyEzF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export const RESOURCES = [
|
|
2
|
+
{
|
|
3
|
+
uri: "openalerts://status",
|
|
4
|
+
name: "Engine Status",
|
|
5
|
+
description: "Current daemon health, gateway connection, and 24h stats",
|
|
6
|
+
mimeType: "text/plain",
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
uri: "openalerts://alerts/recent",
|
|
10
|
+
name: "Recent Alerts",
|
|
11
|
+
description: "Last 50 fired alerts across all rules",
|
|
12
|
+
mimeType: "text/plain",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
uri: "openalerts://sessions/active",
|
|
16
|
+
name: "Active Sessions",
|
|
17
|
+
description: "Sessions with activity in the last 15 minutes",
|
|
18
|
+
mimeType: "text/plain",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
uri: "openalerts://rules",
|
|
22
|
+
name: "Alert Rules",
|
|
23
|
+
description: "All 10 alert rules with thresholds, cooldowns, and last-fired info",
|
|
24
|
+
mimeType: "text/plain",
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
function ago(ms) {
|
|
28
|
+
const diff = Date.now() - ms;
|
|
29
|
+
if (diff < 60_000)
|
|
30
|
+
return `${Math.round(diff / 1000)}s ago`;
|
|
31
|
+
if (diff < 3_600_000)
|
|
32
|
+
return `${Math.round(diff / 60_000)}m ago`;
|
|
33
|
+
return `${Math.round(diff / 3_600_000)}h ago`;
|
|
34
|
+
}
|
|
35
|
+
export async function readResource(uri, client) {
|
|
36
|
+
switch (uri) {
|
|
37
|
+
case "openalerts://status": {
|
|
38
|
+
const [health, engine] = await Promise.all([client.getHealth(), client.getEngine()]);
|
|
39
|
+
if (!health && !engine)
|
|
40
|
+
return "Daemon not running.";
|
|
41
|
+
const lines = [];
|
|
42
|
+
if (health) {
|
|
43
|
+
lines.push(`Daemon: running | Gateway: ${health.gatewayConnected ? "connected" : "disconnected"} | SSE clients: ${health.sseClients}`);
|
|
44
|
+
}
|
|
45
|
+
if (engine) {
|
|
46
|
+
const s = engine.stats;
|
|
47
|
+
lines.push(`Uptime since: ${new Date(engine.startedAt).toISOString()} (${ago(engine.startedAt)})`);
|
|
48
|
+
lines.push(`Messages: ${s.messagesProcessed ?? 0} | Agent starts: ${s.agentStarts ?? 0} | Tool calls: ${s.toolCalls ?? 0}`);
|
|
49
|
+
lines.push(`Errors: ${s.messageErrors ?? 0} | Cost: $${(s.totalCostUsd ?? 0).toFixed(4)} | Tokens: ${(s.totalTokens ?? 0).toLocaleString()}`);
|
|
50
|
+
lines.push(`Alerts this hour: ${engine.hourlyAlerts.count}`);
|
|
51
|
+
}
|
|
52
|
+
return lines.join("\n");
|
|
53
|
+
}
|
|
54
|
+
case "openalerts://alerts/recent": {
|
|
55
|
+
const alerts = await client.getAlerts(50);
|
|
56
|
+
if (!alerts.length)
|
|
57
|
+
return "No recent alerts.";
|
|
58
|
+
return alerts.map(a => {
|
|
59
|
+
const icon = { warn: "⚠️", error: "🚨", critical: "🔥" }[a.severity] ?? "ℹ️";
|
|
60
|
+
return `${icon} [${new Date(a.ts).toISOString()}] ${a.title} [${a.rule_id}]\n ${a.detail}`;
|
|
61
|
+
}).join("\n\n");
|
|
62
|
+
}
|
|
63
|
+
case "openalerts://sessions/active": {
|
|
64
|
+
const sessions = await client.getSessions();
|
|
65
|
+
const active = sessions.filter(s => s.last_activity_at && (Date.now() - s.last_activity_at) < 15 * 60_000);
|
|
66
|
+
if (!active.length)
|
|
67
|
+
return "No sessions active in the last 15 minutes.";
|
|
68
|
+
return active.map(s => `${s.session_key} | status: ${s.status ?? "?"} | messages: ${s.message_count ?? 0} | cost: $${(s.total_cost_usd ?? 0).toFixed(4)} | last: ${ago(s.last_activity_at)}`).join("\n");
|
|
69
|
+
}
|
|
70
|
+
case "openalerts://rules": {
|
|
71
|
+
const RULES = [
|
|
72
|
+
{ id: "infra-errors", severity: "error", threshold: 1, cooldownMin: 15, desc: "Infrastructure errors spike" },
|
|
73
|
+
{ id: "llm-errors", severity: "error", threshold: 1, cooldownMin: 15, desc: "LLM / agent call errors" },
|
|
74
|
+
{ id: "session-stuck", severity: "warn", threshold: 120, cooldownMin: 30, desc: "Session inactive for N seconds" },
|
|
75
|
+
{ id: "heartbeat-fail", severity: "error", threshold: 3, cooldownMin: 30, desc: "N consecutive heartbeat failures" },
|
|
76
|
+
{ id: "queue-depth", severity: "warn", threshold: 10, cooldownMin: 15, desc: "Delivery queue >= N items" },
|
|
77
|
+
{ id: "high-error-rate", severity: "error", threshold: 50, cooldownMin: 30, desc: ">= N% of last 20 LLM calls failed" },
|
|
78
|
+
{ id: "cost-hourly-spike", severity: "warn", threshold: 5, cooldownMin: 30, desc: "LLM spend >= $N/hour" },
|
|
79
|
+
{ id: "cost-daily-budget", severity: "error", threshold: 20, cooldownMin: 360, desc: "LLM spend >= $N/day" },
|
|
80
|
+
{ id: "tool-errors", severity: "warn", threshold: 1, cooldownMin: 15, desc: "Tool errors spike" },
|
|
81
|
+
{ id: "gateway-down", severity: "critical", threshold: 30, cooldownMin: 60, desc: "No gateway heartbeat for N seconds" },
|
|
82
|
+
];
|
|
83
|
+
const alerts = await client.getAlerts(200);
|
|
84
|
+
const lastFired = new Map();
|
|
85
|
+
for (const a of alerts) {
|
|
86
|
+
if (!lastFired.has(a.rule_id) || a.ts > lastFired.get(a.rule_id)) {
|
|
87
|
+
lastFired.set(a.rule_id, a.ts);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return RULES.map(r => {
|
|
91
|
+
const lf = lastFired.get(r.id);
|
|
92
|
+
return `[${r.severity.toUpperCase()}] ${r.id} — ${r.desc}\n threshold: ${r.threshold} | cooldown: ${r.cooldownMin}min | last fired: ${lf ? ago(lf) : "never"}`;
|
|
93
|
+
}).join("\n\n");
|
|
94
|
+
}
|
|
95
|
+
default:
|
|
96
|
+
return `Unknown resource: ${uri}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp/resources.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,GAAG,EAAE,qBAAqB;QAC1B,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,0DAA0D;QACvE,QAAQ,EAAE,YAAY;KACvB;IACD;QACE,GAAG,EAAE,4BAA4B;QACjC,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,YAAY;KACvB;IACD;QACE,GAAG,EAAE,8BAA8B;QACnC,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,+CAA+C;QAC5D,QAAQ,EAAE,YAAY;KACvB;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,oEAAoE;QACjF,QAAQ,EAAE,YAAY;KACvB;CACF,CAAC;AAEF,SAAS,GAAG,CAAC,EAAU;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7B,IAAI,IAAI,GAAG,MAAM;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5D,IAAI,IAAI,GAAG,SAAS;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACjE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,MAAwB;IACtE,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACrF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;gBAAE,OAAO,qBAAqB,CAAC;YACrD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,mBAAmB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACzI,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,iBAAiB,IAAI,CAAC,oBAAoB,CAAC,CAAC,WAAW,IAAI,CAAC,kBAAkB,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5H,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBAC9I,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,4BAA4B,CAAC,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,CAEtC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAO,mBAAmB,CAAC;YAC/C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACpB,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;gBAC7E,OAAO,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;YAC/F,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAED,KAAK,8BAA8B,CAAC,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAGvC,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACjC,CAAC,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,MAAM,CACtE,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAO,4CAA4C,CAAC;YACxE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACpB,GAAG,CAAC,CAAC,WAAW,cAAc,CAAC,CAAC,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,gBAAiB,CAAC,EAAE,CACvK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG;gBACZ,EAAE,EAAE,EAAE,cAAc,EAAO,QAAQ,EAAE,OAAO,EAAK,SAAS,EAAE,CAAC,EAAI,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,6BAA6B,EAAE;gBACxH,EAAE,EAAE,EAAE,YAAY,EAAS,QAAQ,EAAE,OAAO,EAAK,SAAS,EAAE,CAAC,EAAI,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,yBAAyB,EAAE;gBACpH,EAAE,EAAE,EAAE,eAAe,EAAM,QAAQ,EAAE,MAAM,EAAM,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,gCAAgC,EAAE;gBAC3H,EAAE,EAAE,EAAE,gBAAgB,EAAK,QAAQ,EAAE,OAAO,EAAK,SAAS,EAAE,CAAC,EAAI,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,kCAAkC,EAAE;gBAC7H,EAAE,EAAE,EAAE,aAAa,EAAQ,QAAQ,EAAE,MAAM,EAAM,SAAS,EAAE,EAAE,EAAG,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,2BAA2B,EAAE;gBACtH,EAAE,EAAE,EAAE,iBAAiB,EAAI,QAAQ,EAAE,OAAO,EAAK,SAAS,EAAE,EAAE,EAAG,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,mCAAmC,EAAE;gBAC9H,EAAE,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAM,SAAS,EAAE,CAAC,EAAI,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,sBAAsB,EAAE;gBACjH,EAAE,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE,OAAO,EAAK,SAAS,EAAE,EAAE,EAAG,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE;gBAChH,EAAE,EAAE,EAAE,aAAa,EAAQ,QAAQ,EAAE,MAAM,EAAM,SAAS,EAAE,CAAC,EAAI,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,mBAAmB,EAAE;gBAC9G,EAAE,EAAE,EAAE,cAAc,EAAO,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAG,WAAW,EAAE,EAAE,EAAG,IAAI,EAAE,oCAAoC,EAAE;aAChI,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAA2C,CAAC;YACrF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAE,EAAE,CAAC;oBAClE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACnB,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,SAAS,gBAAgB,CAAC,CAAC,WAAW,qBAAqB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAClK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAED;YACE,OAAO,qBAAqB,GAAG,EAAE,CAAC;IACtC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAlerts MCP Tools
|
|
3
|
+
* Each function handles one tool call and returns MCP-compatible content.
|
|
4
|
+
*/
|
|
5
|
+
import type { OpenAlertsClient } from "./client.js";
|
|
6
|
+
export declare function handleGetStatus(client: OpenAlertsClient): Promise<{
|
|
7
|
+
content: {
|
|
8
|
+
type: "text";
|
|
9
|
+
text: string;
|
|
10
|
+
}[];
|
|
11
|
+
}>;
|
|
12
|
+
export declare function handleGetAlerts(client: OpenAlertsClient, args: {
|
|
13
|
+
limit?: number;
|
|
14
|
+
severity?: string;
|
|
15
|
+
rule_id?: string;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
content: {
|
|
18
|
+
type: "text";
|
|
19
|
+
text: string;
|
|
20
|
+
}[];
|
|
21
|
+
}>;
|
|
22
|
+
export declare function handleGetSessions(client: OpenAlertsClient, args: {
|
|
23
|
+
status?: string;
|
|
24
|
+
limit?: number;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
content: {
|
|
27
|
+
type: "text";
|
|
28
|
+
text: string;
|
|
29
|
+
}[];
|
|
30
|
+
}>;
|
|
31
|
+
export declare function handleGetSessionDetail(client: OpenAlertsClient, args: {
|
|
32
|
+
session_key: string;
|
|
33
|
+
action_limit?: number;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
content: {
|
|
36
|
+
type: "text";
|
|
37
|
+
text: string;
|
|
38
|
+
}[];
|
|
39
|
+
}>;
|
|
40
|
+
export declare function handleGetActivity(client: OpenAlertsClient, args: {
|
|
41
|
+
limit?: number;
|
|
42
|
+
session_key?: string;
|
|
43
|
+
subsystem?: string;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
content: {
|
|
46
|
+
type: "text";
|
|
47
|
+
text: string;
|
|
48
|
+
}[];
|
|
49
|
+
}>;
|
|
50
|
+
export declare function handleGetRuleStates(client: OpenAlertsClient): Promise<{
|
|
51
|
+
content: {
|
|
52
|
+
type: "text";
|
|
53
|
+
text: string;
|
|
54
|
+
}[];
|
|
55
|
+
}>;
|
|
56
|
+
export declare function handleGetAgents(client: OpenAlertsClient): Promise<{
|
|
57
|
+
content: {
|
|
58
|
+
type: "text";
|
|
59
|
+
text: string;
|
|
60
|
+
}[];
|
|
61
|
+
}>;
|
|
62
|
+
export declare function handleSummarize(client: OpenAlertsClient): Promise<{
|
|
63
|
+
content: {
|
|
64
|
+
type: "text";
|
|
65
|
+
text: string;
|
|
66
|
+
}[];
|
|
67
|
+
}>;
|
|
68
|
+
export declare function handleFireTestAlert(client: OpenAlertsClient): Promise<{
|
|
69
|
+
content: {
|
|
70
|
+
type: "text";
|
|
71
|
+
text: string;
|
|
72
|
+
}[];
|
|
73
|
+
}>;
|
|
74
|
+
export declare function handleGetCronJobs(client: OpenAlertsClient): Promise<{
|
|
75
|
+
content: {
|
|
76
|
+
type: "text";
|
|
77
|
+
text: string;
|
|
78
|
+
}[];
|
|
79
|
+
}>;
|
|
80
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoCpD,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB;;;;;GAsC7D;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GA2B9D;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAmC1C;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GA+BrD;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;GAgCnE;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB;;;;;GA+BjE;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB;;;;;GAgB7D;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB;;;;;GAgF7D;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB;;;;;GAMjE;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB;;;;;GAuB/D"}
|