@jungjaehoon/mama-os 0.22.0 → 0.23.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 (128) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +3 -1
  3. package/dist/agent/agent-loop.d.ts +0 -3
  4. package/dist/agent/agent-loop.d.ts.map +1 -1
  5. package/dist/agent/agent-loop.js +49 -34
  6. package/dist/agent/agent-loop.js.map +1 -1
  7. package/dist/agent/gateway-tool-executor.d.ts +18 -0
  8. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  9. package/dist/agent/gateway-tool-executor.js +185 -6
  10. package/dist/agent/gateway-tool-executor.js.map +1 -1
  11. package/dist/agent/gateway-tools.md +10 -5
  12. package/dist/agent/role-manager.d.ts +22 -1
  13. package/dist/agent/role-manager.d.ts.map +1 -1
  14. package/dist/agent/role-manager.js +39 -2
  15. package/dist/agent/role-manager.js.map +1 -1
  16. package/dist/agent/tool-registry.d.ts.map +1 -1
  17. package/dist/agent/tool-registry.js +35 -5
  18. package/dist/agent/tool-registry.js.map +1 -1
  19. package/dist/agent/types.d.ts +9 -1
  20. package/dist/agent/types.d.ts.map +1 -1
  21. package/dist/agent/types.js.map +1 -1
  22. package/dist/api/graph-api.d.ts.map +1 -1
  23. package/dist/api/graph-api.js +43 -33
  24. package/dist/api/graph-api.js.map +1 -1
  25. package/dist/api/operator-tasks-handler.d.ts.map +1 -1
  26. package/dist/api/operator-tasks-handler.js +6 -2
  27. package/dist/api/operator-tasks-handler.js.map +1 -1
  28. package/dist/cli/commands/start.d.ts.map +1 -1
  29. package/dist/cli/commands/start.js +185 -2
  30. package/dist/cli/commands/start.js.map +1 -1
  31. package/dist/cli/config/config-manager.d.ts +0 -5
  32. package/dist/cli/config/config-manager.d.ts.map +1 -1
  33. package/dist/cli/config/config-manager.js +57 -2
  34. package/dist/cli/config/config-manager.js.map +1 -1
  35. package/dist/cli/config/types.d.ts.map +1 -1
  36. package/dist/cli/config/types.js +35 -0
  37. package/dist/cli/config/types.js.map +1 -1
  38. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  39. package/dist/cli/runtime/agent-loop-init.js +96 -51
  40. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  41. package/dist/cli/runtime/api-routes-init.d.ts +3 -0
  42. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  43. package/dist/cli/runtime/api-routes-init.js +293 -196
  44. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  45. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  46. package/dist/cli/runtime/gateway-init.js +5 -0
  47. package/dist/cli/runtime/gateway-init.js.map +1 -1
  48. package/dist/cli/runtime/gateway-wiring.d.ts.map +1 -1
  49. package/dist/cli/runtime/gateway-wiring.js +6 -0
  50. package/dist/cli/runtime/gateway-wiring.js.map +1 -1
  51. package/dist/envelope/reactive-config.d.ts.map +1 -1
  52. package/dist/envelope/reactive-config.js +26 -1
  53. package/dist/envelope/reactive-config.js.map +1 -1
  54. package/dist/gateways/message-router.d.ts +18 -1
  55. package/dist/gateways/message-router.d.ts.map +1 -1
  56. package/dist/gateways/message-router.js +155 -22
  57. package/dist/gateways/message-router.js.map +1 -1
  58. package/dist/gateways/telegram.d.ts +1 -0
  59. package/dist/gateways/telegram.d.ts.map +1 -1
  60. package/dist/gateways/telegram.js +38 -1
  61. package/dist/gateways/telegram.js.map +1 -1
  62. package/dist/gateways/types.d.ts +3 -0
  63. package/dist/gateways/types.d.ts.map +1 -1
  64. package/dist/memory/history-extractor.d.ts +0 -24
  65. package/dist/memory/history-extractor.d.ts.map +1 -1
  66. package/dist/memory/history-extractor.js +0 -127
  67. package/dist/memory/history-extractor.js.map +1 -1
  68. package/dist/memory/save-candidate-extractor.d.ts +3 -0
  69. package/dist/memory/save-candidate-extractor.d.ts.map +1 -1
  70. package/dist/memory/save-candidate-extractor.js +12 -1
  71. package/dist/memory/save-candidate-extractor.js.map +1 -1
  72. package/dist/memory/secret-filter.d.ts +22 -0
  73. package/dist/memory/secret-filter.d.ts.map +1 -0
  74. package/dist/memory/secret-filter.js +77 -0
  75. package/dist/memory/secret-filter.js.map +1 -0
  76. package/dist/observability/code-audit.d.ts +87 -0
  77. package/dist/observability/code-audit.d.ts.map +1 -0
  78. package/dist/observability/code-audit.js +403 -0
  79. package/dist/observability/code-audit.js.map +1 -0
  80. package/dist/operator/briefs.d.ts +26 -0
  81. package/dist/operator/briefs.d.ts.map +1 -0
  82. package/dist/operator/briefs.js +128 -0
  83. package/dist/operator/briefs.js.map +1 -0
  84. package/dist/operator/operator-trigger-loop.d.ts +24 -0
  85. package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
  86. package/dist/operator/operator-trigger-loop.js +71 -12
  87. package/dist/operator/operator-trigger-loop.js.map +1 -1
  88. package/dist/operator/report-carry.d.ts +29 -0
  89. package/dist/operator/report-carry.d.ts.map +1 -0
  90. package/dist/operator/report-carry.js +81 -0
  91. package/dist/operator/report-carry.js.map +1 -0
  92. package/dist/operator/shadow-capture.d.ts +20 -0
  93. package/dist/operator/shadow-capture.d.ts.map +1 -0
  94. package/dist/operator/shadow-capture.js +34 -0
  95. package/dist/operator/shadow-capture.js.map +1 -0
  96. package/dist/operator/situation-report.d.ts +6 -0
  97. package/dist/operator/situation-report.d.ts.map +1 -1
  98. package/dist/operator/situation-report.js +15 -1
  99. package/dist/operator/situation-report.js.map +1 -1
  100. package/dist/operator/task-ledger.d.ts +90 -2
  101. package/dist/operator/task-ledger.d.ts.map +1 -1
  102. package/dist/operator/task-ledger.js +359 -23
  103. package/dist/operator/task-ledger.js.map +1 -1
  104. package/dist/operator/worker-run.d.ts +59 -0
  105. package/dist/operator/worker-run.d.ts.map +1 -0
  106. package/dist/operator/worker-run.js +64 -0
  107. package/dist/operator/worker-run.js.map +1 -0
  108. package/dist/operator/workorder-consumer.d.ts +118 -0
  109. package/dist/operator/workorder-consumer.d.ts.map +1 -0
  110. package/dist/operator/workorder-consumer.js +248 -0
  111. package/dist/operator/workorder-consumer.js.map +1 -0
  112. package/dist/operator/workorder-hooks.d.ts +30 -0
  113. package/dist/operator/workorder-hooks.d.ts.map +1 -0
  114. package/dist/operator/workorder-hooks.js +70 -0
  115. package/dist/operator/workorder-hooks.js.map +1 -0
  116. package/dist/operator/workorder-publishers.d.ts +68 -0
  117. package/dist/operator/workorder-publishers.d.ts.map +1 -0
  118. package/dist/operator/workorder-publishers.js +150 -0
  119. package/dist/operator/workorder-publishers.js.map +1 -0
  120. package/dist/security/security-monitor.d.ts +19 -0
  121. package/dist/security/security-monitor.d.ts.map +1 -1
  122. package/dist/security/security-monitor.js +68 -14
  123. package/dist/security/security-monitor.js.map +1 -1
  124. package/dist/utils/untrusted-content.d.ts +31 -0
  125. package/dist/utils/untrusted-content.d.ts.map +1 -0
  126. package/dist/utils/untrusted-content.js +77 -0
  127. package/dist/utils/untrusted-content.js.map +1 -0
  128. package/package.json +2 -2
