@weave_protocol/mund 0.1.0

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 (98) hide show
  1. package/dist/analyzers/code-analyzer.d.ts +24 -0
  2. package/dist/analyzers/code-analyzer.d.ts.map +1 -0
  3. package/dist/analyzers/code-analyzer.js +73 -0
  4. package/dist/analyzers/code-analyzer.js.map +1 -0
  5. package/dist/analyzers/exfiltration-detector.d.ts +40 -0
  6. package/dist/analyzers/exfiltration-detector.d.ts.map +1 -0
  7. package/dist/analyzers/exfiltration-detector.js +220 -0
  8. package/dist/analyzers/exfiltration-detector.js.map +1 -0
  9. package/dist/analyzers/index.d.ts +26 -0
  10. package/dist/analyzers/index.d.ts.map +1 -0
  11. package/dist/analyzers/index.js +61 -0
  12. package/dist/analyzers/index.js.map +1 -0
  13. package/dist/analyzers/injection-detector.d.ts +36 -0
  14. package/dist/analyzers/injection-detector.d.ts.map +1 -0
  15. package/dist/analyzers/injection-detector.js +165 -0
  16. package/dist/analyzers/injection-detector.js.map +1 -0
  17. package/dist/analyzers/pii-detector.d.ts +44 -0
  18. package/dist/analyzers/pii-detector.d.ts.map +1 -0
  19. package/dist/analyzers/pii-detector.js +190 -0
  20. package/dist/analyzers/pii-detector.js.map +1 -0
  21. package/dist/analyzers/secret-scanner.d.ts +32 -0
  22. package/dist/analyzers/secret-scanner.d.ts.map +1 -0
  23. package/dist/analyzers/secret-scanner.js +119 -0
  24. package/dist/analyzers/secret-scanner.js.map +1 -0
  25. package/dist/constants.d.ts +18 -0
  26. package/dist/constants.d.ts.map +1 -0
  27. package/dist/constants.js +580 -0
  28. package/dist/constants.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +242 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/notifications/email.d.ts +18 -0
  34. package/dist/notifications/email.d.ts.map +1 -0
  35. package/dist/notifications/email.js +192 -0
  36. package/dist/notifications/email.js.map +1 -0
  37. package/dist/notifications/index.d.ts +51 -0
  38. package/dist/notifications/index.d.ts.map +1 -0
  39. package/dist/notifications/index.js +107 -0
  40. package/dist/notifications/index.js.map +1 -0
  41. package/dist/notifications/slack.d.ts +17 -0
  42. package/dist/notifications/slack.d.ts.map +1 -0
  43. package/dist/notifications/slack.js +128 -0
  44. package/dist/notifications/slack.js.map +1 -0
  45. package/dist/notifications/teams.d.ts +17 -0
  46. package/dist/notifications/teams.d.ts.map +1 -0
  47. package/dist/notifications/teams.js +136 -0
  48. package/dist/notifications/teams.js.map +1 -0
  49. package/dist/notifications/webhook.d.ts +15 -0
  50. package/dist/notifications/webhook.d.ts.map +1 -0
  51. package/dist/notifications/webhook.js +67 -0
  52. package/dist/notifications/webhook.js.map +1 -0
  53. package/dist/storage/index.d.ts +11 -0
  54. package/dist/storage/index.d.ts.map +1 -0
  55. package/dist/storage/index.js +26 -0
  56. package/dist/storage/index.js.map +1 -0
  57. package/dist/storage/memory.d.ts +35 -0
  58. package/dist/storage/memory.d.ts.map +1 -0
  59. package/dist/storage/memory.js +144 -0
  60. package/dist/storage/memory.js.map +1 -0
  61. package/dist/tools/configuration.d.ts +8 -0
  62. package/dist/tools/configuration.d.ts.map +1 -0
  63. package/dist/tools/configuration.js +399 -0
  64. package/dist/tools/configuration.js.map +1 -0
  65. package/dist/tools/index.d.ts +15 -0
  66. package/dist/tools/index.d.ts.map +1 -0
  67. package/dist/tools/index.js +16 -0
  68. package/dist/tools/index.js.map +1 -0
  69. package/dist/tools/monitoring.d.ts +10 -0
  70. package/dist/tools/monitoring.d.ts.map +1 -0
  71. package/dist/tools/monitoring.js +476 -0
  72. package/dist/tools/monitoring.js.map +1 -0
  73. package/dist/types.d.ts +207 -0
  74. package/dist/types.d.ts.map +1 -0
  75. package/dist/types.js +6 -0
  76. package/dist/types.js.map +1 -0
  77. package/package.json +62 -0
  78. package/rules/default.yaml +189 -0
  79. package/src/analyzers/code-analyzer.ts +88 -0
  80. package/src/analyzers/exfiltration-detector.ts +257 -0
  81. package/src/analyzers/index.ts +74 -0
  82. package/src/analyzers/injection-detector.ts +191 -0
  83. package/src/analyzers/pii-detector.ts +220 -0
  84. package/src/analyzers/secret-scanner.ts +142 -0
  85. package/src/constants.ts +603 -0
  86. package/src/index.ts +285 -0
  87. package/src/notifications/email.ts +211 -0
  88. package/src/notifications/index.ts +136 -0
  89. package/src/notifications/slack.ts +170 -0
  90. package/src/notifications/teams.ts +200 -0
  91. package/src/notifications/webhook.ts +80 -0
  92. package/src/storage/index.ts +29 -0
  93. package/src/storage/memory.ts +181 -0
  94. package/src/tools/configuration.ts +478 -0
  95. package/src/tools/index.ts +29 -0
  96. package/src/tools/monitoring.ts +559 -0
  97. package/src/types.ts +300 -0
  98. package/tsconfig.json +24 -0
