@jungjaehoon/mama-os 0.21.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.
Files changed (151) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +12 -4
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +76 -11
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  7. package/dist/agent/code-act/host-bridge.js +74 -0
  8. package/dist/agent/code-act/host-bridge.js.map +1 -1
  9. package/dist/agent/codex-mcp-process.d.ts +1 -0
  10. package/dist/agent/codex-mcp-process.d.ts.map +1 -1
  11. package/dist/agent/codex-mcp-process.js +3 -2
  12. package/dist/agent/codex-mcp-process.js.map +1 -1
  13. package/dist/agent/gateway-tool-executor.d.ts +16 -1
  14. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  15. package/dist/agent/gateway-tool-executor.js +148 -2
  16. package/dist/agent/gateway-tool-executor.js.map +1 -1
  17. package/dist/agent/gateway-tools.md +6 -1
  18. package/dist/agent/model-runner.d.ts +8 -0
  19. package/dist/agent/model-runner.d.ts.map +1 -1
  20. package/dist/agent/model-runner.js.map +1 -1
  21. package/dist/agent/persistent-cli-adapter.d.ts +6 -0
  22. package/dist/agent/persistent-cli-adapter.d.ts.map +1 -1
  23. package/dist/agent/persistent-cli-adapter.js +21 -10
  24. package/dist/agent/persistent-cli-adapter.js.map +1 -1
  25. package/dist/agent/tool-registry.d.ts.map +1 -1
  26. package/dist/agent/tool-registry.js +32 -1
  27. package/dist/agent/tool-registry.js.map +1 -1
  28. package/dist/agent/types.d.ts +26 -2
  29. package/dist/agent/types.d.ts.map +1 -1
  30. package/dist/agent/types.js.map +1 -1
  31. package/dist/api/index.d.ts +1 -1
  32. package/dist/api/index.d.ts.map +1 -1
  33. package/dist/api/index.js +15 -13
  34. package/dist/api/index.js.map +1 -1
  35. package/dist/api/operator-handler.d.ts +2 -0
  36. package/dist/api/operator-handler.d.ts.map +1 -1
  37. package/dist/api/operator-handler.js +23 -5
  38. package/dist/api/operator-handler.js.map +1 -1
  39. package/dist/api/operator-summary.d.ts +3 -0
  40. package/dist/api/operator-summary.d.ts.map +1 -0
  41. package/dist/api/operator-summary.js +72 -0
  42. package/dist/api/operator-summary.js.map +1 -0
  43. package/dist/api/operator-tasks-handler.d.ts +7 -0
  44. package/dist/api/operator-tasks-handler.d.ts.map +1 -0
  45. package/dist/api/operator-tasks-handler.js +165 -0
  46. package/dist/api/operator-tasks-handler.js.map +1 -0
  47. package/dist/cli/commands/start.d.ts.map +1 -1
  48. package/dist/cli/commands/start.js +62 -12
  49. package/dist/cli/commands/start.js.map +1 -1
  50. package/dist/cli/runtime/agent-loop-init.d.ts +2 -1
  51. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  52. package/dist/cli/runtime/agent-loop-init.js +16 -8
  53. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  54. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  55. package/dist/cli/runtime/api-routes-init.js +196 -158
  56. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  57. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  58. package/dist/cli/runtime/gateway-init.js +3 -1
  59. package/dist/cli/runtime/gateway-init.js.map +1 -1
  60. package/dist/cli/runtime/gateway-wiring.d.ts.map +1 -1
  61. package/dist/cli/runtime/gateway-wiring.js +6 -0
  62. package/dist/cli/runtime/gateway-wiring.js.map +1 -1
  63. package/dist/cli/runtime/memory-agent-init.d.ts +2 -1
  64. package/dist/cli/runtime/memory-agent-init.d.ts.map +1 -1
  65. package/dist/cli/runtime/memory-agent-init.js +15 -3
  66. package/dist/cli/runtime/memory-agent-init.js.map +1 -1
  67. package/dist/connectors/framework/types.d.ts +8 -0
  68. package/dist/connectors/framework/types.d.ts.map +1 -1
  69. package/dist/connectors/slack/index.d.ts.map +1 -1
  70. package/dist/connectors/slack/index.js +3 -1
  71. package/dist/connectors/slack/index.js.map +1 -1
  72. package/dist/connectors/trello/index.d.ts.map +1 -1
  73. package/dist/connectors/trello/index.js +6 -2
  74. package/dist/connectors/trello/index.js.map +1 -1
  75. package/dist/db/agent-store.d.ts +5 -0
  76. package/dist/db/agent-store.d.ts.map +1 -1
  77. package/dist/db/agent-store.js +6 -3
  78. package/dist/db/agent-store.js.map +1 -1
  79. package/dist/db/migrations/agent-activity-tool-name.d.ts +8 -0
  80. package/dist/db/migrations/agent-activity-tool-name.d.ts.map +1 -0
  81. package/dist/db/migrations/agent-activity-tool-name.js +24 -0
  82. package/dist/db/migrations/agent-activity-tool-name.js.map +1 -0
  83. package/dist/envelope/run-guard.d.ts +10 -0
  84. package/dist/envelope/run-guard.d.ts.map +1 -0
  85. package/dist/envelope/run-guard.js +19 -0
  86. package/dist/envelope/run-guard.js.map +1 -0
  87. package/dist/gateways/telegram.d.ts +1 -0
  88. package/dist/gateways/telegram.d.ts.map +1 -1
  89. package/dist/gateways/telegram.js +25 -1
  90. package/dist/gateways/telegram.js.map +1 -1
  91. package/dist/memory/history-extractor.d.ts.map +1 -1
  92. package/dist/memory/history-extractor.js +10 -5
  93. package/dist/memory/history-extractor.js.map +1 -1
  94. package/dist/multi-agent/agent-event-bus.d.ts +4 -0
  95. package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
  96. package/dist/multi-agent/agent-event-bus.js.map +1 -1
  97. package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
  98. package/dist/multi-agent/dashboard-agent-persona.js +18 -5
  99. package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
  100. package/dist/multi-agent/runtime-process.d.ts +4 -2
  101. package/dist/multi-agent/runtime-process.d.ts.map +1 -1
  102. package/dist/multi-agent/runtime-process.js +7 -4
  103. package/dist/multi-agent/runtime-process.js.map +1 -1
  104. package/dist/observability/code-audit.d.ts +83 -0
  105. package/dist/observability/code-audit.d.ts.map +1 -0
  106. package/dist/observability/code-audit.js +334 -0
  107. package/dist/observability/code-audit.js.map +1 -0
  108. package/dist/operator/action-verifier.d.ts +50 -0
  109. package/dist/operator/action-verifier.d.ts.map +1 -0
  110. package/dist/operator/action-verifier.js +68 -0
  111. package/dist/operator/action-verifier.js.map +1 -0
  112. package/dist/operator/board-reconcile.d.ts +62 -0
  113. package/dist/operator/board-reconcile.d.ts.map +1 -0
  114. package/dist/operator/board-reconcile.js +160 -0
  115. package/dist/operator/board-reconcile.js.map +1 -0
  116. package/dist/operator/board-slot-instructions.d.ts +8 -0
  117. package/dist/operator/board-slot-instructions.d.ts.map +1 -1
  118. package/dist/operator/board-slot-instructions.js +25 -1
  119. package/dist/operator/board-slot-instructions.js.map +1 -1
  120. package/dist/operator/operator-trigger-loop.d.ts +15 -2
  121. package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
  122. package/dist/operator/operator-trigger-loop.js +40 -1
  123. package/dist/operator/operator-trigger-loop.js.map +1 -1
  124. package/dist/operator/report-scheduler.d.ts +23 -0
  125. package/dist/operator/report-scheduler.d.ts.map +1 -1
  126. package/dist/operator/report-scheduler.js +56 -8
  127. package/dist/operator/report-scheduler.js.map +1 -1
  128. package/dist/operator/situation-report.d.ts +5 -1
  129. package/dist/operator/situation-report.d.ts.map +1 -1
  130. package/dist/operator/situation-report.js +14 -3
  131. package/dist/operator/situation-report.js.map +1 -1
  132. package/dist/operator/task-ledger.d.ts +96 -0
  133. package/dist/operator/task-ledger.d.ts.map +1 -0
  134. package/dist/operator/task-ledger.js +277 -0
  135. package/dist/operator/task-ledger.js.map +1 -0
  136. package/dist/security/security-monitor.d.ts +12 -0
  137. package/dist/security/security-monitor.d.ts.map +1 -1
  138. package/dist/security/security-monitor.js +51 -14
  139. package/dist/security/security-monitor.js.map +1 -1
  140. package/dist/utils/untrusted-content.d.ts +18 -0
  141. package/dist/utils/untrusted-content.d.ts.map +1 -0
  142. package/dist/utils/untrusted-content.js +34 -0
  143. package/dist/utils/untrusted-content.js.map +1 -0
  144. package/package.json +1 -1
  145. package/public/ui/assets/index-CKOJQYXA.css +1 -0
  146. package/public/ui/assets/index-OSgiwL24.js +62 -0
  147. package/public/ui/index.html +3 -2
  148. package/public/ui/theme-init.js +20 -0
  149. package/public/viewer/viewer.html +12 -28
  150. package/public/ui/assets/index-BDsaQNGd.js +0 -62
  151. package/public/ui/assets/index-C4URnm_X.css +0 -1