@@ -0,0 +1,403 @@
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
+ // owner_console must ONLY resolve via trust-conditional escalation (locked
263
+ // allowlist + private DM). A static sourceMapping grants the owner surface
264
+ // to unverified inbound - that is the open-console failure class.
265
+ const sourceMapping = options.config?.roles?.sourceMapping ?? {};
266
+ const staticOwnerSources = Object.entries(sourceMapping)
267
+ .filter(([, roleName]) => roleName === 'owner_console')
268
+ .map(([source]) => source);
269
+ if (staticOwnerSources.length > 0) {
270
+ findings.push({
271
+ id: 'owner-console-static-mapping',
272
+ severity: 'MAJOR',
273
+ summary: `owner_console statically mapped to source(s): ${staticOwnerSources.join(', ')}`,
274
+ detail: 'Remove the mapping; owner_console is granted per-message by RoleManager trust checks only.',
275
+ });
276
+ }
277
+ else {
278
+ passes.push('owner_console has no static source mapping');
279
+ }
280
+ // The trust escalation silently no-ops when the owner_console definition is
281
+ // missing from the RESOLVED roles config (an older persisted roles section
282
+ // that skipped the additive merge). Locked allowlist + missing definition =
283
+ // the flagship console is dead without a sound (review B1 class).
284
+ if (Array.isArray(telegram?.allowed_chats) &&
285
+ telegram.allowed_chats.length > 0 &&
286
+ options.config?.roles?.definitions &&
287
+ !('owner_console' in options.config.roles.definitions)) {
288
+ findings.push({
289
+ id: 'owner-console-definition-missing',
290
+ severity: 'MAJOR',
291
+ summary: 'telegram allowlist is locked but roles.definitions lacks owner_console',
292
+ detail: 'Trust escalation falls through to chat_bot silently. The config loader should merge default definitions; check for a stale roles section.',
293
+ });
294
+ }
295
+ // Stage-2 (plan B7): a CUSTOMIZED persisted owner_console definition freezes
296
+ // its allowedTools at save time - new default tools (workorder_request/
297
+ // status class) silently never reach it. Observe-only: warn the owner, no
298
+ // forced merge (observability over restriction).
299
+ const persistedOwnerConsole = options.config?.roles?.definitions?.owner_console;
300
+ if (persistedOwnerConsole?.allowedTools && !persistedOwnerConsole.allowedTools.includes('*')) {
301
+ // Wildcard allowlists cover everything - flagging them for "missing"
302
+ // default tools would be a false positive (PR bot round).
303
+ const { DEFAULT_ROLES } = await import('../cli/config/types.js');
304
+ const defaultTools = DEFAULT_ROLES.definitions?.owner_console?.allowedTools ?? [];
305
+ const missing = defaultTools.filter((tool) => !persistedOwnerConsole.allowedTools?.includes(tool));
306
+ if (missing.length > 0) {
307
+ findings.push({
308
+ id: 'owner-console-stale-allowlist',
309
+ severity: 'MAJOR',
310
+ summary: `persisted owner_console.allowedTools lacks current default tool(s): ${missing.join(', ')}`,
311
+ detail: 'A customized owner_console definition does not receive new default tools. ' +
312
+ 'Add them to the persisted definition (or delete it to re-adopt defaults).',
313
+ });
314
+ }
315
+ else {
316
+ passes.push('owner_console allowlist covers all current default tools');
317
+ }
318
+ }
319
+ // Telegram group/supergroup ids are negative. An allowlisted group does not
320
+ // escalate (RoleManager requires chatType private) but signals a config
321
+ // misunderstanding worth flagging.
322
+ const groupChats = (telegram?.allowed_chats ?? []).filter((id) => String(id).startsWith('-'));
323
+ if (groupChats.length > 0) {
324
+ findings.push({
325
+ id: 'telegram-allowlist-group-chat',
326
+ severity: 'MINOR',
327
+ summary: `telegram.allowed_chats contains group chat id(s): ${groupChats.join(', ')}`,
328
+ detail: 'Group members are third parties; groups never receive owner_console, but review whether the allowlist entry is intended.',
329
+ });
330
+ }
331
+ // Dedup + alert per the 24h contract
332
+ const previous = await readState(stateFilePath);
333
+ const previousById = new Map(previous.map((f) => [f.id, f]));
334
+ const alerted = [];
335
+ const alertDeliveryFailures = [];
336
+ const stored = [];
337
+ for (const finding of findings) {
338
+ const prior = previousById.get(finding.id);
339
+ const firstSeen = prior?.first_seen || nowIso;
340
+ let lastAlertedAt = prior?.last_alerted_at ?? null;
341
+ if (finding.severity === 'MAJOR') {
342
+ let reason = null;
343
+ if (!prior) {
344
+ reason = 'new';
345
+ }
346
+ else if (SEVERITY_RANK[finding.severity] > SEVERITY_RANK[prior.severity]) {
347
+ // Reachable across checklist_version upgrades: when a check's grading
348
+ // changes (e.g. a MINOR becomes MAJOR in a new release), the stored
349
+ // lower severity escalates and must alert immediately instead of
350
+ // waiting out a 24h window stamped under the old grading.
351
+ reason = 'escalated';
352
+ }
353
+ else if (!prior.last_alerted_at ||
354
+ now.getTime() - Date.parse(prior.last_alerted_at) >= REALERT_INTERVAL_MS) {
355
+ reason = 're-alert';
356
+ }
357
+ if (reason && options.alert) {
358
+ try {
359
+ await options.alert(finding, reason);
360
+ alerted.push(finding.id);
361
+ lastAlertedAt = nowIso;
362
+ }
363
+ catch (error) {
364
+ // Fail loud in the report; the finding stays un-alerted so the next
365
+ // run retries instead of silently swallowing delivery failure.
366
+ alertDeliveryFailures.push(`${finding.id}: ${error instanceof Error ? error.message : String(error)}`);
367
+ }
368
+ }
369
+ }
370
+ stored.push({
371
+ id: finding.id,
372
+ severity: finding.severity,
373
+ summary: finding.summary,
374
+ detail: finding.detail,
375
+ first_seen: firstSeen,
376
+ last_seen: nowIso,
377
+ last_alerted_at: lastAlertedAt,
378
+ });
379
+ }
380
+ const currentIds = new Set(findings.map((f) => f.id));
381
+ const resolved = previous.filter((f) => !currentIds.has(f.id)).map((f) => f.id);
382
+ const state = {
383
+ audit_date: nowIso.slice(0, 10),
384
+ audit_timestamp: nowIso,
385
+ checklist_version: CHECKLIST_VERSION,
386
+ findings: stored,
387
+ resolved_since_last_run: resolved,
388
+ pass_items: passes,
389
+ };
390
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(stateFilePath), { recursive: true });
391
+ await (0, promises_1.writeFile)(stateFilePath, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
392
+ return {
393
+ mode: 'code',
394
+ timestamp: nowIso,
395
+ duration_ms: Date.now() - startedAt,
396
+ findings,
397
+ pass_items: passes,
398
+ alerted,
399
+ alert_delivery_failures: alertDeliveryFailures,
400
+ resolved_since_last_run: resolved,
401
+ };
402
+ }
403
+ //# 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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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Brief files - the procedural knowledge of the Stage-2 workers.
3
+ *
4
+ * Location: ~/.mama/briefs/brief-<kind>.md - a DEDICATED directory, not
5
+ * ~/.mama/skills/ (plan A5/F5: skills-root flat files leak into the chat
6
+ * system prompt, the skills UI, and PromptEnhancer keyword injection; the
7
+ * consumer reads by path, so loader invisibility is the desired property).
8
+ *
9
+ * Missing brief -> the caller fails the workorder loudly (never a silent
10
+ * skip). Seeding of packaged defaults is ensureBriefs() (S2-T5).
11
+ */
12
+ import { type WorkOrderKind } from './task-ledger.js';
13
+ export declare function briefsDir(homeDir?: string): string;
14
+ export declare function briefPath(kind: WorkOrderKind, homeDir?: string): string;
15
+ /** null = missing (caller fails the workorder); read errors propagate loudly. */
16
+ export declare function loadBrief(kind: WorkOrderKind, homeDir?: string): string | null;
17
+ export declare function buildDefaultBrief(kind: WorkOrderKind): string;
18
+ /**
19
+ * Boot seeding (plan B2/C6/E9): write packaged defaults for MISSING briefs
20
+ * only - user/agent edits always win (existsSync guard). DELIBERATE deviation
21
+ * from the persona managed-marker pattern: briefs have NO auto-upgrade; after
22
+ * seeding they are agent/user-owned (Stage-3 self-improvement substrate), so
23
+ * packaged default changes do not propagate to existing installs.
24
+ */
25
+ export declare function ensureBriefs(homeDir?: string): WorkOrderKind[];
26
+ //# sourceMappingURL=briefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefs.d.ts","sourceRoot":"","sources":["../../src/operator/briefs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMvE,wBAAgB,SAAS,CAAC,OAAO,GAAE,MAAkB,GAAG,MAAM,CAE7D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,MAAkB,GAAG,MAAM,CAElF;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,MAAkB,GAAG,MAAM,GAAG,IAAI,CAIzF;AA6DD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAS7D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAkB,GAAG,aAAa,EAAE,CAgBzE"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ /**
3
+ * Brief files - the procedural knowledge of the Stage-2 workers.
4
+ *
5
+ * Location: ~/.mama/briefs/brief-<kind>.md - a DEDICATED directory, not
6
+ * ~/.mama/skills/ (plan A5/F5: skills-root flat files leak into the chat
7
+ * system prompt, the skills UI, and PromptEnhancer keyword injection; the
8
+ * consumer reads by path, so loader invisibility is the desired property).
9
+ *
10
+ * Missing brief -> the caller fails the workorder loudly (never a silent
11
+ * skip). Seeding of packaged defaults is ensureBriefs() (S2-T5).
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.briefsDir = briefsDir;
15
+ exports.briefPath = briefPath;
16
+ exports.loadBrief = loadBrief;
17
+ exports.buildDefaultBrief = buildDefaultBrief;
18
+ exports.ensureBriefs = ensureBriefs;
19
+ const node_fs_1 = require("node:fs");
20
+ const node_os_1 = require("node:os");
21
+ const node_path_1 = require("node:path");
22
+ const task_ledger_js_1 = require("./task-ledger.js");
23
+ // Persona constants are generic procedure text (no personal content); they
24
+ // relocate INTO this file when the persona modules are deleted at cutover.
25
+ const dashboard_agent_persona_js_1 = require("../multi-agent/dashboard-agent-persona.js");
26
+ const wiki_agent_persona_js_1 = require("../multi-agent/wiki-agent-persona.js");
27
+ function briefsDir(homeDir = (0, node_os_1.homedir)()) {
28
+ return (0, node_path_1.join)(homeDir, '.mama', 'briefs');
29
+ }
30
+ function briefPath(kind, homeDir = (0, node_os_1.homedir)()) {
31
+ return (0, node_path_1.join)(briefsDir(homeDir), `brief-${kind}.md`);
32
+ }
33
+ /** null = missing (caller fails the workorder); read errors propagate loudly. */
34
+ function loadBrief(kind, homeDir = (0, node_os_1.homedir)()) {
35
+ const path = briefPath(kind, homeDir);
36
+ if (!(0, node_fs_1.existsSync)(path))
37
+ return null;
38
+ return (0, node_fs_1.readFileSync)(path, 'utf-8');
39
+ }
40
+ const stripManagedMarker = (persona) => persona.replace(/^<!-- MAMA managed [^\n]*-->\n*/, '');
41
+ const BOARD_WORKORDER_CONTRACT = `
42
+ ## Work order contract (Stage 2)
43
+ Your work order input is a JSON object:
44
+ - mode: "full" | "reconcile"
45
+ - force: true when the owner explicitly requested a fresh board - do NOT reply
46
+ NO_UPDATE; rebuild and publish even if nothing changed.
47
+ - channelKey + deltaLines: present in reconcile mode only.
48
+ - attempts: retry counter (informational).
49
+
50
+ mode "full" = the scheduled board rewrite. Before writing, check whether an
51
+ update is needed: agent_notices({limit: 100}) for the last board publish
52
+ boundary, then a recency check (mama_search({limit: 30}) with NO query,
53
+ compare created_at). If nothing substantive is newer and force is not set,
54
+ respond NO_UPDATE and stop. Otherwise follow "How to Write" and publish ALL
55
+ FOUR slots in ONE report_publish call.
56
+
57
+ mode "reconcile" = a single-channel delta reconcile for input.channelKey using
58
+ input.deltaLines. Apply the RECONCILE RUN rules from this brief (the mode
59
+ field replaces the "RECONCILE RUN" message sentinel): judge affected slots,
60
+ publish ONLY those, use task_create/task_update with source_channel and
61
+ source_event_id from the delta, or contract_no_update({reason, scope:
62
+ "reconcile:<channelKey>"}) when nothing is affected. Finish with exactly one
63
+ line: RECONCILED <comma-separated slots or none>.
64
+ `;
65
+ const WIKI_WORKORDER_CONTRACT = `
66
+ ## Work order contract (Stage 2)
67
+ Your work order input is a JSON object: { batchId, events, attempts }.
68
+ The events array names what triggered this compile (extraction:completed,
69
+ memory:promoted, boot, manual) - provenance only, it carries no content.
70
+ Follow the MANDATORY Workflow exactly; the novelty check decides NO_UPDATE.
71
+ `;
72
+ const PROMOTION_BRIEF = `You are curating durable business memory from recent data (PROMOTION RUN).
73
+
74
+ ## Work order contract (Stage 2)
75
+ Your work order input is a JSON object: { scheduledAt, attempts }. Use
76
+ scheduledAt as the current time reference.
77
+
78
+ ## Procedure
79
+ 1. agent_notices({limit: 100}): find your latest promotion notice (action
80
+ "promoted" or "no_update") and treat it as the boundary; default to the
81
+ last 24h when absent.
82
+ 2. kagemusha_entities({activeOnly: true}) to find the rooms active since the
83
+ boundary, then kagemusha_messages({channelId, since: <boundary ISO>}) on
84
+ the busiest 3-4 rooms.
85
+ 3. For each candidate judgment, mama_search first to find the existing topic;
86
+ reuse it so the evolution chain stays intact.
87
+ 4. Promote at most 5 durable judgments per run via mama_save: pricing/scope
88
+ agreements, standing client preferences, process rules, recurring risk
89
+ patterns. NEVER task lifecycle states, greetings, or logistics. Include
90
+ scopes (the source channel, and the project when identifiable) and
91
+ event_date.
92
+ 5. Finish with exactly PROMOTED <n> or NO_UPDATE.
93
+ `;
94
+ function buildDefaultBrief(kind) {
95
+ switch (kind) {
96
+ case 'board':
97
+ return `${stripManagedMarker(dashboard_agent_persona_js_1.DASHBOARD_AGENT_PERSONA)}\n${BOARD_WORKORDER_CONTRACT}`;
98
+ case 'wiki':
99
+ return `${stripManagedMarker(wiki_agent_persona_js_1.WIKI_AGENT_PERSONA)}\n${WIKI_WORKORDER_CONTRACT}`;
100
+ case 'memory-curation':
101
+ return PROMOTION_BRIEF;
102
+ }
103
+ }
104
+ /**
105
+ * Boot seeding (plan B2/C6/E9): write packaged defaults for MISSING briefs
106
+ * only - user/agent edits always win (existsSync guard). DELIBERATE deviation
107
+ * from the persona managed-marker pattern: briefs have NO auto-upgrade; after
108
+ * seeding they are agent/user-owned (Stage-3 self-improvement substrate), so
109
+ * packaged default changes do not propagate to existing installs.
110
+ */
111
+ function ensureBriefs(homeDir = (0, node_os_1.homedir)()) {
112
+ (0, node_fs_1.mkdirSync)(briefsDir(homeDir), { recursive: true });
113
+ const seeded = [];
114
+ for (const kind of task_ledger_js_1.WORKORDER_KINDS) {
115
+ const path = briefPath(kind, homeDir);
116
+ if (!(0, node_fs_1.existsSync)(path)) {
117
+ // tmp+rename (PR bot round): a partial direct write would read as a
118
+ // user-owned brief on the next boot and never be repaired.
119
+ const tmpPath = `${path}.tmp`;
120
+ (0, node_fs_1.writeFileSync)(tmpPath, buildDefaultBrief(kind), 'utf-8');
121
+ (0, node_fs_1.renameSync)(tmpPath, path);
122
+ seeded.push(kind);
123
+ console.log(`[stage2] seeded default brief: ${path}`);
124
+ }
125
+ }
126
+ return seeded;
127
+ }
128
+ //# sourceMappingURL=briefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"briefs.js","sourceRoot":"","sources":["../../src/operator/briefs.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAWH,8BAEC;AAED,8BAEC;AAGD,8BAIC;AA6DD,8CASC;AASD,oCAgBC;AArHD,qCAAyF;AACzF,qCAAkC;AAClC,yCAAiC;AACjC,qDAAuE;AACvE,2EAA2E;AAC3E,2EAA2E;AAC3E,0FAAoF;AACpF,gFAA0E;AAE1E,SAAgB,SAAS,CAAC,UAAkB,IAAA,iBAAO,GAAE;IACnD,OAAO,IAAA,gBAAI,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,SAAS,CAAC,IAAmB,EAAE,UAAkB,IAAA,iBAAO,GAAE;IACxE,OAAO,IAAA,gBAAI,EAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,IAAI,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,iFAAiF;AACjF,SAAgB,SAAS,CAAC,IAAmB,EAAE,UAAkB,IAAA,iBAAO,GAAE;IACxE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAU,EAAE,CACrD,OAAO,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;AAEzD,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBhC,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;CAM/B,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBvB,CAAC;AAEF,SAAgB,iBAAiB,CAAC,IAAmB;IACnD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,GAAG,kBAAkB,CAAC,oDAAuB,CAAC,KAAK,wBAAwB,EAAE,CAAC;QACvF,KAAK,MAAM;YACT,OAAO,GAAG,kBAAkB,CAAC,0CAAkB,CAAC,KAAK,uBAAuB,EAAE,CAAC;QACjF,KAAK,iBAAiB;YACpB,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,UAAkB,IAAA,iBAAO,GAAE;IACtD,IAAA,mBAAS,EAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,gCAAe,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACtB,oEAAoE;YACpE,2DAA2D;YAC3D,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC;YAC9B,IAAA,uBAAa,EAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,IAAA,oBAAU,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -37,6 +37,13 @@ export interface TriggerLoopConfig {
37
37
  * ms later (Kagemusha fast-flush port). Default 15000. 0 == tick immediately on nudge.