package/dist/index.js ADDED
@@ -0,0 +1,242 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Mund - The Guardian Protocol
4
+ * Main Entry Point
5
+ *
6
+ * An MCP-based security monitoring protocol for agentic AI systems.
7
+ */
8
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
11
+ import express from 'express';
12
+ import { DEFAULT_CONFIG, DEFAULT_RULES } from './constants.js';
13
+ import { createStorage } from './storage/index.js';
14
+ import { AnalyzerEngine } from './analyzers/index.js';
15
+ import { NotificationHub } from './notifications/index.js';
16
+ import { registerAllTools } from './tools/index.js';
17
+ // ============================================================================
18
+ // Configuration Loading
19
+ // ============================================================================
20
+ function loadConfig() {
21
+ const config = {
22
+ ...DEFAULT_CONFIG,
23
+ // Server settings from environment
24
+ port: parseInt(process.env.MUND_PORT || '3000'),
25
+ host: process.env.MUND_HOST || '127.0.0.1',
26
+ transport: process.env.MUND_TRANSPORT || 'stdio',
27
+ // Logging
28
+ log_level: process.env.MUND_LOG_LEVEL || 'info',
29
+ // Storage
30
+ storage_type: process.env.MUND_STORAGE || 'memory',
31
+ database_url: process.env.MUND_DATABASE_URL,
32
+ // Security
33
+ block_mode: process.env.MUND_BLOCK_MODE === 'block',
34
+ api_key: process.env.MUND_API_KEY,
35
+ // Notifications
36
+ notifications: {
37
+ slack: process.env.MUND_SLACK_WEBHOOK ? {
38
+ webhook_url: process.env.MUND_SLACK_WEBHOOK,
39
+ channel: process.env.MUND_SLACK_CHANNEL,
40
+ username: process.env.MUND_SLACK_USERNAME || 'Mund Guardian',
41
+ icon_emoji: process.env.MUND_SLACK_EMOJI || ':eye:',
42
+ min_severity: process.env.MUND_SLACK_MIN_SEVERITY || 'high'
43
+ } : undefined,
44
+ teams: process.env.MUND_TEAMS_WEBHOOK ? {
45
+ webhook_url: process.env.MUND_TEAMS_WEBHOOK,
46
+ min_severity: process.env.MUND_TEAMS_MIN_SEVERITY || 'high'
47
+ } : undefined,
48
+ email: process.env.MUND_EMAIL_SMTP_HOST ? {
49
+ smtp_host: process.env.MUND_EMAIL_SMTP_HOST,
50
+ smtp_port: parseInt(process.env.MUND_EMAIL_SMTP_PORT || '587'),
51
+ smtp_secure: process.env.MUND_EMAIL_SMTP_SECURE === 'true',
52
+ smtp_user: process.env.MUND_EMAIL_SMTP_USER,
53
+ smtp_pass: process.env.MUND_EMAIL_SMTP_PASS,
54
+ from_address: process.env.MUND_EMAIL_FROM || 'mund@localhost',
55
+ to_addresses: (process.env.MUND_EMAIL_TO || '').split(',').filter(Boolean),
56
+ min_severity: process.env.MUND_EMAIL_MIN_SEVERITY || 'high'
57
+ } : undefined,
58
+ webhooks: process.env.MUND_WEBHOOK_URL ? [{
59
+ url: process.env.MUND_WEBHOOK_URL,
60
+ method: 'POST',
61
+ headers: process.env.MUND_WEBHOOK_HEADERS ? JSON.parse(process.env.MUND_WEBHOOK_HEADERS) : undefined,
62
+ min_severity: process.env.MUND_WEBHOOK_MIN_SEVERITY || 'high'
63
+ }] : undefined
64
+ }
65
+ };
66
+ return config;
67
+ }
68
+ // ============================================================================
69
+ // Server Initialization
70
+ // ============================================================================
71
+ async function createMundServer(config) {
72
+ // Create MCP server
73
+ const server = new McpServer({
74
+ name: 'mund-mcp-server',
75
+ version: '0.1.0'
76
+ });
77
+ // Initialize storage
78
+ const storage = createStorage(config);
79
+ // Initialize analyzer engine
80
+ const analyzer = new AnalyzerEngine();
81
+ // Initialize notification hub
82
+ const notificationHub = new NotificationHub(config);
83
+ // Load rules (start with defaults, could be extended from file)
84
+ const rules = [...DEFAULT_RULES];
85
+ // Load any saved custom rules from storage
86
+ const savedRules = await storage.getRules();
87
+ for (const rule of savedRules) {
88
+ if (!rules.find(r => r.id === rule.id)) {
89
+ rules.push(rule);
90
+ }
91
+ }
92
+ // Register all tools
93
+ registerAllTools(server, storage, rules, analyzer, notificationHub, config.block_mode);
94
+ // Log startup info
95
+ console.error(`Mund Guardian Protocol v0.1.0`);
96
+ console.error(`- Transport: ${config.transport}`);
97
+ console.error(`- Storage: ${config.storage_type}`);
98
+ console.error(`- Block Mode: ${config.block_mode ? 'enabled' : 'disabled'}`);
99
+ console.error(`- Rules Loaded: ${rules.filter(r => r.enabled).length}`);
100
+ console.error(`- Notifiers: ${notificationHub.getNotifierNames().join(', ') || 'none'}`);
101
+ return server;
102
+ }
103
+ // ============================================================================
104
+ // Transport Handlers
105
+ // ============================================================================
106
+ async function runStdio(config) {
107
+ const server = await createMundServer(config);
108
+ const transport = new StdioServerTransport();
109
+ await server.connect(transport);
110
+ console.error('Mund MCP server running on stdio');
111
+ }
112
+ async function runHTTP(config) {
113
+ const server = await createMundServer(config);
114
+ const app = express();
115
+ app.use(express.json({ limit: '10mb' }));
116
+ // Health check endpoint
117
+ app.get('/health', (_req, res) => {
118
+ res.json({ status: 'ok', version: '0.1.0' });
119
+ });
120
+ // MCP endpoint
121
+ app.post('/mcp', async (req, res) => {
122
+ const transport = new StreamableHTTPServerTransport({
123
+ sessionIdGenerator: undefined,
124
+ enableJsonResponse: true
125
+ });
126
+ res.on('close', () => transport.close());
127
+ await server.connect(transport);
128
+ await transport.handleRequest(req, res, req.body);
129
+ });
130
+ // Start server
131
+ app.listen(config.port, config.host, () => {
132
+ console.error(`Mund MCP server running on http://${config.host}:${config.port}/mcp`);
133
+ });
134
+ }
135
+ // ============================================================================
136
+ // CLI and Main
137
+ // ============================================================================
138
+ function printHelp() {
139
+ console.log(`
140
+ Mund - The Guardian Protocol
141
+ MCP-based security monitoring for agentic AI systems
142
+
143
+ Usage: mund-mcp [options]
144
+
145
+ Options:
146
+ --help, -h Show this help message
147
+ --version, -v Show version number
148
+ --transport <type> Transport type: stdio (default) or http
149
+ --port <port> HTTP port (default: 3000)
150
+ --host <host> HTTP host (default: 127.0.0.1)
151
+ --block Enable block mode (block dangerous content)
152
+
153
+ Environment Variables:
154
+ MUND_PORT HTTP server port
155
+ MUND_HOST HTTP server host
156
+ MUND_TRANSPORT Transport type (stdio or http)
157
+ MUND_LOG_LEVEL Log level (debug, info, warn, error)
158
+ MUND_STORAGE Storage type (memory, sqlite, postgres)
159
+ MUND_DATABASE_URL Database connection URL
160
+ MUND_BLOCK_MODE Set to 'block' to enable blocking
161
+ MUND_API_KEY API key for authentication
162
+
163
+ MUND_SLACK_WEBHOOK Slack webhook URL
164
+ MUND_SLACK_CHANNEL Slack channel override
165
+ MUND_SLACK_MIN_SEVERITY Minimum severity for Slack alerts
166
+
167
+ MUND_TEAMS_WEBHOOK Microsoft Teams webhook URL
168
+ MUND_TEAMS_MIN_SEVERITY Minimum severity for Teams alerts
169
+
170
+ MUND_EMAIL_SMTP_HOST SMTP server host
171
+ MUND_EMAIL_SMTP_PORT SMTP server port
172
+ MUND_EMAIL_FROM From address for emails
173
+ MUND_EMAIL_TO Comma-separated recipient addresses
174
+
175
+ MUND_WEBHOOK_URL Generic webhook URL
176
+ MUND_WEBHOOK_HEADERS JSON string of webhook headers
177
+
178
+ Examples:
179
+ # Run as stdio server (for MCP clients)
180
+ mund-mcp
181
+
182
+ # Run as HTTP server
183
+ mund-mcp --transport http --port 3000
184
+
185
+ # Run with Slack notifications
186
+ MUND_SLACK_WEBHOOK=https://hooks.slack.com/... mund-mcp
187
+
188
+ # Run in block mode
189
+ mund-mcp --block
190
+
191
+ For more information, visit: https://github.com/your-org/mund-mcp
192
+ `);
193
+ }
194
+ async function main() {
195
+ const args = process.argv.slice(2);
196
+ // Parse CLI arguments
197
+ if (args.includes('--help') || args.includes('-h')) {
198
+ printHelp();
199
+ process.exit(0);
200
+ }
201
+ if (args.includes('--version') || args.includes('-v')) {
202
+ console.log('0.1.0');
203
+ process.exit(0);
204
+ }
205
+ // Load config
206
+ const config = loadConfig();
207
+ // Override from CLI
208
+ const transportIndex = args.indexOf('--transport');
209
+ if (transportIndex !== -1 && args[transportIndex + 1]) {
210
+ config.transport = args[transportIndex + 1];
211
+ }
212
+ const portIndex = args.indexOf('--port');
213
+ if (portIndex !== -1 && args[portIndex + 1]) {
214
+ config.port = parseInt(args[portIndex + 1]);
215
+ }
216
+ const hostIndex = args.indexOf('--host');
217
+ if (hostIndex !== -1 && args[hostIndex + 1]) {
218
+ config.host = args[hostIndex + 1];
219
+ }
220
+ if (args.includes('--block')) {
221
+ config.block_mode = true;
222
+ }
223
+ // Run appropriate transport
224
+ try {
225
+ if (config.transport === 'http') {
226
+ await runHTTP(config);
227
+ }
228
+ else {
229
+ await runStdio(config);
230
+ }
231
+ }
232
+ catch (error) {
233
+ console.error('Failed to start Mund server:', error);
234
+ process.exit(1);
235
+ }
236
+ }
237
+ // Run
238
+ main().catch(error => {
239
+ console.error('Fatal error:', error);
240
+ process.exit(1);
241
+ });
242
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Mund - The Guardian Protocol
3
+ * Email Notifier - Send alerts via email
4
+ */
5
+ import type { INotifier, NotificationPayload, EmailConfig } from '../types.js';
6
+ export declare class EmailNotifier implements INotifier {
7
+ name: string;
8
+ private config;
9
+ constructor(config: EmailConfig);
10
+ send(payload: NotificationPayload): Promise<boolean>;
11
+ private formatEmail;
12
+ private escapeHtml;
13
+ private getSeverityColor;
14
+ private getSeverityEmoji;
15
+ private meetsMinSeverity;
16
+ }
17
+ export default EmailNotifier;
18
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/notifications/email.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AAKzF,qBAAa,aAAc,YAAW,SAAS;IAC7C,IAAI,SAAmB;IACvB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IAIzB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4C1D,OAAO,CAAC,WAAW;IA6GnB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,gBAAgB;CAMzB;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Mund - The Guardian Protocol
3
+ * Email Notifier - Send alerts via email
4
+ */
5
+ // Note: In production, use nodemailer
6
+ // For now, we'll implement a basic interface that can be extended
7
+ export class EmailNotifier {
8
+ name = 'EmailNotifier';
9
+ config;
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+ async send(payload) {
14
+ const { event } = payload;
15
+ // Check minimum severity
16
+ if (this.config.min_severity && !this.meetsMinSeverity(event.severity, this.config.min_severity)) {
17
+ return true; // Successfully skipped
18
+ }
19
+ const emailContent = this.formatEmail(payload);
20
+ try {
21
+ // In a real implementation, use nodemailer here
22
+ // For now, we'll log the email content
23
+ console.log('Email notification would be sent:');
24
+ console.log('To:', this.config.to_addresses.join(', '));
25
+ console.log('Subject:', emailContent.subject);
26
+ console.log('Body:', emailContent.html.substring(0, 500) + '...');
27
+ // Uncomment when nodemailer is configured:
28
+ // const transporter = nodemailer.createTransport({
29
+ // host: this.config.smtp_host,
30
+ // port: this.config.smtp_port,
31
+ // secure: this.config.smtp_secure,
32
+ // auth: this.config.smtp_user ? {
33
+ // user: this.config.smtp_user,
34
+ // pass: this.config.smtp_pass
35
+ // } : undefined
36
+ // });
37
+ //
38
+ // await transporter.sendMail({
39
+ // from: this.config.from_address,
40
+ // to: this.config.to_addresses.join(', '),
41
+ // subject: emailContent.subject,
42
+ // html: emailContent.html,
43
+ // text: emailContent.text
44
+ // });
45
+ return true;
46
+ }
47
+ catch (error) {
48
+ console.error('Failed to send email notification:', error);
49
+ return false;
50
+ }
51
+ }
52
+ formatEmail(payload) {
53
+ const { event } = payload;
54
+ const severityEmoji = this.getSeverityEmoji(event.severity);
55
+ const severityColor = this.getSeverityColor(event.severity);
56
+ const subject = `${severityEmoji} [Mund ${event.severity.toUpperCase()}] ${event.rule_name}`;
57
+ const html = `
58
+ <!DOCTYPE html>
59
+ <html>
60
+ <head>
61
+ <style>
62
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
63
+ .container { max-width: 600px; margin: 0 auto; padding: 20px; }
64
+ .header { background: ${severityColor}; color: white; padding: 20px; border-radius: 8px 8px 0 0; }
65
+ .content { background: #f8f9fa; padding: 20px; border: 1px solid #dee2e6; border-top: none; border-radius: 0 0 8px 8px; }
66
+ .snippet { background: #1e1e1e; color: #d4d4d4; padding: 15px; border-radius: 4px; font-family: monospace; overflow-x: auto; }
67
+ .details { margin-top: 20px; }
68
+ .detail-row { display: flex; border-bottom: 1px solid #dee2e6; padding: 8px 0; }
69
+ .detail-label { font-weight: bold; width: 120px; flex-shrink: 0; }
70
+ .detail-value { color: #495057; }
71
+ .footer { margin-top: 20px; padding-top: 20px; border-top: 1px solid #dee2e6; font-size: 12px; color: #6c757d; }
72
+ </style>
73
+ </head>
74
+ <body>
75
+ <div class="container">
76
+ <div class="header">
77
+ <h1 style="margin: 0;">${severityEmoji} Mund Security Alert</h1>
78
+ <p style="margin: 10px 0 0 0; opacity: 0.9;">${event.rule_name}</p>
79
+ </div>
80
+ <div class="content">
81
+ <h3>Detected Content</h3>
82
+ <div class="snippet">${this.escapeHtml(event.content_snippet)}</div>
83
+
84
+ <div class="details">
85
+ <h3>Event Details</h3>
86
+ <div class="detail-row">
87
+ <span class="detail-label">Severity:</span>
88
+ <span class="detail-value">${event.severity.toUpperCase()}</span>
89
+ </div>
90
+ <div class="detail-row">
91
+ <span class="detail-label">Type:</span>
92
+ <span class="detail-value">${event.type}</span>
93
+ </div>
94
+ <div class="detail-row">
95
+ <span class="detail-label">Action:</span>
96
+ <span class="detail-value">${event.action_taken}</span>
97
+ </div>
98
+ <div class="detail-row">
99
+ <span class="detail-label">Rule ID:</span>
100
+ <span class="detail-value">${event.rule_id}</span>
101
+ </div>
102
+ <div class="detail-row">
103
+ <span class="detail-label">Event ID:</span>
104
+ <span class="detail-value">${event.id}</span>
105
+ </div>
106
+ <div class="detail-row">
107
+ <span class="detail-label">Timestamp:</span>
108
+ <span class="detail-value">${event.timestamp.toISOString()}</span>
109
+ </div>
110
+ ${event.context.tool_name ? `
111
+ <div class="detail-row">
112
+ <span class="detail-label">Tool:</span>
113
+ <span class="detail-value">${event.context.tool_name}</span>
114
+ </div>
115
+ ` : ''}
116
+ ${event.context.agent_id ? `
117
+ <div class="detail-row">
118
+ <span class="detail-label">Agent:</span>
119
+ <span class="detail-value">${event.context.agent_id}</span>
120
+ </div>
121
+ ` : ''}
122
+ </div>
123
+
124
+ <div class="footer">
125
+ This alert was generated by Mund - The Guardian Protocol.<br>
126
+ Review and acknowledge this alert in your security dashboard.
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </body>
131
+ </html>`;
132
+ const text = `
133
+ MUND SECURITY ALERT
134
+ ====================
135
+
136
+ ${event.severity.toUpperCase()}: ${event.rule_name}
137
+
138
+ Detected Content:
139
+ ${event.content_snippet}
140
+
141
+ Event Details:
142
+ - Severity: ${event.severity.toUpperCase()}
143
+ - Type: ${event.type}
144
+ - Action: ${event.action_taken}
145
+ - Rule ID: ${event.rule_id}
146
+ - Event ID: ${event.id}
147
+ - Timestamp: ${event.timestamp.toISOString()}
148
+ ${event.context.tool_name ? `- Tool: ${event.context.tool_name}` : ''}
149
+ ${event.context.agent_id ? `- Agent: ${event.context.agent_id}` : ''}
150
+
151
+ ---
152
+ This alert was generated by Mund - The Guardian Protocol.
153
+ `;
154
+ return { subject, html, text };
155
+ }
156
+ escapeHtml(text) {
157
+ return text
158
+ .replace(/&/g, '&amp;')
159
+ .replace(/</g, '&lt;')
160
+ .replace(/>/g, '&gt;')
161
+ .replace(/"/g, '&quot;')
162
+ .replace(/'/g, '&#039;');
163
+ }
164
+ getSeverityColor(severity) {
165
+ const colors = {
166
+ critical: '#dc3545',
167
+ high: '#fd7e14',
168
+ medium: '#ffc107',
169
+ low: '#17a2b8',
170
+ info: '#6c757d'
171
+ };
172
+ return colors[severity] || colors.info;
173
+ }
174
+ getSeverityEmoji(severity) {
175
+ const emojis = {
176
+ critical: '🚨',
177
+ high: '⚠️',
178
+ medium: '⚡',
179
+ low: 'ℹ️',
180
+ info: '📝'
181
+ };
182
+ return emojis[severity] || '📝';
183
+ }
184
+ meetsMinSeverity(eventSeverity, minSeverity) {
185
+ const order = ['critical', 'high', 'medium', 'low', 'info'];
186
+ const eventIndex = order.indexOf(eventSeverity);
187
+ const minIndex = order.indexOf(minSeverity);
188
+ return eventIndex <= minIndex;
189
+ }
190
+ }
191
+ export default EmailNotifier;
192
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/notifications/email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Mund - The Guardian Protocol
3
+ * Notifications Index - Notification hub and exports
4
+ */
5
+ export { SlackNotifier } from './slack.js';
6
+ export { TeamsNotifier } from './teams.js';
7
+ export { EmailNotifier } from './email.js';
8
+ export { WebhookNotifier } from './webhook.js';
9
+ import type { INotifier, SecurityEvent, MundConfig } from '../types.js';
10
+ /**
11
+ * Notification Hub - Manages and dispatches notifications to all configured channels
12
+ */
13
+ export declare class NotificationHub {
14
+ private notifiers;
15
+ private config;
16
+ constructor(config: MundConfig);
17
+ private initializeNotifiers;
18
+ /**
19
+ * Send notification to all configured channels
20
+ */
21
+ notify(event: SecurityEvent): Promise<{
22
+ success: boolean;
23
+ results: NotificationResult[];
24
+ }>;
25
+ /**
26
+ * Format a human-readable message
27
+ */
28
+ private formatMessage;
29
+ /**
30
+ * Add a notifier at runtime
31
+ */
32
+ addNotifier(notifier: INotifier): void;
33
+ /**
34
+ * Remove a notifier by name
35
+ */
36
+ removeNotifier(name: string): void;
37
+ /**
38
+ * Get list of configured notifiers
39
+ */
40
+ getNotifierNames(): string[];
41
+ /**
42
+ * Check if any notifiers are configured
43
+ */
44
+ hasNotifiers(): boolean;
45
+ }
46
+ interface NotificationResult {
47
+ notifier: string;
48
+ success: boolean;
49
+ error?: string;
50
+ }
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAM/C,OAAO,KAAK,EACV,SAAS,EAGT,aAAa,EACb,UAAU,EACX,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAK9B,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC;IAkChG;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAItC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,YAAY,IAAI,OAAO;CAGxB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Mund - The Guardian Protocol
3
+ * Notifications Index - Notification hub and exports
4
+ */
5
+ export { SlackNotifier } from './slack.js';
6
+ export { TeamsNotifier } from './teams.js';
7
+ export { EmailNotifier } from './email.js';
8
+ export { WebhookNotifier } from './webhook.js';
9
+ import { SlackNotifier } from './slack.js';
10
+ import { TeamsNotifier } from './teams.js';
11
+ import { EmailNotifier } from './email.js';
12
+ import { WebhookNotifier } from './webhook.js';
13
+ /**
14
+ * Notification Hub - Manages and dispatches notifications to all configured channels
15
+ */
16
+ export class NotificationHub {
17
+ notifiers = [];
18
+ config;
19
+ constructor(config) {
20
+ this.config = config;
21
+ this.initializeNotifiers(config.notifications);
22
+ }
23
+ initializeNotifiers(notificationConfig) {
24
+ // Slack
25
+ if (notificationConfig.slack?.webhook_url) {
26
+ this.notifiers.push(new SlackNotifier(notificationConfig.slack));
27
+ }
28
+ // Teams
29
+ if (notificationConfig.teams?.webhook_url) {
30
+ this.notifiers.push(new TeamsNotifier(notificationConfig.teams));
31
+ }
32
+ // Email
33
+ if (notificationConfig.email?.smtp_host) {
34
+ this.notifiers.push(new EmailNotifier(notificationConfig.email));
35
+ }
36
+ // Webhooks
37
+ if (notificationConfig.webhooks) {
38
+ for (const webhookConfig of notificationConfig.webhooks) {
39
+ this.notifiers.push(new WebhookNotifier(webhookConfig));
40
+ }
41
+ }
42
+ }
43
+ /**
44
+ * Send notification to all configured channels
45
+ */
46
+ async notify(event) {
47
+ if (this.notifiers.length === 0) {
48
+ return { success: true, results: [] };
49
+ }
50
+ const payload = {
51
+ event,
52
+ config: this.config,
53
+ formatted_message: this.formatMessage(event)
54
+ };
55
+ const results = [];
56
+ for (const notifier of this.notifiers) {
57
+ try {
58
+ const success = await notifier.send(payload);
59
+ results.push({
60
+ notifier: notifier.name,
61
+ success,
62
+ error: success ? undefined : 'Failed to send notification'
63
+ });
64
+ }
65
+ catch (error) {
66
+ results.push({
67
+ notifier: notifier.name,
68
+ success: false,
69
+ error: error instanceof Error ? error.message : 'Unknown error'
70
+ });
71
+ }
72
+ }
73
+ const allSuccessful = results.every(r => r.success);
74
+ return { success: allSuccessful, results };
75
+ }
76
+ /**
77
+ * Format a human-readable message
78
+ */
79
+ formatMessage(event) {
80
+ return `[${event.severity.toUpperCase()}] ${event.rule_name}: ${event.content_snippet}`;
81
+ }
82
+ /**
83
+ * Add a notifier at runtime
84
+ */
85
+ addNotifier(notifier) {
86
+ this.notifiers.push(notifier);
87
+ }
88
+ /**
89
+ * Remove a notifier by name
90
+ */
91
+ removeNotifier(name) {
92
+ this.notifiers = this.notifiers.filter(n => n.name !== name);
93
+ }
94
+ /**
95
+ * Get list of configured notifiers
96
+ */
97
+ getNotifierNames() {
98
+ return this.notifiers.map(n => n.name);
99
+ }
100
+ /**
101
+ * Check if any notifiers are configured
102
+ */
103
+ hasNotifiers() {
104
+ return this.notifiers.length > 0;
105
+ }
106
+ }
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Mund - The Guardian Protocol
3
+ * Slack Notifier - Send alerts to Slack channels
4
+ */
5
+ import type { INotifier, NotificationPayload, SlackConfig } from '../types.js';
6
+ export declare class SlackNotifier implements INotifier {
7
+ name: string;
8
+ private config;
9
+ constructor(config: SlackConfig);
10
+ send(payload: NotificationPayload): Promise<boolean>;
11
+ private formatMessage;
12
+ private getSeverityColor;
13
+ private getSeverityEmoji;
14
+ private meetsMinSeverity;
15
+ }
16
+ export default SlackNotifier;
17
+ //# sourceMappingURL=slack.d.ts.map