hmem-mcp 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,546 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * hmem — Humanlike Memory MCP Server.
4
+ *
5
+ * Provides persistent, hierarchical memory for AI agents via MCP.
6
+ * SQLite-backed, 5-level lazy loading, role-based access control.
7
+ *
8
+ * Environment variables:
9
+ * HMEM_PROJECT_DIR — Root directory where .hmem files are stored (required)
10
+ * HMEM_AGENT_ID — Agent identifier (optional; defaults to memory.hmem)
11
+ * HMEM_AGENT_ROLE — Role: worker | al | pl | ceo (default: worker)
12
+ * HMEM_AUDIT_STATE_PATH — Path to audit_state.json (default: {PROJECT_DIR}/audit_state.json)
13
+ *
14
+ * Legacy fallbacks (Das Althing):
15
+ * COUNCIL_PROJECT_DIR, COUNCIL_AGENT_ID, COUNCIL_AGENT_ROLE
16
+ */
17
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
18
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
19
+ import { z } from "zod";
20
+ import fs from "node:fs";
21
+ import path from "node:path";
22
+ import { searchMemory } from "./memory-search.js";
23
+ import { openAgentMemory, openCompanyMemory, resolveHmemPath, HmemStore } from "./hmem-store.js";
24
+ import { loadHmemConfig, formatPrefixList } from "./hmem-config.js";
25
+ // ---- Environment ----
26
+ // HMEM_* vars are the canonical names; COUNCIL_* kept for backwards compatibility
27
+ const PROJECT_DIR = process.env.HMEM_PROJECT_DIR || process.env.COUNCIL_PROJECT_DIR || "";
28
+ if (!PROJECT_DIR) {
29
+ console.error("FATAL: HMEM_PROJECT_DIR not set");
30
+ process.exit(1);
31
+ }
32
+ // Empty string → resolveHmemPath uses memory.hmem (no agent name required)
33
+ let AGENT_ID = process.env.HMEM_AGENT_ID || process.env.COUNCIL_AGENT_ID || "";
34
+ let DEPTH = parseInt(process.env.HMEM_DEPTH || process.env.COUNCIL_DEPTH || "0", 10);
35
+ let ROLE = process.env.HMEM_AGENT_ROLE || process.env.COUNCIL_AGENT_ROLE || "worker";
36
+ // Optional: PID-based identity override (used by Das Althing orchestrator)
37
+ const ppid = process.ppid;
38
+ const ctxFile = path.join(PROJECT_DIR, "orchestrator", ".mcp_contexts", `${ppid}.json`);
39
+ try {
40
+ if (fs.existsSync(ctxFile)) {
41
+ const ctx = JSON.parse(fs.readFileSync(ctxFile, "utf-8"));
42
+ AGENT_ID = ctx.agent_id || AGENT_ID;
43
+ DEPTH = ctx.depth ?? DEPTH;
44
+ ROLE = ctx.role || ROLE;
45
+ }
46
+ }
47
+ catch {
48
+ // Fallback to env vars — context file is optional
49
+ }
50
+ function log(msg) {
51
+ console.error(`[hmem:${AGENT_ID || "default"}] ${msg}`);
52
+ }
53
+ // Load hmem config (hmem.config.json in project dir, falls back to defaults)
54
+ const hmemConfig = loadHmemConfig(PROJECT_DIR);
55
+ log(`Config: levels=[${hmemConfig.maxCharsPerLevel.join(",")}] depth=${hmemConfig.maxDepth} tiers=${JSON.stringify(hmemConfig.recentDepthTiers)}`);
56
+ // ---- Server ----
57
+ const server = new McpServer({
58
+ name: "hmem",
59
+ version: "1.1.0",
60
+ });
61
+ // ---- Tool: search_memory ----
62
+ server.tool("search_memory", "Searches the collective memory: agent memories (lessons learned, evaluations), " +
63
+ "and optionally personalities, project documentation, and skills. " +
64
+ "Use this tool to learn from past experiences before starting a task.", {
65
+ query: z.string().min(2).describe("Search terms (e.g. 'Node.js performance error', 'frontend testing strategy')"),
66
+ scope: z
67
+ .enum(["memories", "personalities", "projects", "skills", "all"])
68
+ .optional()
69
+ .describe("Limit search scope: 'memories' = agent .hmem databases, 'personalities' = agent roles, " +
70
+ "'projects' = project docs, 'skills' = skill references, 'all' = everything (default)"),
71
+ max_results: z
72
+ .number()
73
+ .int()
74
+ .min(1)
75
+ .max(20)
76
+ .optional()
77
+ .describe("Max results (default: 10)"),
78
+ }, async ({ query, scope, max_results }) => {
79
+ log(`search_memory: query="${query}", scope=${scope || "all"}, by=${AGENT_ID}`);
80
+ const results = searchMemory(PROJECT_DIR, query, {
81
+ scope: scope || "all",
82
+ maxResults: max_results || 10,
83
+ });
84
+ if (results.length === 0) {
85
+ return {
86
+ content: [
87
+ {
88
+ type: "text",
89
+ text: `No results for "${query}" (Scope: ${scope || "all"}).\n\nTip: Try more general terms or a different scope.`,
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ const output = results
95
+ .map((r, i) => {
96
+ const header = r.agent
97
+ ? `### ${i + 1}. ${r.agent} — ${r.file} (Score: ${r.score})`
98
+ : `### ${i + 1}. ${r.file} (Score: ${r.score})`;
99
+ const excerpts = r.excerpts.map((e) => `> ${e.replace(/\n/g, "\n> ")}`).join("\n\n");
100
+ return `${header}\n${excerpts}`;
101
+ })
102
+ .join("\n\n---\n\n");
103
+ return {
104
+ content: [
105
+ {
106
+ type: "text",
107
+ text: `## Memory Search: "${query}"\n**${results.length} hits** (Scope: ${scope || "all"})\n\n${output}`,
108
+ },
109
+ ],
110
+ };
111
+ });
112
+ // ---- Humanlike Memory (.hmem) ----
113
+ const prefixList = formatPrefixList(hmemConfig.prefixes);
114
+ const prefixKeys = Object.keys(hmemConfig.prefixes);
115
+ server.tool("write_memory", "Write a new memory entry to your hierarchical long-term memory (.hmem). " +
116
+ "Use tab indentation to create depth levels:\n" +
117
+ " Level 1: No indentation — the rough summary (always visible at startup)\n" +
118
+ " Level 2: 1 tab — more detail (loaded on demand)\n" +
119
+ " Level 3: 2 tabs — even more detail\n" +
120
+ " Level 4: 3 tabs — fine-grained detail\n" +
121
+ " Level 5: 4 tabs — raw context/data\n" +
122
+ "The system auto-assigns an ID and timestamp. " +
123
+ `Use prefix to categorize: ${prefixList}.\n\n` +
124
+ "Store types:\n" +
125
+ " personal (default): Your private memory\n" +
126
+ " company: Shared knowledge base (FIRMENWISSEN) — requires AL+ role to write", {
127
+ prefix: z.string().toUpperCase().describe(`Memory category: ${prefixList}`),
128
+ content: z.string().min(3).describe("The memory content. Use tab indentation for depth levels. Example:\n" +
129
+ "Built the Council Dashboard for Althing Inc.\n" +
130
+ "\tMy role was frontend architecture with React + Vite\n" +
131
+ "\t\tShadcnUI for components, SSE for real-time updates\n" +
132
+ "\t\t\tAuth was tricky — EventSource can't send custom headers"),
133
+ links: z.array(z.string()).optional().describe("Optional: IDs of related memories, e.g. ['P0001', 'L0005']"),
134
+ store: z.enum(["personal", "company"]).default("personal").describe("Target store: 'personal' (your own memory) or 'company' (shared FIRMENWISSEN, AL+ only)"),
135
+ min_role: z.enum(["worker", "al", "pl", "ceo"]).default("worker").describe("Minimum role to see this entry (company store only). 'worker' = everyone, 'al' = AL+PL+CEO, etc."),
136
+ }, async ({ prefix, content, links, store: storeName, min_role: minRole }) => {
137
+ const templateName = AGENT_ID.replace(/_\d+$/, "");
138
+ const agentRole = (ROLE || "worker");
139
+ const isFirstTime = !AGENT_ID && !fs.existsSync(resolveHmemPath(PROJECT_DIR, ""));
140
+ // Company store: only AL+ can write
141
+ if (storeName === "company") {
142
+ const ROLE_LEVEL = { worker: 0, al: 1, pl: 2, ceo: 3 };
143
+ if ((ROLE_LEVEL[agentRole] || 0) < 1) {
144
+ return {
145
+ content: [{ type: "text", text: "ERROR: Only AL, PL, and CEO roles can write to company memory (FIRMENWISSEN)." }],
146
+ isError: true,
147
+ };
148
+ }
149
+ }
150
+ try {
151
+ const hmemStore = storeName === "company"
152
+ ? openCompanyMemory(PROJECT_DIR, hmemConfig)
153
+ : openAgentMemory(PROJECT_DIR, templateName, hmemConfig);
154
+ try {
155
+ // Warn if database is corrupted
156
+ if (hmemStore.corrupted) {
157
+ return {
158
+ content: [{ type: "text", text: "WARNING: Memory database is corrupted! A backup (.corrupt) was saved automatically.\n" +
159
+ "Writing to a corrupted database may cause further data loss.\n" +
160
+ "Recover via: git show LAST_GOOD_COMMIT:path/to/file.hmem > recovered.hmem" }],
161
+ isError: true,
162
+ };
163
+ }
164
+ const effectiveMinRole = storeName === "company" ? minRole : "worker";
165
+ const result = hmemStore.write(prefix, content, links, effectiveMinRole);
166
+ const storeLabel = storeName === "company" ? "FIRMENWISSEN" : (templateName || "memory");
167
+ log(`write_memory [${storeLabel}]: ${result.id} (prefix=${prefix}, min_role=${effectiveMinRole})`);
168
+ const hmemPath = resolveHmemPath(PROJECT_DIR, templateName);
169
+ const firstTimeNote = isFirstTime
170
+ ? `\nMemory store created: ${hmemPath}\nTo use a custom name, set HMEM_AGENT_ID in your .mcp.json.`
171
+ : "";
172
+ return {
173
+ content: [{
174
+ type: "text",
175
+ text: `Memory saved: ${result.id} (${result.timestamp.substring(0, 19)})\n` +
176
+ `Store: ${storeLabel} | Category: ${prefix}` +
177
+ (storeName === "company" ? ` | Clearance: ${effectiveMinRole}+` : "") +
178
+ firstTimeNote,
179
+ }],
180
+ };
181
+ }
182
+ finally {
183
+ hmemStore.close();
184
+ }
185
+ }
186
+ catch (e) {
187
+ return {
188
+ content: [{ type: "text", text: `ERROR: ${e}` }],
189
+ isError: true,
190
+ };
191
+ }
192
+ });
193
+ server.tool("read_memory", "Read from your hierarchical long-term memory (.hmem). " +
194
+ "At startup, you received all Level 1 entries (rough summaries). " +
195
+ "Use this tool to drill deeper into specific memories.\n\n" +
196
+ "Query modes:\n" +
197
+ "- By ID: read_memory({ id: 'P0001' }) → L1 + direct L2 children (one level at a time)\n" +
198
+ "- By node ID: read_memory({ id: 'P0001.2' }) → that node's content + its direct children\n" +
199
+ "- By prefix: read_memory({ prefix: 'L' }) → All Lessons Learned (Level 1)\n" +
200
+ "- By time: read_memory({ after: '2026-02-15', before: '2026-02-17' })\n" +
201
+ "- Search: read_memory({ search: 'SSE' }) → Full-text search across all levels\n\n" +
202
+ "Lazy loading: ID queries always return the node + its DIRECT children only.\n" +
203
+ "To go deeper, call read_memory(id=child_id). depth parameter is ignored for ID queries.\n\n" +
204
+ "Store types:\n" +
205
+ " personal (default): Your private memory\n" +
206
+ " company: Shared knowledge base (FIRMENWISSEN) — filtered by your role clearance", {
207
+ id: z.string().optional().describe("Specific memory ID, e.g. 'P0001' or 'L0023'"),
208
+ depth: z.number().min(1).max(3).optional().describe("How deep to read (1-3). Default: 2 when reading by ID, 1 for listings. L4/L5 accessible via direct node ID only."),
209
+ prefix: z.string().optional().describe(`Filter by category: ${prefixKeys.join(", ")}`),
210
+ after: z.string().optional().describe("Only entries after this date (ISO format, e.g. '2026-02-15')"),
211
+ before: z.string().optional().describe("Only entries before this date (ISO format)"),
212
+ search: z.string().optional().describe("Full-text search across all memory levels"),
213
+ limit: z.number().optional().describe("Max results (default: 50)"),
214
+ store: z.enum(["personal", "company"]).default("personal").describe("Source store: 'personal' (your own memory) or 'company' (shared FIRMENWISSEN)"),
215
+ curator: z.boolean().optional().describe("Set true to show full metadata (access counts, roles, dates). For curators only."),
216
+ }, async ({ id, depth, prefix, after, before, search, limit: maxResults, store: storeName }) => {
217
+ if (AGENT_ID === "UNKNOWN") {
218
+ return {
219
+ content: [{ type: "text", text: "ERROR: Agent-ID unknown. read_memory is only available for spawned agents." }],
220
+ isError: true,
221
+ };
222
+ }
223
+ const templateName = AGENT_ID.replace(/_\d+$/, "");
224
+ const agentRole = (ROLE || "worker");
225
+ try {
226
+ const hmemStore = storeName === "company"
227
+ ? openCompanyMemory(PROJECT_DIR, hmemConfig)
228
+ : openAgentMemory(PROJECT_DIR, templateName, hmemConfig);
229
+ try {
230
+ // Warn if database is corrupted (but still allow reads)
231
+ const corruptionWarning = hmemStore.corrupted
232
+ ? "⚠ WARNING: Memory database is corrupted! Reads may be incomplete. A backup (.corrupt) was saved.\n\n"
233
+ : "";
234
+ // Default depth: 2 for single-ID lookup, 1 for listings
235
+ const effectiveDepth = depth || (id ? 2 : 1);
236
+ const entries = hmemStore.read({
237
+ id, depth: effectiveDepth, prefix, after, before, search,
238
+ limit: maxResults || 50,
239
+ agentRole: storeName === "company" ? agentRole : undefined,
240
+ });
241
+ if (entries.length === 0) {
242
+ const hint = id ? `No memory with ID "${id}".` :
243
+ search ? `No memories matching "${search}".` :
244
+ "No memories found for this query.";
245
+ return {
246
+ content: [{ type: "text", text: hint }],
247
+ };
248
+ }
249
+ // Format output — tree-aware
250
+ const lines = [];
251
+ for (const e of entries) {
252
+ const isNode = e.id.includes(".");
253
+ if (isNode) {
254
+ const depth = (e.id.match(/\./g) || []).length + 1;
255
+ lines.push(`[${e.id}] L${depth}: ${e.level_1}`);
256
+ }
257
+ else {
258
+ const date = e.created_at.substring(0, 10);
259
+ const accessed = e.access_count > 0 ? ` (${e.access_count}x accessed)` : "";
260
+ const roleTag = e.min_role !== "worker" ? ` [${e.min_role}+]` : "";
261
+ lines.push(`[${e.id}] ${date}${roleTag}${accessed}`);
262
+ lines.push(` L1: ${e.level_1}`);
263
+ }
264
+ // Children (populated for ID-based reads)
265
+ if (e.children && e.children.length > 0) {
266
+ lines.push(` ${e.children.length} ${e.children.length === 1 ? "child" : "children"}:`);
267
+ for (const child of e.children) {
268
+ const childDepth = (child.id.match(/\./g) || []).length + 1;
269
+ const hint = (child.child_count ?? 0) > 0
270
+ ? ` (${child.child_count} ${child.child_count === 1 ? "child" : "children"} — use id="${child.id}" to expand)`
271
+ : "";
272
+ lines.push(` [${child.id}] L${childDepth}: ${child.content}${hint}`);
273
+ }
274
+ }
275
+ if (e.links && e.links.length > 0)
276
+ lines.push(` Links: ${e.links.join(", ")}`);
277
+ lines.push("");
278
+ }
279
+ const stats = hmemStore.stats();
280
+ const storeLabel = storeName === "company" ? "FIRMENWISSEN" : templateName;
281
+ const header = `## Memory: ${storeLabel} (${stats.total} total entries)\n` +
282
+ `Query: ${id ? `id=${id}` : ""}${prefix ? `prefix=${prefix}` : ""}${search ? `search="${search}"` : ""}${after ? ` after=${after}` : ""}${before ? ` before=${before}` : ""} | Depth: ${effectiveDepth} | Results: ${entries.length}\n`;
283
+ log(`read_memory [${storeLabel}]: ${entries.length} results (depth=${effectiveDepth}, role=${agentRole})`);
284
+ return {
285
+ content: [{
286
+ type: "text",
287
+ text: corruptionWarning + header + "\n" + lines.join("\n"),
288
+ }],
289
+ };
290
+ }
291
+ finally {
292
+ hmemStore.close();
293
+ }
294
+ }
295
+ catch (e) {
296
+ return {
297
+ content: [{ type: "text", text: `ERROR: ${e}` }],
298
+ isError: true,
299
+ };
300
+ }
301
+ });
302
+ // ---- Curator Tools (ceo role only) ----
303
+ const AUDIT_STATE_FILE = process.env.HMEM_AUDIT_STATE_PATH
304
+ || path.join(PROJECT_DIR, "audit_state.json");
305
+ function loadAuditState() {
306
+ try {
307
+ if (fs.existsSync(AUDIT_STATE_FILE)) {
308
+ return JSON.parse(fs.readFileSync(AUDIT_STATE_FILE, "utf-8"));
309
+ }
310
+ }
311
+ catch { /* ignore */ }
312
+ return {};
313
+ }
314
+ function saveAuditState(state) {
315
+ const dir = path.dirname(AUDIT_STATE_FILE);
316
+ if (!fs.existsSync(dir))
317
+ fs.mkdirSync(dir, { recursive: true });
318
+ const tmp = AUDIT_STATE_FILE + ".tmp";
319
+ fs.writeFileSync(tmp, JSON.stringify(state, null, 2), "utf-8");
320
+ fs.renameSync(tmp, AUDIT_STATE_FILE);
321
+ }
322
+ function isCurator() {
323
+ return ROLE === "ceo";
324
+ }
325
+ server.tool("get_audit_queue", "CURATOR ONLY (ceo role). Returns agents whose .hmem has changed since last audit. " +
326
+ "Use this at the start of each curation run to get the list of agents to process. " +
327
+ "Each agent should be audited in a separate spawn to keep context bounded.", {}, async () => {
328
+ if (!isCurator()) {
329
+ return {
330
+ content: [{ type: "text", text: "ERROR: get_audit_queue is only available to the ceo/curator role." }],
331
+ isError: true,
332
+ };
333
+ }
334
+ const auditState = loadAuditState();
335
+ // Scan for .hmem files in PROJECT_DIR and subdirectories (1 level deep)
336
+ const queue = [];
337
+ // Check common agent directory patterns
338
+ for (const subdir of ["Agents", "Assistenten", "agents", "."]) {
339
+ const dir = path.join(PROJECT_DIR, subdir);
340
+ if (!fs.existsSync(dir))
341
+ continue;
342
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
343
+ if (!entry.isDirectory())
344
+ continue;
345
+ const name = entry.name;
346
+ const hmemPath = path.join(dir, name, `${name}.hmem`);
347
+ if (!fs.existsSync(hmemPath))
348
+ continue;
349
+ const stat = fs.statSync(hmemPath);
350
+ const modified = stat.mtime.toISOString();
351
+ const lastAudit = auditState[name] || null;
352
+ if (!lastAudit || new Date(modified) > new Date(lastAudit)) {
353
+ queue.push({ name, hmemPath, modified, lastAudit });
354
+ }
355
+ }
356
+ }
357
+ // Also check for standalone memory.hmem in PROJECT_DIR
358
+ const defaultHmem = path.join(PROJECT_DIR, "memory.hmem");
359
+ if (fs.existsSync(defaultHmem)) {
360
+ const stat = fs.statSync(defaultHmem);
361
+ const modified = stat.mtime.toISOString();
362
+ const lastAudit = auditState["default"] || null;
363
+ if (!lastAudit || new Date(modified) > new Date(lastAudit)) {
364
+ queue.push({ name: "default", hmemPath: defaultHmem, modified, lastAudit });
365
+ }
366
+ }
367
+ if (queue.length === 0) {
368
+ return {
369
+ content: [{ type: "text", text: "Audit queue is empty — all agent memories are up to date." }],
370
+ };
371
+ }
372
+ const lines = queue.map(a => `- **${a.name}**: modified ${a.modified.substring(0, 16)}` +
373
+ (a.lastAudit ? ` | last audited ${a.lastAudit.substring(0, 16)}` : " | never audited"));
374
+ return {
375
+ content: [{
376
+ type: "text",
377
+ text: `## Audit Queue (${queue.length} agents to check)\n\n${lines.join("\n")}\n\n` +
378
+ `Process one agent per spawn: terminate after each to keep context bounded.`,
379
+ }],
380
+ };
381
+ });
382
+ server.tool("read_agent_memory", "CURATOR ONLY (ceo role). Read the full memory of any agent (for audit purposes). " +
383
+ "Returns all entries at the specified depth. Use depth=3 for a thorough audit.", {
384
+ agent_name: z.string().describe("Template name of the agent, e.g. 'THOR', 'SIGURD'"),
385
+ depth: z.number().int().min(1).max(5).optional().describe("Depth to read (1-5, default: 3)"),
386
+ }, async ({ agent_name, depth }) => {
387
+ if (!isCurator()) {
388
+ return {
389
+ content: [{ type: "text", text: "ERROR: read_agent_memory is only available to the ceo/curator role." }],
390
+ isError: true,
391
+ };
392
+ }
393
+ const hmemPath = resolveHmemPath(PROJECT_DIR, agent_name);
394
+ if (!fs.existsSync(hmemPath)) {
395
+ return {
396
+ content: [{ type: "text", text: `No .hmem found for agent "${agent_name}" (expected: ${hmemPath}).` }],
397
+ };
398
+ }
399
+ const store = new HmemStore(hmemPath, hmemConfig);
400
+ try {
401
+ const entries = store.read({ depth: depth || 3, limit: 500 });
402
+ const stats = store.stats();
403
+ if (entries.length === 0) {
404
+ return { content: [{ type: "text", text: `Agent "${agent_name}" has no memory entries.` }] };
405
+ }
406
+ const lines = [`## Memory: ${agent_name} (${stats.total} entries, depth=${depth || 3})\n`];
407
+ for (const e of entries) {
408
+ const date = e.created_at.substring(0, 10);
409
+ const role = e.min_role !== "worker" ? ` [${e.min_role}+]` : "";
410
+ const access = e.access_count > 0 ? ` (${e.access_count}x)` : "";
411
+ lines.push(`[${e.id}] ${date}${role}${access}`);
412
+ lines.push(` L1: ${e.level_1}`);
413
+ if (e.level_2)
414
+ lines.push(` L2: ${e.level_2}`);
415
+ if (e.level_3)
416
+ lines.push(` L3: ${e.level_3}`);
417
+ if (e.level_4)
418
+ lines.push(` L4: ${e.level_4}`);
419
+ if (e.level_5)
420
+ lines.push(` L5: ${e.level_5}`);
421
+ if (e.links?.length)
422
+ lines.push(` Links: ${e.links.join(", ")}`);
423
+ lines.push("");
424
+ }
425
+ log(`read_agent_memory [CURATOR]: ${agent_name} depth=${depth || 3} → ${entries.length} entries`);
426
+ return { content: [{ type: "text", text: lines.join("\n") }] };
427
+ }
428
+ finally {
429
+ store.close();
430
+ }
431
+ });
432
+ server.tool("fix_agent_memory", "CURATOR ONLY (ceo role). Correct a specific entry in any agent's memory. " +
433
+ "Use to fix wrong content, re-categorize (wrong prefix cannot be changed — delete + re-add), " +
434
+ "or adjust min_role clearance.", {
435
+ agent_name: z.string().describe("Template name of the agent, e.g. 'THOR'"),
436
+ entry_id: z.string().describe("Entry ID to fix, e.g. 'L0003'"),
437
+ level_1: z.string().optional().describe("Corrected Level 1 summary"),
438
+ level_2: z.string().optional().describe("Corrected Level 2 detail (null to clear)"),
439
+ level_3: z.string().optional().describe("Corrected Level 3 detail (null to clear)"),
440
+ min_role: z.enum(["worker", "al", "pl", "ceo"]).optional().describe("Update access clearance"),
441
+ }, async ({ agent_name, entry_id, level_1, level_2, level_3, min_role }) => {
442
+ if (!isCurator()) {
443
+ return {
444
+ content: [{ type: "text", text: "ERROR: fix_agent_memory is only available to the ceo/curator role." }],
445
+ isError: true,
446
+ };
447
+ }
448
+ const hmemPath = resolveHmemPath(PROJECT_DIR, agent_name);
449
+ if (!fs.existsSync(hmemPath)) {
450
+ return {
451
+ content: [{ type: "text", text: `No .hmem found for agent "${agent_name}".` }],
452
+ isError: true,
453
+ };
454
+ }
455
+ const store = new HmemStore(hmemPath, hmemConfig);
456
+ try {
457
+ const fields = {};
458
+ if (level_1 !== undefined)
459
+ fields.level_1 = level_1;
460
+ if (level_2 !== undefined)
461
+ fields.level_2 = level_2;
462
+ if (level_3 !== undefined)
463
+ fields.level_3 = level_3;
464
+ if (min_role !== undefined)
465
+ fields.min_role = min_role;
466
+ const ok = store.update(entry_id, fields);
467
+ log(`fix_agent_memory [CURATOR]: ${agent_name} ${entry_id} → ${ok ? "updated" : "not found"}`);
468
+ return {
469
+ content: [{
470
+ type: "text",
471
+ text: ok
472
+ ? `Fixed: ${agent_name}/${entry_id} (fields: ${Object.keys(fields).join(", ")})`
473
+ : `ERROR: Entry "${entry_id}" not found in ${agent_name}'s memory.`,
474
+ }],
475
+ isError: !ok,
476
+ };
477
+ }
478
+ finally {
479
+ store.close();
480
+ }
481
+ });
482
+ server.tool("delete_agent_memory", "CURATOR ONLY (ceo role). Delete an entry from any agent's memory. " +
483
+ "Use sparingly — only for exact duplicates or entries that are factually wrong and cannot be fixed.", {
484
+ agent_name: z.string().describe("Template name of the agent, e.g. 'THOR'"),
485
+ entry_id: z.string().describe("Entry ID to delete, e.g. 'E0007'"),
486
+ }, async ({ agent_name, entry_id }) => {
487
+ if (!isCurator()) {
488
+ return {
489
+ content: [{ type: "text", text: "ERROR: delete_agent_memory is only available to the ceo/curator role." }],
490
+ isError: true,
491
+ };
492
+ }
493
+ const hmemPath = resolveHmemPath(PROJECT_DIR, agent_name);
494
+ if (!fs.existsSync(hmemPath)) {
495
+ return {
496
+ content: [{ type: "text", text: `No .hmem found for agent "${agent_name}".` }],
497
+ isError: true,
498
+ };
499
+ }
500
+ const store = new HmemStore(hmemPath, hmemConfig);
501
+ try {
502
+ const ok = store.delete(entry_id);
503
+ log(`delete_agent_memory [CURATOR]: ${agent_name} ${entry_id} → ${ok ? "deleted" : "not found"}`);
504
+ return {
505
+ content: [{
506
+ type: "text",
507
+ text: ok
508
+ ? `Deleted: ${agent_name}/${entry_id}`
509
+ : `ERROR: Entry "${entry_id}" not found in ${agent_name}'s memory.`,
510
+ }],
511
+ isError: !ok,
512
+ };
513
+ }
514
+ finally {
515
+ store.close();
516
+ }
517
+ });
518
+ server.tool("mark_audited", "CURATOR ONLY (ceo role). Mark an agent as audited (updates timestamp in audit_state.json). " +
519
+ "Call this after finishing each agent in the audit queue.", {
520
+ agent_name: z.string().describe("Template name of the agent that was audited, e.g. 'THOR'"),
521
+ }, async ({ agent_name }) => {
522
+ if (!isCurator()) {
523
+ return {
524
+ content: [{ type: "text", text: "ERROR: mark_audited is only available to the ceo/curator role." }],
525
+ isError: true,
526
+ };
527
+ }
528
+ const state = loadAuditState();
529
+ state[agent_name] = new Date().toISOString();
530
+ saveAuditState(state);
531
+ log(`mark_audited [CURATOR]: ${agent_name}`);
532
+ return {
533
+ content: [{ type: "text", text: `Marked as audited: ${agent_name} (${state[agent_name].substring(0, 16)})` }],
534
+ };
535
+ });
536
+ // ---- Start ----
537
+ async function main() {
538
+ const transport = new StdioServerTransport();
539
+ await server.connect(transport);
540
+ log("MCP Server running on stdio");
541
+ }
542
+ main().catch((error) => {
543
+ console.error("Fatal error in MCP Server:", error);
544
+ process.exit(1);
545
+ });
546
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type SearchScope = "memories" | "personalities" | "projects" | "skills" | "all";
2
+ export interface SearchResult {
3
+ file: string;
4
+ agent?: string;
5
+ scope: SearchScope;
6
+ score: number;
7
+ excerpts: string[];
8
+ }
9
+ export interface SearchOptions {
10
+ scope?: SearchScope;
11
+ maxResults?: number;
12
+ contextLines?: number;
13
+ }
14
+ /**
15
+ * Searches the knowledge base across agent memories (.hmem), personalities,
16
+ * project docs, and skills.
17
+ */
18
+ export declare function searchMemory(projectDir: string, query: string, options?: SearchOptions): SearchResult[];