@@ -36,11 +36,14 @@ class CodexRuntimeProcess extends events_1.EventEmitter {
36
36
  this.wrapper = new codex_mcp_process_js_1.CodexMCPProcess(wrapperOptions);
37
37
  }
38
38
  // ─── IModelRunner.prompt() ─────────────────────────────────────────────
39
- async prompt(content, callbacks, _options) {
40
- return this.sendMessage(content, callbacks);
39
+ async prompt(content, callbacks, options) {
40
+ // Narrowed on purpose: only systemPrompt is per-call plumbing (Task 3).
41
+ // model/resumeSession stay inert on codex - activating them is a separate,
42
+ // deliberate change (they alter thread lifecycle, codex-mcp-process.ts:261-266).
43
+ return this.sendMessage(content, callbacks, options?.systemPrompt !== undefined ? { systemPrompt: options.systemPrompt } : undefined);
41
44
  }
42
45
  // ─── AgentRuntimeProcess.sendMessage() ─────────────────────────────────
43
- async sendMessage(content, callbacks) {
46
+ async sendMessage(content, callbacks, options) {
44
47
  if (this.state === 'dead') {
45
48
  throw new Error('Process is dead');
46
49
  }
@@ -58,7 +61,7 @@ class CodexRuntimeProcess extends events_1.EventEmitter {
58
61
  onError: callbacks.onError,
59
62
  }
60
63
  : undefined;
61
- const result = await this.wrapper.prompt(content, codexCallbacks);
64
+ const result = await this.wrapper.prompt(content, codexCallbacks, options?.systemPrompt !== undefined ? { systemPrompt: options.systemPrompt } : undefined);
62
65
  const normalized = {
63
66
  response: result.response,
64
67
  usage: {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-process.js","sourceRoot":"","sources":["../../src/multi-agent/runtime-process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-process.js","sourceRoot":"","sources":["../../src/multi-agent/runtime-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Deterministic code-based system audit.
3
+ *
4
+ * Lands the 2026-04-22 owner decision (mama_conductor_audit_code_based_read_only):
5
+ * the hourly audit is fact collection and recording, executed by code - no LLM
6
+ * invocation, no auto-fix, no filesystem access beyond explicit read-only checks.
7
+ * The previous LLM audit loop once exfiltrated a credential when its report
8
+ * path failed; this module removes that class of failure structurally.
9
+ *
10
+ * Every check here is read-only and local. MAJOR findings are alerted through
11
+ * a caller-provided callback subject to the 24h dedup contract the checklist
12
+ * established (alert only NEW / ESCALATED / older-than-24h re-alerts). MINOR
13
+ * and INFO findings are recorded in the state file, never alerted.
14
+ */
15
+ export type AuditSeverity = 'INFO' | 'MINOR' | 'MAJOR';
16
+ export interface AuditFinding {
17
+ id: string;
18
+ severity: AuditSeverity;
19
+ summary: string;
20
+ detail?: string;
21
+ }
22
+ interface StoredFinding {
23
+ id: string;
24
+ severity: AuditSeverity;
25
+ summary?: string;
26
+ detail?: string;
27
+ first_seen: string;
28
+ last_seen: string;
29
+ last_alerted_at: string | null;
30
+ }
31
+ export interface AuditStateFile {
32
+ audit_date: string;
33
+ audit_timestamp: string;
34
+ checklist_version: string;
35
+ findings: StoredFinding[];
36
+ resolved_since_last_run: string[];
37
+ pass_items: string[];
38
+ }
39
+ export interface CodeAuditReport {
40
+ mode: 'code';
41
+ timestamp: string;
42
+ duration_ms: number;
43
+ findings: AuditFinding[];
44
+ pass_items: string[];
45
+ alerted: string[];
46
+ alert_delivery_failures: string[];
47
+ resolved_since_last_run: string[];
48
+ }
49
+ export type AuditAlertReason = 'new' | 'escalated' | 're-alert';
50
+ export interface CodeAuditConfigView {
51
+ telegram?: {
52
+ enabled?: boolean;
53
+ allowed_chats?: string[];
54
+ };
55
+ multi_agent?: {
56
+ enabled?: boolean;
57
+ agents?: Record<string, {
58
+ persona_file?: string;
59
+ enabled?: boolean;
60
+ }>;
61
+ };
62
+ }
63
+ export interface CodeAuditOptions {
64
+ /** Base dir for ~/.mama files. Tests inject a temp dir. */
65
+ mamaDir?: string;
66
+ /** Findings/dedup state file. Default: <mamaDir>/state/audit-findings.json */
67
+ stateFilePath?: string;
68
+ /** Daemon log whose size is checked. Default: <mamaDir>/logs/daemon.log */
69
+ daemonLogPath?: string;
70
+ /** Local health endpoint. Default: http://127.0.0.1:3847/health. '' disables. */
71
+ healthUrl?: string;
72
+ /** Loaded runtime config (already-validated view). */
73
+ config?: CodeAuditConfigView;
74
+ /** True when a security alert sender is registered (checklist hygiene item). */
75
+ securityAlertConfigured?: boolean;
76
+ /** MAJOR-only alert callback, invoked per the 24h dedup contract. */
77
+ alert?: (finding: AuditFinding, reason: AuditAlertReason) => void | Promise<void>;
78
+ /** Injectable clock for tests. */
79
+ now?: () => Date;
80
+ }
81
+ export declare function runCodeAudit(options?: CodeAuditOptions): Promise<CodeAuditReport>;
82
+ export {};
83
+ //# sourceMappingURL=code-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-audit.d.ts","sourceRoot":"","sources":["../../src/observability/code-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,uBAAuB,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3D,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACvE,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,gFAAgF;IAChF,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,qEAAqE;IACrE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAgKD,wBAAsB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuK3F"}
@@ -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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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * OperatorActionVerifier (M8 Phase 2) - verifies that a reconcile run actually
3
+ * performed its obligated action. Ports Kagemusha's ContractActionVerifier
4
+ * snapshot-diff mechanism, strengthened per plan review: signals must be BOUND
5
+ * to the run, not to unrelated board activity.
6
+ *
7
+ * Verified iff, after the run:
8
+ * (a) a NEW gateway tool-call trace row exists (rowid past the snapshot)
9
+ * whose normalized tool name is one of the obligated tools, or
10
+ * (b) a NEW no-update note exists with EXACTLY this run's scope.
11
+ * Slot/ledger hash deltas are recorded as evidence detail only -- another
12
+ * writer may have moved them (the board-writer queue makes in-queue runs
13
+ * non-concurrent, which closes the remaining race).
14
+ *
15
+ * Observe, never block: the caller records the outcome and emits a notice;
16
+ * an unverified run is a loud signal, not a rejection.
17
+ */
18
+ export declare const OBLIGATED_TOOLS: readonly ["report_publish", "task_create", "task_update", "contract_no_update"];
19
+ export interface VerifierDeps {
20
+ /** Current report slots (id -> html). */
21
+ getSlots: () => Array<{
22
+ slotId: string;
23
+ html: string;
24
+ }>;
25
+ /** Stable hash of the task ledger payload. */
26
+ getLedgerHash: () => string;
27
+ /** Max no-update note id for a scope (0 when none). */
28
+ getScopedNoteMaxId: (scope: string) => number;
29
+ /**
30
+ * Count of gateway tool-call trace rows past a rowid whose normalized tool
31
+ * name is in OBLIGATED_TOOLS (bound to the reconcile agent).
32
+ */
33
+ countObligatedTraceRowsSince: (maxId: number) => number;
34
+ /** Max gateway trace rowid right now (0 when none). */
35
+ getTraceMaxId: () => number;
36
+ }
37
+ export interface ActionSnapshot {
38
+ slotHashes: Record<string, string>;
39
+ ledgerHash: string;
40
+ scopedNoteMaxId: number;
41
+ traceMaxId: number;
42
+ }
43
+ export interface VerifyResult {
44
+ verified: boolean;
45
+ /** Human-readable evidence lines for the activity record. */
46
+ effects: string[];
47
+ }
48
+ export declare function captureSnapshot(deps: VerifierDeps, scope: string): ActionSnapshot;
49
+ export declare function verifyAfterRun(deps: VerifierDeps, before: ActionSnapshot, scope: string): VerifyResult;
50
+ //# sourceMappingURL=action-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-verifier.d.ts","sourceRoot":"","sources":["../../src/operator/action-verifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,eAAO,MAAM,eAAe,iFAKlB,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,QAAQ,EAAE,MAAM,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,8CAA8C;IAC9C,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,uDAAuD;IACvD,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C;;;OAGG;IACH,4BAA4B,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,uDAAuD;IACvD,aAAa,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAWjF;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CA+Bd"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * OperatorActionVerifier (M8 Phase 2) - verifies that a reconcile run actually
4
+ * performed its obligated action. Ports Kagemusha's ContractActionVerifier
5
+ * snapshot-diff mechanism, strengthened per plan review: signals must be BOUND
6
+ * to the run, not to unrelated board activity.
7
+ *
8
+ * Verified iff, after the run:
9
+ * (a) a NEW gateway tool-call trace row exists (rowid past the snapshot)
10
+ * whose normalized tool name is one of the obligated tools, or
11
+ * (b) a NEW no-update note exists with EXACTLY this run's scope.
12
+ * Slot/ledger hash deltas are recorded as evidence detail only -- another
13
+ * writer may have moved them (the board-writer queue makes in-queue runs
14
+ * non-concurrent, which closes the remaining race).
15
+ *
16
+ * Observe, never block: the caller records the outcome and emits a notice;
17
+ * an unverified run is a loud signal, not a rejection.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.OBLIGATED_TOOLS = void 0;
21
+ exports.captureSnapshot = captureSnapshot;
22
+ exports.verifyAfterRun = verifyAfterRun;
23
+ const node_crypto_1 = require("node:crypto");
24
+ exports.OBLIGATED_TOOLS = [
25
+ 'report_publish',
26
+ 'task_create',
27
+ 'task_update',
28
+ 'contract_no_update',
29
+ ];
30
+ function captureSnapshot(deps, scope) {
31
+ const slotHashes = {};
32
+ for (const slot of deps.getSlots()) {
33
+ slotHashes[slot.slotId] = (0, node_crypto_1.createHash)('sha256').update(slot.html).digest('hex');
34
+ }
35
+ return {
36
+ slotHashes,
37
+ ledgerHash: deps.getLedgerHash(),
38
+ scopedNoteMaxId: deps.getScopedNoteMaxId(scope),
39
+ traceMaxId: deps.getTraceMaxId(),
40
+ };
41
+ }
42
+ function verifyAfterRun(deps, before, scope) {
43
+ const effects = [];
44
+ let verified = false;
45
+ // (a) run-bound signal: obligated gateway tool traces past the snapshot.
46
+ const obligatedTraces = deps.countObligatedTraceRowsSince(before.traceMaxId);
47
+ if (obligatedTraces > 0) {
48
+ verified = true;
49
+ effects.push(`obligated tool traces: ${obligatedTraces}`);
50
+ }
51
+ // (b) run-bound signal: a new no-update note with EXACTLY this scope.
52
+ const noteMaxNow = deps.getScopedNoteMaxId(scope);
53
+ if (noteMaxNow > before.scopedNoteMaxId) {
54
+ verified = true;
55
+ effects.push(`no-update note recorded (scope=${scope})`);
56
+ }
57
+ // Evidence detail only (NOT sufficient alone -- see module doc).
58
+ const after = captureSnapshot(deps, scope);
59
+ const changedSlots = Object.keys({ ...before.slotHashes, ...after.slotHashes }).filter((id) => before.slotHashes[id] !== after.slotHashes[id]);
60
+ if (changedSlots.length > 0) {
61
+ effects.push(`slots changed: ${changedSlots.join(', ')}`);
62
+ }
63
+ if (after.ledgerHash !== before.ledgerHash) {
64
+ effects.push('task ledger changed');
65
+ }
66
+ return { verified, effects };
67
+ }
68
+ //# sourceMappingURL=action-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-verifier.js","sourceRoot":"","sources":["../../src/operator/action-verifier.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;AAwCH,0CAWC;AAED,wCAmCC;AAtFD,6CAAyC;AAE5B,QAAA,eAAe,GAAG;IAC7B,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,oBAAoB;CACZ,CAAC;AA+BX,SAAgB,eAAe,CAAC,IAAkB,EAAE,KAAa;IAC/D,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjF,CAAC;IACD,OAAO;QACL,UAAU;QACV,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;QAChC,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAC/C,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAC5B,IAAkB,EAClB,MAAsB,EACtB,KAAa;IAEb,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,yEAAyE;IACzE,MAAM,eAAe,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7E,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,0BAA0B,eAAe,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,sEAAsE;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACxC,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,kCAAkC,KAAK,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,iEAAiE;IACjE,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CACpF,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CACvD,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,kBAAkB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}