38
38
  */
39
39
  nudgeDebounceMs?: number;
40
+ /**
41
+ * Scheduled full-report suppression window (ms, default 30min): if the last
42
+ * SUCCESSFUL full report (usually an on-demand one) is younger than this,
43
+ * the scheduled fire skips and consumes its hour instead of sending a
44
+ * near-empty duplicate.
45
+ */
46
+ fullReportMinIntervalMs?: number;
40
47
  }
41
48
  export interface TriggerLoopDeps {
42
49
  delta: DeltaSource;
@@ -74,6 +81,8 @@ export interface TriggerLoopDeps {
74
81
  onChannelDelta?: (channelKey: string, lines: string[]) => void;
75
82
  /** Kagemusha dual output: FULL report also publishes the operator board slots. */
76
83
  fullReportBoardLines?: string[];
84
+ /** Context carry (plan v6 S1-T4): persist the delivered FULL report text. */
85
+ persistLastFullReport?: (deliveredAtIso: string, text: string) => void;
77
86
  config: TriggerLoopConfig;
78
87
  log: (line: string) => void;
79
88
  }
@@ -108,6 +117,21 @@ export declare class OperatorTriggerLoop {
108
117
  * uncommitted deltas simply wait for the next tick. Pure timing assist: it only changes WHEN an
109
118
  * existing tick runs, never WHAT it does.
110
119
  */
120
+ /**
121
+ * On-demand full report (plan v6 S1-T3): the owner's "give me the full
122
+ * report" intent routed to the SAME machinery as the scheduled leg - same
123
+ * reporter, same anchor semantics, same serial guard. Host-code entry
124
+ * (gateway forwarder hook); the run itself is fire-and-forget so the chat
125
+ * turn that triggered it is never blocked (and never nests lane runs).
126
+ *
127
+ * Consume semantics: success marks the current hourKey fired, so a
128
+ * scheduled fire in the same hour does not duplicate; markSuccess advances
129
+ * the delta anchor exactly like a scheduled run.
130
+ */
131
+ startFullReport(): {
132
+ accepted: boolean;
133
+ reason?: 'busy' | 'unavailable';
134
+ };
111
135
  nudge(): void;
112
136
  /**
113
137
  * Start ticking on the configured interval. Returns a stop function.
@@ -1 +1 @@
1
- {"version":3,"file":"operator-trigger-loop.d.ts","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator-trigger-loop.d.ts","sourceRoot":"","sources":["../../src/operator/operator-trigger-loop.ts"],"names":[],"mappings":"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"}