@jungjaehoon/mama-os 0.22.0 → 0.22.1
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/runtime/api-routes-init.d.ts.map +1 -1
- package/dist/cli/runtime/api-routes-init.js +67 -145
- package/dist/cli/runtime/api-routes-init.js.map +1 -1
- package/dist/cli/runtime/gateway-wiring.d.ts.map +1 -1
- package/dist/cli/runtime/gateway-wiring.js +6 -0
- package/dist/cli/runtime/gateway-wiring.js.map +1 -1
- package/dist/gateways/telegram.d.ts +1 -0
- package/dist/gateways/telegram.d.ts.map +1 -1
- package/dist/gateways/telegram.js +25 -1
- package/dist/gateways/telegram.js.map +1 -1
- package/dist/memory/history-extractor.d.ts.map +1 -1
- package/dist/memory/history-extractor.js +10 -5
- package/dist/memory/history-extractor.js.map +1 -1
- package/dist/observability/code-audit.d.ts +83 -0
- package/dist/observability/code-audit.d.ts.map +1 -0
- package/dist/observability/code-audit.js +334 -0
- package/dist/observability/code-audit.js.map +1 -0
- package/dist/operator/situation-report.d.ts.map +1 -1
- package/dist/operator/situation-report.js +2 -1
- package/dist/operator/situation-report.js.map +1 -1
- package/dist/security/security-monitor.d.ts +12 -0
- package/dist/security/security-monitor.d.ts.map +1 -1
- package/dist/security/security-monitor.js +51 -14
- package/dist/security/security-monitor.js.map +1 -1
- package/dist/utils/untrusted-content.d.ts +18 -0
- package/dist/utils/untrusted-content.d.ts.map +1 -0
- package/dist/utils/untrusted-content.js +34 -0
- package/dist/utils/untrusted-content.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic code-based system audit.
|
|
4
|
+
*
|
|
5
|
+
* Lands the 2026-04-22 owner decision (mama_conductor_audit_code_based_read_only):
|
|
6
|
+
* the hourly audit is fact collection and recording, executed by code - no LLM
|
|
7
|
+
* invocation, no auto-fix, no filesystem access beyond explicit read-only checks.
|
|
8
|
+
* The previous LLM audit loop once exfiltrated a credential when its report
|
|
9
|
+
* path failed; this module removes that class of failure structurally.
|
|
10
|
+
*
|
|
11
|
+
* Every check here is read-only and local. MAJOR findings are alerted through
|
|
12
|
+
* a caller-provided callback subject to the 24h dedup contract the checklist
|
|
13
|
+
* established (alert only NEW / ESCALATED / older-than-24h re-alerts). MINOR
|
|
14
|
+
* and INFO findings are recorded in the state file, never alerted.
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.runCodeAudit = runCodeAudit;
|
|
51
|
+
const node_fs_1 = require("node:fs");
|
|
52
|
+
const promises_1 = require("node:fs/promises");
|
|
53
|
+
const node_os_1 = require("node:os");
|
|
54
|
+
const node_path_1 = require("node:path");
|
|
55
|
+
const yaml = __importStar(require("js-yaml"));
|
|
56
|
+
const CHECKLIST_VERSION = 'code-2026-07-17';
|
|
57
|
+
const REALERT_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
58
|
+
const MEMORY_WAL_LIMIT = 10 * 1024 * 1024;
|
|
59
|
+
const METRICS_WAL_LIMIT = 5 * 1024 * 1024;
|
|
60
|
+
const DAEMON_LOG_LIMIT = 50 * 1024 * 1024;
|
|
61
|
+
const SEVERITY_RANK = { INFO: 0, MINOR: 1, MAJOR: 2 };
|
|
62
|
+
function fileSize(path) {
|
|
63
|
+
try {
|
|
64
|
+
return (0, node_fs_1.statSync)(path).size;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* First line of a parse error only, length-capped. js-yaml's YAMLException
|
|
72
|
+
* message embeds a source snippet of the malformed file; config files hold
|
|
73
|
+
* tokens, so the snippet must never travel into alert payloads.
|
|
74
|
+
*/
|
|
75
|
+
function sanitizeParseError(error) {
|
|
76
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
77
|
+
return message.split('\n')[0].slice(0, 200);
|
|
78
|
+
}
|
|
79
|
+
function checkParseable(path, kind, findings, passes) {
|
|
80
|
+
const name = (0, node_path_1.basename)(path);
|
|
81
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
82
|
+
passes.push(`${name}: absent (nothing to validate)`);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const raw = (0, node_fs_1.readFileSync)(path, 'utf8');
|
|
87
|
+
if (kind === 'yaml') {
|
|
88
|
+
yaml.load(raw);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
JSON.parse(raw);
|
|
92
|
+
}
|
|
93
|
+
passes.push(`${name}: valid ${kind.toUpperCase()}`);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
findings.push({
|
|
97
|
+
id: `config-parse-${name}`,
|
|
98
|
+
severity: 'MAJOR',
|
|
99
|
+
summary: `${name} is not valid ${kind.toUpperCase()}`,
|
|
100
|
+
detail: sanitizeParseError(error),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function checkFileSizeLimit(id, path, limit, severity, findings, passes) {
|
|
105
|
+
const size = fileSize(path);
|
|
106
|
+
const name = (0, node_path_1.basename)(path);
|
|
107
|
+
if (size === null) {
|
|
108
|
+
passes.push(`${name}: absent`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const mb = (size / 1024 / 1024).toFixed(1);
|
|
112
|
+
const limitMb = (limit / 1024 / 1024).toFixed(0);
|
|
113
|
+
if (size < limit) {
|
|
114
|
+
passes.push(`${name}: ${mb}MB < ${limitMb}MB limit`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
findings.push({
|
|
118
|
+
id,
|
|
119
|
+
severity,
|
|
120
|
+
summary: `${name} is ${mb}MB (limit ${limitMb}MB)`,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function checkHealthEndpoint(url, findings, passes) {
|
|
125
|
+
let outcome;
|
|
126
|
+
const controller = new AbortController();
|
|
127
|
+
const timer = setTimeout(() => controller.abort(), 3_000);
|
|
128
|
+
try {
|
|
129
|
+
const res = await fetch(url, { signal: controller.signal });
|
|
130
|
+
const body = await res.text();
|
|
131
|
+
let structurallyOk = false;
|
|
132
|
+
try {
|
|
133
|
+
const parsed = JSON.parse(body);
|
|
134
|
+
structurallyOk = parsed.status === 'ok';
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
structurallyOk = false;
|
|
138
|
+
}
|
|
139
|
+
outcome = {
|
|
140
|
+
ok: res.status === 200 && structurallyOk,
|
|
141
|
+
detail: `HTTP ${res.status} ${body.slice(0, 120)}`,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
const aborted = error instanceof Error && error.name === 'AbortError';
|
|
146
|
+
outcome = {
|
|
147
|
+
ok: false,
|
|
148
|
+
detail: aborted ? 'timeout after 3s' : error instanceof Error ? error.message : String(error),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
}
|
|
154
|
+
if (outcome.ok) {
|
|
155
|
+
passes.push(`health endpoint: ${outcome.detail}`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
findings.push({
|
|
159
|
+
id: 'health-endpoint',
|
|
160
|
+
severity: 'MAJOR',
|
|
161
|
+
summary: 'Local /health endpoint is not answering ok',
|
|
162
|
+
detail: outcome.detail,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function expandHome(p) {
|
|
167
|
+
return p.startsWith('~') ? (0, node_path_1.join)((0, node_os_1.homedir)(), p.slice(1)) : p;
|
|
168
|
+
}
|
|
169
|
+
async function readState(stateFilePath) {
|
|
170
|
+
let raw;
|
|
171
|
+
try {
|
|
172
|
+
raw = await (0, promises_1.readFile)(stateFilePath, 'utf8');
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
// Missing file is the normal first run. Anything else (EACCES, EIO) is a
|
|
176
|
+
// real system problem: fail the audit run loudly instead of silently
|
|
177
|
+
// resetting dedup history - the subsequent state write would fail anyway.
|
|
178
|
+
if (error.code === 'ENOENT') {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const parsed = JSON.parse(raw);
|
|
185
|
+
return Array.isArray(parsed.findings) ? parsed.findings : [];
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
// Corrupt state is NOT silent: dedup history is lost, so every current
|
|
189
|
+
// MAJOR re-alerts as new. Over-alerting is the safe direction, but the
|
|
190
|
+
// owner must be able to see why.
|
|
191
|
+
console.warn(`[code-audit] audit state file is corrupt, resetting dedup history (${stateFilePath}): ${error instanceof Error ? error.message : String(error)}`);
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async function runCodeAudit(options = {}) {
|
|
196
|
+
const startedAt = Date.now();
|
|
197
|
+
const now = options.now ? options.now() : new Date();
|
|
198
|
+
const nowIso = now.toISOString();
|
|
199
|
+
const mamaDir = options.mamaDir || (0, node_path_1.join)((0, node_os_1.homedir)(), '.mama');
|
|
200
|
+
const stateFilePath = options.stateFilePath || (0, node_path_1.join)(mamaDir, 'state', 'audit-findings.json');
|
|
201
|
+
const daemonLogPath = options.daemonLogPath || (0, node_path_1.join)(mamaDir, 'logs', 'daemon.log');
|
|
202
|
+
const healthUrl = options.healthUrl ?? 'http://127.0.0.1:3847/health';
|
|
203
|
+
const findings = [];
|
|
204
|
+
const passes = [];
|
|
205
|
+
// Config parse checks
|
|
206
|
+
checkParseable((0, node_path_1.join)(mamaDir, 'config.yaml'), 'yaml', findings, passes);
|
|
207
|
+
checkParseable((0, node_path_1.join)(mamaDir, 'config.json'), 'json', findings, passes);
|
|
208
|
+
checkParseable((0, node_path_1.join)(mamaDir, 'connectors.json'), 'json', findings, passes);
|
|
209
|
+
// Size limits
|
|
210
|
+
checkFileSizeLimit('memory-db-wal', (0, node_path_1.join)(mamaDir, 'mama-memory.db-wal'), MEMORY_WAL_LIMIT, 'MINOR', findings, passes);
|
|
211
|
+
checkFileSizeLimit('metrics-db-wal', (0, node_path_1.join)(mamaDir, 'mama-metrics.db-wal'), METRICS_WAL_LIMIT, 'MINOR', findings, passes);
|
|
212
|
+
checkFileSizeLimit('daemon-log-size', daemonLogPath, DAEMON_LOG_LIMIT, 'MINOR', findings, passes);
|
|
213
|
+
// Health endpoint (self-check through the real server socket)
|
|
214
|
+
if (healthUrl) {
|
|
215
|
+
await checkHealthEndpoint(healthUrl, findings, passes);
|
|
216
|
+
}
|
|
217
|
+
// Persona files referenced by multi-agent config
|
|
218
|
+
const agents = options.config?.multi_agent?.agents || {};
|
|
219
|
+
const multiAgentEnabled = options.config?.multi_agent?.enabled === true;
|
|
220
|
+
for (const [agentId, agent] of Object.entries(agents)) {
|
|
221
|
+
if (!agent?.persona_file) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const personaPath = expandHome(agent.persona_file);
|
|
225
|
+
if ((0, node_fs_1.existsSync)(personaPath)) {
|
|
226
|
+
passes.push(`persona ${agentId}: file exists`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
findings.push({
|
|
230
|
+
id: `persona-missing-${agentId}`,
|
|
231
|
+
severity: multiAgentEnabled ? 'MINOR' : 'INFO',
|
|
232
|
+
summary: `Persona file for agent "${agentId}" is missing`,
|
|
233
|
+
detail: personaPath,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Security hygiene
|
|
238
|
+
if (options.securityAlertConfigured === false) {
|
|
239
|
+
findings.push({
|
|
240
|
+
id: 'security-alert-channel-missing',
|
|
241
|
+
severity: 'MINOR',
|
|
242
|
+
summary: 'No security alert channel configured (MAMA_SECURITY_ALERT_CHANNELS or gateway default)',
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
else if (options.securityAlertConfigured === true) {
|
|
246
|
+
passes.push('security alert channel configured');
|
|
247
|
+
}
|
|
248
|
+
const telegram = options.config?.telegram;
|
|
249
|
+
if (telegram?.enabled) {
|
|
250
|
+
if (Array.isArray(telegram.allowed_chats) && telegram.allowed_chats.length > 0) {
|
|
251
|
+
passes.push(`telegram inbound allowlist: ${telegram.allowed_chats.length} chat(s)`);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
findings.push({
|
|
255
|
+
id: 'telegram-open-inbound',
|
|
256
|
+
severity: 'MAJOR',
|
|
257
|
+
summary: 'Telegram gateway accepts messages from ANY chat (allowed_chats unset)',
|
|
258
|
+
detail: 'Set telegram.allowed_chats in config.yaml to the owner chat id(s).',
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Dedup + alert per the 24h contract
|
|
263
|
+
const previous = await readState(stateFilePath);
|
|
264
|
+
const previousById = new Map(previous.map((f) => [f.id, f]));
|
|
265
|
+
const alerted = [];
|
|
266
|
+
const alertDeliveryFailures = [];
|
|
267
|
+
const stored = [];
|
|
268
|
+
for (const finding of findings) {
|
|
269
|
+
const prior = previousById.get(finding.id);
|
|
270
|
+
const firstSeen = prior?.first_seen || nowIso;
|
|
271
|
+
let lastAlertedAt = prior?.last_alerted_at ?? null;
|
|
272
|
+
if (finding.severity === 'MAJOR') {
|
|
273
|
+
let reason = null;
|
|
274
|
+
if (!prior) {
|
|
275
|
+
reason = 'new';
|
|
276
|
+
}
|
|
277
|
+
else if (SEVERITY_RANK[finding.severity] > SEVERITY_RANK[prior.severity]) {
|
|
278
|
+
// Reachable across checklist_version upgrades: when a check's grading
|
|
279
|
+
// changes (e.g. a MINOR becomes MAJOR in a new release), the stored
|
|
280
|
+
// lower severity escalates and must alert immediately instead of
|
|
281
|
+
// waiting out a 24h window stamped under the old grading.
|
|
282
|
+
reason = 'escalated';
|
|
283
|
+
}
|
|
284
|
+
else if (!prior.last_alerted_at ||
|
|
285
|
+
now.getTime() - Date.parse(prior.last_alerted_at) >= REALERT_INTERVAL_MS) {
|
|
286
|
+
reason = 're-alert';
|
|
287
|
+
}
|
|
288
|
+
if (reason && options.alert) {
|
|
289
|
+
try {
|
|
290
|
+
await options.alert(finding, reason);
|
|
291
|
+
alerted.push(finding.id);
|
|
292
|
+
lastAlertedAt = nowIso;
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
// Fail loud in the report; the finding stays un-alerted so the next
|
|
296
|
+
// run retries instead of silently swallowing delivery failure.
|
|
297
|
+
alertDeliveryFailures.push(`${finding.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
stored.push({
|
|
302
|
+
id: finding.id,
|
|
303
|
+
severity: finding.severity,
|
|
304
|
+
summary: finding.summary,
|
|
305
|
+
detail: finding.detail,
|
|
306
|
+
first_seen: firstSeen,
|
|
307
|
+
last_seen: nowIso,
|
|
308
|
+
last_alerted_at: lastAlertedAt,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
const currentIds = new Set(findings.map((f) => f.id));
|
|
312
|
+
const resolved = previous.filter((f) => !currentIds.has(f.id)).map((f) => f.id);
|
|
313
|
+
const state = {
|
|
314
|
+
audit_date: nowIso.slice(0, 10),
|
|
315
|
+
audit_timestamp: nowIso,
|
|
316
|
+
checklist_version: CHECKLIST_VERSION,
|
|
317
|
+
findings: stored,
|
|
318
|
+
resolved_since_last_run: resolved,
|
|
319
|
+
pass_items: passes,
|
|
320
|
+
};
|
|
321
|
+
await (0, promises_1.mkdir)((0, node_path_1.dirname)(stateFilePath), { recursive: true });
|
|
322
|
+
await (0, promises_1.writeFile)(stateFilePath, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
|
|
323
|
+
return {
|
|
324
|
+
mode: 'code',
|
|
325
|
+
timestamp: nowIso,
|
|
326
|
+
duration_ms: Date.now() - startedAt,
|
|
327
|
+
findings,
|
|
328
|
+
pass_items: passes,
|
|
329
|
+
alerted,
|
|
330
|
+
alert_delivery_failures: alertDeliveryFailures,
|
|
331
|
+
resolved_since_last_run: resolved,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=code-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-audit.js","sourceRoot":"","sources":["../../src/observability/code-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"situation-report.d.ts","sourceRoot":"","sources":["../../src/operator/situation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"situation-report.d.ts","sourceRoot":"","sources":["../../src/operator/situation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAqB3C,MAAM,WAAW,wBAAwB;IACvC;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACnD;AAKD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,IAAI,CAA2B;gBAE3B,IAAI,GAAE,wBAA6B;IAI/C,0EAA0E;IAC1E,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,IAAI;IAgBlD,2FAA2F;IAC3F,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAmBxC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAInC,uFAAuF;IACvF,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,MAAM,CACV,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAChC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,OAAO,CAAC;IA2CnB,OAAO,CAAC,KAAK;IAQb,kGAAkG;IAClG,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;CAuHtC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SituationReporter = exports.OPERATOR_FULL_REPORT_TAG = void 0;
|
|
4
|
+
const untrusted_content_js_1 = require("../utils/untrusted-content.js");
|
|
4
5
|
/**
|
|
5
6
|
* Machine frame tag prepended to the FULL report prompt so the report-run wiring can tell a full
|
|
6
7
|
* report from a digest for tool-use auditing (report-run.ts). Kagemusha frames its scheduled full
|
|
@@ -206,7 +207,7 @@ class SituationReporter {
|
|
|
206
207
|
`Current local time: ${new Date().toLocaleString()}. Use LOCAL time in the report, never UTC.`,
|
|
207
208
|
'',
|
|
208
209
|
'Window (per channel; excerpts truncated):',
|
|
209
|
-
|
|
210
|
+
(0, untrusted_content_js_1.wrapUntrustedContent)('connector-window', windowLines.length > 0 ? windowLines.join('\n') : '- (no channel messages this window)'),
|
|
210
211
|
'',
|
|
211
212
|
`Triggers newly authored this window: ${this.authored}`,
|
|
212
213
|
'Fire activity:',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"situation-report.js","sourceRoot":"","sources":["../../src/operator/situation-report.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"situation-report.js","sourceRoot":"","sources":["../../src/operator/situation-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,18 @@ declare function getDenylistTxtPath(): string;
|
|
|
28
28
|
declare function getCloudflareCustomListCsvPath(): string;
|
|
29
29
|
declare function getCloudflareWafExpressionPath(): string;
|
|
30
30
|
export declare function setSecurityAlertSender(sender: SecurityAlertSender | null): void;
|
|
31
|
+
export declare function hasSecurityAlertSender(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Deliver an alert through the registered sender WITHOUT the incident pipeline.
|
|
34
|
+
*
|
|
35
|
+
* recordSecurityEvent() preserves evidence, writes denylist candidates, and
|
|
36
|
+
* runs RDAP attribution - correct for real client events, but self-generated
|
|
37
|
+
* alerts (system audit findings) must not fabricate incident/denylist/WAF
|
|
38
|
+
* artifacts for a pseudo client. This path only appends the event to the
|
|
39
|
+
* security log (durable record) and AWAITS delivery so the caller can retry:
|
|
40
|
+
* it throws when no sender is registered or when the sender fails.
|
|
41
|
+
*/
|
|
42
|
+
export declare function dispatchSecurityAlertDirect(event: SecurityEvent): Promise<void>;
|
|
31
43
|
export declare function resetSecurityMonitorForTests(): void;
|
|
32
44
|
export declare function flushSecurityMonitor(): Promise<void>;
|
|
33
45
|
export declare function formatSecurityAlert(event: SecurityEvent): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-monitor.d.ts","sourceRoot":"","sources":["../../src/security/security-monitor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAuD/D,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO5E;AAED,wBAAgB,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CASjE;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAuBhF;AAiBD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAgHnE,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAcjF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;
|
|
1
|
+
{"version":3,"file":"security-monitor.d.ts","sourceRoot":"","sources":["../../src/security/security-monitor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAuD/D,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO5E;AAED,wBAAgB,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CASjE;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAuBhF;AAiBD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAaD,KAAK,mBAAmB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAgHnE,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAcjF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AA0OD,iBAAS,kBAAkB,IAAI,MAAM,CAEpC;AAED,iBAAS,iBAAiB,IAAI,MAAM,CAEnC;AAED,iBAAS,mBAAmB,IAAI,MAAM,CAErC;AAED,iBAAS,kBAAkB,IAAI,MAAM,CAEpC;AAED,iBAAS,8BAA8B,IAAI,MAAM,CAEhD;AAED,iBAAS,8BAA8B,IAAI,MAAM,CAEhD;AAuND,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAK/E;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrF;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CASnD;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAmChE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAoC9D;AAED,wBAAgB,wBAAwB,KACxB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAgD9E;AAED,OAAO,EACL,8BAA8B,EAC9B,8BAA8B,EAC9B,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,CAAC"}
|
|
@@ -39,6 +39,8 @@ exports.recordAuthFailure = recordAuthFailure;
|
|
|
39
39
|
exports.getTarpitDelayMs = getTarpitDelayMs;
|
|
40
40
|
exports.isHoneypotPath = isHoneypotPath;
|
|
41
41
|
exports.setSecurityAlertSender = setSecurityAlertSender;
|
|
42
|
+
exports.hasSecurityAlertSender = hasSecurityAlertSender;
|
|
43
|
+
exports.dispatchSecurityAlertDirect = dispatchSecurityAlertDirect;
|
|
42
44
|
exports.resetSecurityMonitorForTests = resetSecurityMonitorForTests;
|
|
43
45
|
exports.flushSecurityMonitor = flushSecurityMonitor;
|
|
44
46
|
exports.formatSecurityAlert = formatSecurityAlert;
|
|
@@ -405,7 +407,10 @@ function formatAbuseReport(incidentId, incidentSummary) {
|
|
|
405
407
|
].join('\n');
|
|
406
408
|
}
|
|
407
409
|
function getSecurityLogDir() {
|
|
408
|
-
|
|
410
|
+
// MAMA_SECURITY_LOG_DIR redirects ALL security telemetry (events, incidents,
|
|
411
|
+
// denylist artifacts). Test suites MUST set this (tests/setup.ts does) so
|
|
412
|
+
// fixture events never pollute the live operator telemetry.
|
|
413
|
+
return process.env.MAMA_SECURITY_LOG_DIR || (0, node_path_1.join)((0, node_os_1.homedir)(), '.mama', 'logs');
|
|
409
414
|
}
|
|
410
415
|
function getSecurityLogPath() {
|
|
411
416
|
return (0, node_path_1.join)(getSecurityLogDir(), 'security-events.jsonl');
|
|
@@ -613,6 +618,33 @@ function setSecurityAlertSender(sender) {
|
|
|
613
618
|
logger.info('Security alert sender registered');
|
|
614
619
|
}
|
|
615
620
|
}
|
|
621
|
+
function hasSecurityAlertSender() {
|
|
622
|
+
return alertSender !== null;
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Deliver an alert through the registered sender WITHOUT the incident pipeline.
|
|
626
|
+
*
|
|
627
|
+
* recordSecurityEvent() preserves evidence, writes denylist candidates, and
|
|
628
|
+
* runs RDAP attribution - correct for real client events, but self-generated
|
|
629
|
+
* alerts (system audit findings) must not fabricate incident/denylist/WAF
|
|
630
|
+
* artifacts for a pseudo client. This path only appends the event to the
|
|
631
|
+
* security log (durable record) and AWAITS delivery so the caller can retry:
|
|
632
|
+
* it throws when no sender is registered or when the sender fails.
|
|
633
|
+
*/
|
|
634
|
+
async function dispatchSecurityAlertDirect(event) {
|
|
635
|
+
const normalized = {
|
|
636
|
+
...event,
|
|
637
|
+
timestamp: event.timestamp || new Date().toISOString(),
|
|
638
|
+
};
|
|
639
|
+
logger.warn(`[SECURITY] ${normalized.message}`, normalized);
|
|
640
|
+
trackBackgroundTask(appendSecurityLog(normalized).catch((error) => {
|
|
641
|
+
logger.error('Failed to append security event log', error);
|
|
642
|
+
}));
|
|
643
|
+
if (!alertSender) {
|
|
644
|
+
throw new Error('No security alert sender registered (MAMA_SECURITY_ALERT_CHANNELS unset?)');
|
|
645
|
+
}
|
|
646
|
+
await alertSender(normalized);
|
|
647
|
+
}
|
|
616
648
|
function resetSecurityMonitorForTests() {
|
|
617
649
|
banMap.clear();
|
|
618
650
|
alertSender = null;
|
|
@@ -630,14 +662,12 @@ async function flushSecurityMonitor() {
|
|
|
630
662
|
await Promise.allSettled([...pendingTasks]);
|
|
631
663
|
}
|
|
632
664
|
function formatSecurityAlert(event) {
|
|
633
|
-
const
|
|
634
|
-
const
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
`
|
|
638
|
-
|
|
639
|
-
`client: ${event.clientAddress || event.remoteAddress || 'unknown'}`,
|
|
640
|
-
];
|
|
665
|
+
const client = event.clientAddress || event.remoteAddress;
|
|
666
|
+
const lines = [`🚨 [Security] ${event.message}`, `type: ${event.type}`];
|
|
667
|
+
lines.push(`severity: ${event.severity}`);
|
|
668
|
+
if (client) {
|
|
669
|
+
lines.push(`client: ${client}`);
|
|
670
|
+
}
|
|
641
671
|
if (event.path) {
|
|
642
672
|
lines.push(`path: ${event.path}`);
|
|
643
673
|
}
|
|
@@ -650,11 +680,18 @@ function formatSecurityAlert(event) {
|
|
|
650
680
|
if (event.details && Object.keys(event.details).length > 0) {
|
|
651
681
|
lines.push(`details: ${JSON.stringify(event.details)}`);
|
|
652
682
|
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
683
|
+
// Incident artifacts exist only for client-attributed events that went
|
|
684
|
+
// through the evidence pipeline; self-generated alerts (system audit) have
|
|
685
|
+
// no client and must not point the owner at files that were never written.
|
|
686
|
+
if (client) {
|
|
687
|
+
const incidentId = getIncidentId(event);
|
|
688
|
+
const incidentDir = (0, node_path_1.join)(getIncidentLogDir(), incidentId);
|
|
689
|
+
lines.push(`evidence: ${(0, node_path_1.join)(incidentDir, 'incident.json')}`);
|
|
690
|
+
lines.push(`abuse_draft: ${(0, node_path_1.join)(incidentDir, 'abuse-report.md')}`);
|
|
691
|
+
lines.push(`denylist: ${getDenylistJsonPath()}`);
|
|
692
|
+
lines.push(`cloudflare_csv: ${getCloudflareCustomListCsvPath()}`);
|
|
693
|
+
lines.push(`cloudflare_waf: ${getCloudflareWafExpressionPath()}`);
|
|
694
|
+
}
|
|
658
695
|
return lines.join('\n');
|
|
659
696
|
}
|
|
660
697
|
function recordSecurityEvent(event) {
|