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,596 @@
1
+ /**
2
+ * Humanlike Memory Store (.hmem)
3
+ *
4
+ * SQLite-based long-term memory for agents with true tree structure.
5
+ * L1 summaries live in the `memories` table (injected at startup).
6
+ * L2+ nodes live in `memory_nodes` — each node has its own compound ID
7
+ * (e.g., E0006.1, E0006.1.2) and is individually addressable.
8
+ *
9
+ * Two store types:
10
+ * - Personal: per-agent memory (Agents/THOR/THOR.hmem)
11
+ * - Company: shared knowledge base (FIRMENWISSEN.hmem) with role-based access
12
+ *
13
+ * ID format:
14
+ * Root entries: PREFIX + zero-padded sequence (e.g., P0001, L0023, T0042)
15
+ * Sub-nodes: root_id + "." + sibling_seq, recursively (e.g., E0006.1, E0006.1.2)
16
+ *
17
+ * Prefixes: P=Project, L=Lesson, T=Task, E=Error, D=Decision, M=Milestone, F=Favorite, S=Skill
18
+ *
19
+ * Role hierarchy: worker < al < pl < ceo
20
+ * Each entry has a min_role — agents only see entries at or below their clearance.
21
+ *
22
+ * read_memory(id) semantics:
23
+ * Always returns the node + its DIRECT children only.
24
+ * To go deeper, call read_memory(id=child_id).
25
+ * depth parameter is IGNORED for ID-based queries.
26
+ */
27
+ import Database from "better-sqlite3";
28
+ import fs from "node:fs";
29
+ import path from "node:path";
30
+ import { DEFAULT_CONFIG, resolveDepthForPosition } from "./hmem-config.js";
31
+ // Prefixes are now loaded from config — see this.cfg.prefixes
32
+ const ROLE_LEVEL = {
33
+ worker: 0, al: 1, pl: 2, ceo: 3,
34
+ };
35
+ // (limits are now instance-level via this.cfg.maxCharsPerLevel)
36
+ /** All roles that a given role may see (itself + below). */
37
+ function allowedRoles(role) {
38
+ const level = ROLE_LEVEL[role];
39
+ return Object.keys(ROLE_LEVEL).filter(r => ROLE_LEVEL[r] <= level);
40
+ }
41
+ const SCHEMA = `
42
+ CREATE TABLE IF NOT EXISTS memories (
43
+ id TEXT PRIMARY KEY,
44
+ prefix TEXT NOT NULL,
45
+ seq INTEGER NOT NULL,
46
+ created_at TEXT NOT NULL,
47
+ level_1 TEXT NOT NULL,
48
+ level_2 TEXT,
49
+ level_3 TEXT,
50
+ level_4 TEXT,
51
+ level_5 TEXT,
52
+ access_count INTEGER DEFAULT 0,
53
+ last_accessed TEXT,
54
+ links TEXT,
55
+ min_role TEXT DEFAULT 'worker'
56
+ );
57
+ CREATE INDEX IF NOT EXISTS idx_prefix ON memories(prefix);
58
+ CREATE INDEX IF NOT EXISTS idx_created ON memories(created_at);
59
+ CREATE INDEX IF NOT EXISTS idx_access ON memories(access_count);
60
+ CREATE INDEX IF NOT EXISTS idx_role ON memories(min_role);
61
+
62
+ CREATE TABLE IF NOT EXISTS memory_nodes (
63
+ id TEXT PRIMARY KEY,
64
+ parent_id TEXT NOT NULL,
65
+ root_id TEXT NOT NULL,
66
+ depth INTEGER NOT NULL,
67
+ seq INTEGER NOT NULL,
68
+ content TEXT NOT NULL,
69
+ created_at TEXT NOT NULL,
70
+ access_count INTEGER DEFAULT 0,
71
+ last_accessed TEXT
72
+ );
73
+ CREATE INDEX IF NOT EXISTS idx_nodes_parent ON memory_nodes(parent_id);
74
+ CREATE INDEX IF NOT EXISTS idx_nodes_root ON memory_nodes(root_id);
75
+
76
+ CREATE TABLE IF NOT EXISTS schema_version (
77
+ key TEXT PRIMARY KEY,
78
+ value TEXT NOT NULL
79
+ );
80
+ `;
81
+ // Migration: add min_role to existing databases that lack it
82
+ const MIGRATIONS = [
83
+ "ALTER TABLE memories ADD COLUMN min_role TEXT DEFAULT 'worker'",
84
+ ];
85
+ // ---- HmemStore class ----
86
+ export class HmemStore {
87
+ db;
88
+ dbPath;
89
+ cfg;
90
+ /** True if integrity_check found errors on open (read-only mode recommended). */
91
+ corrupted;
92
+ constructor(hmemPath, config) {
93
+ this.dbPath = hmemPath;
94
+ this.cfg = config ?? { ...DEFAULT_CONFIG };
95
+ const dir = path.dirname(hmemPath);
96
+ if (!fs.existsSync(dir)) {
97
+ fs.mkdirSync(dir, { recursive: true });
98
+ }
99
+ this.db = new Database(hmemPath);
100
+ this.db.pragma("journal_mode = WAL");
101
+ // Integrity check — detect corruption before any writes
102
+ this.corrupted = false;
103
+ try {
104
+ const result = this.db.pragma("integrity_check");
105
+ const status = result[0]?.integrity_check ?? "unknown";
106
+ if (status !== "ok") {
107
+ this.corrupted = true;
108
+ const backupPath = hmemPath + ".corrupt";
109
+ console.error(`[hmem] WARNING: Database corrupted! integrity_check: ${status}`);
110
+ if (!fs.existsSync(backupPath)) {
111
+ fs.copyFileSync(hmemPath, backupPath);
112
+ console.error(`[hmem] Backup saved to ${backupPath}`);
113
+ }
114
+ console.error(`[hmem] Attempting to continue — reads may be incomplete.`);
115
+ }
116
+ }
117
+ catch (e) {
118
+ this.corrupted = true;
119
+ console.error(`[hmem] WARNING: integrity_check failed: ${e}`);
120
+ }
121
+ this.db.exec(SCHEMA);
122
+ this.migrate();
123
+ this.migrateToTree();
124
+ }
125
+ /**
126
+ * Write a new memory entry.
127
+ * Content uses tab indentation to define the tree:
128
+ * "Project X: built a dashboard\n\tMy role was frontend\n\t\tUsed React + Vite"
129
+ * L1 (no tabs) → memories.level_1
130
+ * Each indented line → its own memory_nodes row with compound ID
131
+ * Multiple lines at the same indent depth → siblings (new capability)
132
+ */
133
+ write(prefix, content, links, minRole = "worker") {
134
+ prefix = prefix.toUpperCase();
135
+ if (!this.cfg.prefixes[prefix]) {
136
+ const valid = Object.entries(this.cfg.prefixes).map(([k, v]) => `${k}=${v}`).join(", ");
137
+ throw new Error(`Invalid prefix "${prefix}". Valid: ${valid}`);
138
+ }
139
+ // Determine root ID first so parseTree can use it directly
140
+ const seq = this.nextSeq(prefix);
141
+ const rootId = `${prefix}${String(seq).padStart(4, "0")}`;
142
+ const timestamp = new Date().toISOString();
143
+ const { level1, nodes } = this.parseTree(content, rootId);
144
+ if (!level1) {
145
+ throw new Error("Content must have at least one line (Level 1).");
146
+ }
147
+ const l1Limit = this.cfg.maxCharsPerLevel[0];
148
+ if (level1.length > l1Limit) {
149
+ throw new Error(`Level 1 exceeds ${l1Limit} character limit (${level1.length} chars). Keep L1 compact.`);
150
+ }
151
+ for (const node of nodes) {
152
+ // depth 2-5 → index 1-4
153
+ const nodeLimit = this.cfg.maxCharsPerLevel[Math.min(node.depth - 1, this.cfg.maxCharsPerLevel.length - 1)];
154
+ if (node.content.length > nodeLimit) {
155
+ throw new Error(`L${node.depth} content exceeds ${nodeLimit} character limit ` +
156
+ `(${node.content.length} chars). Split into multiple write_memory calls or use file references.`);
157
+ }
158
+ }
159
+ const insertRoot = this.db.prepare(`
160
+ INSERT INTO memories (id, prefix, seq, created_at, level_1, level_2, level_3, level_4, level_5, links, min_role)
161
+ VALUES (?, ?, ?, ?, ?, NULL, NULL, NULL, NULL, ?, ?)
162
+ `);
163
+ const insertNode = this.db.prepare(`
164
+ INSERT INTO memory_nodes (id, parent_id, root_id, depth, seq, content, created_at)
165
+ VALUES (?, ?, ?, ?, ?, ?, ?)
166
+ `);
167
+ // Run in a transaction
168
+ this.db.transaction(() => {
169
+ insertRoot.run(rootId, prefix, seq, timestamp, level1, links ? JSON.stringify(links) : null, minRole);
170
+ for (const node of nodes) {
171
+ insertNode.run(node.id, node.parent_id, rootId, node.depth, node.seq, node.content, timestamp);
172
+ }
173
+ })();
174
+ return { id: rootId, timestamp };
175
+ }
176
+ /**
177
+ * Read memories with flexible querying.
178
+ *
179
+ * For ID-based queries: always returns the node + its DIRECT children.
180
+ * depth parameter is ignored for ID queries (one level at a time).
181
+ *
182
+ * For bulk queries: returns L1 summaries (depth=1 default).
183
+ */
184
+ read(opts = {}) {
185
+ const limit = opts.limit || this.cfg.defaultReadLimit;
186
+ const roleFilter = this.buildRoleFilter(opts.agentRole);
187
+ // Single entry by ID (root or compound node)
188
+ if (opts.id) {
189
+ const isNode = opts.id.includes(".");
190
+ if (isNode) {
191
+ // Compound node ID — fetch from memory_nodes
192
+ const row = this.db.prepare("SELECT * FROM memory_nodes WHERE id = ?").get(opts.id);
193
+ if (!row)
194
+ return [];
195
+ this.bumpNodeAccess(opts.id);
196
+ const children = this.fetchChildren(opts.id);
197
+ return [this.nodeToEntry(this.rowToNode(row), children)];
198
+ }
199
+ else {
200
+ // Root ID — fetch from memories
201
+ const sql = `SELECT * FROM memories WHERE id = ?${roleFilter ? ` AND ${roleFilter}` : ""}`;
202
+ const row = this.db.prepare(sql).get(opts.id);
203
+ if (!row)
204
+ return [];
205
+ this.bumpAccess(opts.id);
206
+ const children = this.fetchChildren(opts.id);
207
+ return [this.rowToEntry(row, children)];
208
+ }
209
+ }
210
+ // Full-text search across memories + memory_nodes
211
+ if (opts.search) {
212
+ const pattern = `%${opts.search}%`;
213
+ // Search in memories level_1
214
+ const searchCondition = "(level_1 LIKE ?)";
215
+ const where = roleFilter ? `WHERE ${searchCondition} AND ${roleFilter}` : `WHERE ${searchCondition}`;
216
+ // Also search memory_nodes content
217
+ const nodeRows = this.db.prepare(`SELECT DISTINCT root_id FROM memory_nodes WHERE content LIKE ? LIMIT ?`).all(pattern, limit);
218
+ const nodeRootIds = new Set(nodeRows.map(r => r.root_id));
219
+ const memRows = this.db.prepare(`SELECT * FROM memories ${where} ORDER BY created_at DESC LIMIT ?`).all(pattern, limit);
220
+ // Merge: include any roots found in node search too
221
+ const allIds = new Set(memRows.map((r) => r.id));
222
+ const extraIds = [...nodeRootIds].filter(id => !allIds.has(id));
223
+ let extraRows = [];
224
+ if (extraIds.length > 0) {
225
+ const placeholders = extraIds.map(() => "?").join(", ");
226
+ const extraWhere = roleFilter
227
+ ? `WHERE id IN (${placeholders}) AND ${roleFilter}`
228
+ : `WHERE id IN (${placeholders})`;
229
+ extraRows = this.db.prepare(`SELECT * FROM memories ${extraWhere} ORDER BY created_at DESC`).all(...extraIds);
230
+ }
231
+ const allRows = [...memRows, ...extraRows];
232
+ for (const row of allRows)
233
+ this.bumpAccess(row.id);
234
+ return allRows.map(r => this.rowToEntry(r));
235
+ }
236
+ // Build filtered bulk query (L1 only)
237
+ const conditions = [];
238
+ const params = [];
239
+ if (roleFilter) {
240
+ conditions.push(roleFilter);
241
+ }
242
+ if (opts.prefix) {
243
+ conditions.push("prefix = ?");
244
+ params.push(opts.prefix.toUpperCase());
245
+ }
246
+ if (opts.after) {
247
+ conditions.push("created_at >= ?");
248
+ params.push(opts.after);
249
+ }
250
+ if (opts.before) {
251
+ conditions.push("created_at <= ?");
252
+ params.push(opts.before);
253
+ }
254
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
255
+ const rows = this.db.prepare(`SELECT * FROM memories ${where} ORDER BY created_at DESC LIMIT ?`).all(...params, limit);
256
+ if (opts.prefix || opts.after || opts.before) {
257
+ for (const row of rows)
258
+ this.bumpAccess(row.id);
259
+ }
260
+ // Recency gradient: inline children up to the tier-resolved depth for recent entries
261
+ // Favorites (F) are always pinned at depth 2 minimum, regardless of recency position
262
+ const tiers = opts.recentDepthTiers ?? this.cfg.recentDepthTiers;
263
+ return rows.map((r, i) => {
264
+ let depth = resolveDepthForPosition(i, tiers);
265
+ if (r.prefix === "F" && depth < 2)
266
+ depth = 2;
267
+ const children = depth >= 2 ? this.fetchChildrenDeep(r.id, 2, depth) : undefined;
268
+ return this.rowToEntry(r, children);
269
+ });
270
+ }
271
+ /**
272
+ * Get all Level 1 entries for injection at agent startup.
273
+ * Does NOT bump access_count (routine injection).
274
+ */
275
+ getLevel1All(agentRole) {
276
+ const roleFilter = this.buildRoleFilter(agentRole);
277
+ const where = roleFilter ? `WHERE ${roleFilter}` : "";
278
+ const rows = this.db.prepare(`SELECT id, created_at, level_1 FROM memories ${where} ORDER BY created_at DESC`).all();
279
+ if (rows.length === 0)
280
+ return "";
281
+ return rows.map(r => {
282
+ const date = r.created_at.substring(0, 10);
283
+ return `[${r.id}] ${date} — ${r.level_1}`;
284
+ }).join("\n");
285
+ }
286
+ /**
287
+ * Export entire memory to Markdown for git tracking.
288
+ */
289
+ exportMarkdown() {
290
+ const rows = this.db.prepare("SELECT * FROM memories ORDER BY prefix, seq").all();
291
+ if (rows.length === 0)
292
+ return "# Memory Export\n\n(empty)\n";
293
+ let md = "# Memory Export\n\n";
294
+ md += `> Auto-generated from .hmem — ${new Date().toISOString()}\n`;
295
+ md += `> ${rows.length} entries\n\n`;
296
+ let currentPrefix = "";
297
+ for (const row of rows) {
298
+ if (row.prefix !== currentPrefix) {
299
+ currentPrefix = row.prefix;
300
+ md += `---\n\n## ${this.cfg.prefixes[currentPrefix] || currentPrefix}\n\n`;
301
+ }
302
+ const date = row.created_at.substring(0, 10);
303
+ const accessed = row.access_count > 0 ? ` (accessed ${row.access_count}x)` : "";
304
+ const role = row.min_role !== "worker" ? ` [${row.min_role}+]` : "";
305
+ md += `### [${row.id}] ${date}${role}${accessed}\n`;
306
+ md += `${row.level_1}\n`;
307
+ // Include tree nodes
308
+ const nodes = this.db.prepare("SELECT * FROM memory_nodes WHERE root_id = ? ORDER BY depth, seq").all(row.id);
309
+ for (const n of nodes) {
310
+ const indent = " ".repeat(n.depth - 1);
311
+ md += `${indent}→ [${n.id}] ${n.content}\n`;
312
+ }
313
+ if (row.links) {
314
+ const links = JSON.parse(row.links);
315
+ if (links.length > 0)
316
+ md += ` Links: ${links.join(", ")}\n`;
317
+ }
318
+ md += "\n";
319
+ }
320
+ return md;
321
+ }
322
+ /**
323
+ * Get statistics about the memory store.
324
+ */
325
+ stats() {
326
+ const total = this.db.prepare("SELECT COUNT(*) as c FROM memories").get().c;
327
+ const rows = this.db.prepare("SELECT prefix, COUNT(*) as c FROM memories GROUP BY prefix").all();
328
+ const byPrefix = {};
329
+ for (const r of rows)
330
+ byPrefix[r.prefix] = r.c;
331
+ return { total, byPrefix };
332
+ }
333
+ /**
334
+ * Update specific fields of an existing root entry (curator use only).
335
+ */
336
+ update(id, fields) {
337
+ const sets = [];
338
+ const params = [];
339
+ for (const [key, val] of Object.entries(fields)) {
340
+ sets.push(`${key} = ?`);
341
+ params.push(key === "links" && Array.isArray(val) ? JSON.stringify(val) : val);
342
+ }
343
+ if (sets.length === 0)
344
+ return false;
345
+ params.push(id);
346
+ const result = this.db.prepare(`UPDATE memories SET ${sets.join(", ")} WHERE id = ?`).run(...params);
347
+ return result.changes > 0;
348
+ }
349
+ /**
350
+ * Delete an entry by ID (curator use only).
351
+ * Also deletes all associated memory_nodes.
352
+ */
353
+ delete(id) {
354
+ // Delete nodes first (no CASCADE in older SQLite)
355
+ this.db.prepare("DELETE FROM memory_nodes WHERE root_id = ?").run(id);
356
+ const result = this.db.prepare("DELETE FROM memories WHERE id = ?").run(id);
357
+ return result.changes > 0;
358
+ }
359
+ close() {
360
+ this.db.close();
361
+ }
362
+ // ---- Private helpers ----
363
+ migrate() {
364
+ for (const sql of MIGRATIONS) {
365
+ try {
366
+ this.db.exec(sql);
367
+ }
368
+ catch {
369
+ // Column already exists — ignore
370
+ }
371
+ }
372
+ }
373
+ /**
374
+ * One-time migration: move level_2..level_5 data to memory_nodes tree.
375
+ * Idempotent — tracked via schema_version table.
376
+ */
377
+ migrateToTree() {
378
+ const done = this.db.prepare("SELECT value FROM schema_version WHERE key = 'tree_v1'").get();
379
+ if (done)
380
+ return;
381
+ this.db.transaction(() => {
382
+ const insertNode = this.db.prepare(`
383
+ INSERT OR IGNORE INTO memory_nodes (id, parent_id, root_id, depth, seq, content, created_at)
384
+ VALUES (?, ?, ?, ?, ?, ?, ?)
385
+ `);
386
+ // Fetch all rows with at least level_2
387
+ const rows = this.db.prepare("SELECT id, created_at, level_2, level_3, level_4, level_5 FROM memories WHERE level_2 IS NOT NULL").all();
388
+ for (const row of rows) {
389
+ const rootId = row.id;
390
+ const ts = row.created_at;
391
+ if (row.level_2) {
392
+ insertNode.run(rootId + ".1", rootId, rootId, 2, 1, row.level_2, ts);
393
+ if (row.level_3) {
394
+ insertNode.run(rootId + ".1.1", rootId + ".1", rootId, 3, 1, row.level_3, ts);
395
+ if (row.level_4) {
396
+ insertNode.run(rootId + ".1.1.1", rootId + ".1.1", rootId, 4, 1, row.level_4, ts);
397
+ if (row.level_5) {
398
+ insertNode.run(rootId + ".1.1.1.1", rootId + ".1.1.1", rootId, 5, 1, row.level_5, ts);
399
+ }
400
+ }
401
+ }
402
+ }
403
+ }
404
+ // Null out legacy columns
405
+ this.db.prepare("UPDATE memories SET level_2=NULL, level_3=NULL, level_4=NULL, level_5=NULL").run();
406
+ // Mark done
407
+ this.db.prepare("INSERT INTO schema_version (key, value) VALUES ('tree_v1', 'done')").run();
408
+ })();
409
+ }
410
+ buildRoleFilter(agentRole) {
411
+ if (!agentRole)
412
+ return "";
413
+ const roles = allowedRoles(agentRole);
414
+ const placeholders = roles.map(r => `'${r}'`).join(", ");
415
+ return `min_role IN (${placeholders})`;
416
+ }
417
+ nextSeq(prefix) {
418
+ const row = this.db.prepare("SELECT MAX(seq) as maxSeq FROM memories WHERE prefix = ?").get(prefix);
419
+ return (row?.maxSeq || 0) + 1;
420
+ }
421
+ bumpAccess(id) {
422
+ this.db.prepare("UPDATE memories SET access_count = access_count + 1, last_accessed = ? WHERE id = ?").run(new Date().toISOString(), id);
423
+ }
424
+ bumpNodeAccess(id) {
425
+ this.db.prepare("UPDATE memory_nodes SET access_count = access_count + 1, last_accessed = ? WHERE id = ?").run(new Date().toISOString(), id);
426
+ }
427
+ /** Fetch direct children of a node (root or compound), including their grandchild counts. */
428
+ fetchChildren(parentId) {
429
+ return this.fetchChildrenDeep(parentId, 2, 2);
430
+ }
431
+ /**
432
+ * Fetch children recursively up to maxDepth.
433
+ * currentDepth: the depth level of the children being fetched (2 = L2, 3 = L3, …)
434
+ * maxDepth: stop recursing when currentDepth > maxDepth
435
+ */
436
+ fetchChildrenDeep(parentId, currentDepth, maxDepth) {
437
+ const rows = this.db.prepare("SELECT * FROM memory_nodes WHERE parent_id = ? ORDER BY seq").all(parentId);
438
+ return rows.map(r => {
439
+ const childCount = this.db.prepare("SELECT COUNT(*) as c FROM memory_nodes WHERE parent_id = ?").get(r.id).c;
440
+ const node = this.rowToNode(r, childCount);
441
+ if (currentDepth < maxDepth && childCount > 0) {
442
+ node.children = this.fetchChildrenDeep(r.id, currentDepth + 1, maxDepth);
443
+ }
444
+ return node;
445
+ });
446
+ }
447
+ rowToNode(row, childCount) {
448
+ return {
449
+ id: row.id,
450
+ parent_id: row.parent_id,
451
+ root_id: row.root_id,
452
+ depth: row.depth,
453
+ seq: row.seq,
454
+ content: row.content,
455
+ created_at: row.created_at,
456
+ access_count: row.access_count || 0,
457
+ last_accessed: row.last_accessed || null,
458
+ child_count: childCount,
459
+ };
460
+ }
461
+ rowToEntry(row, children) {
462
+ return {
463
+ id: row.id,
464
+ prefix: row.prefix,
465
+ seq: row.seq,
466
+ created_at: row.created_at,
467
+ level_1: row.level_1,
468
+ level_2: null, // always null post-migration
469
+ level_3: null,
470
+ level_4: null,
471
+ level_5: null,
472
+ access_count: row.access_count,
473
+ last_accessed: row.last_accessed,
474
+ links: row.links ? JSON.parse(row.links) : null,
475
+ min_role: row.min_role || "worker",
476
+ children,
477
+ };
478
+ }
479
+ /**
480
+ * Wrap a MemoryNode as a MemoryEntry for uniform API return.
481
+ * The formatter detects node entries by checking e.id.includes(".").
482
+ * level_1 is repurposed to carry the node content.
483
+ */
484
+ nodeToEntry(node, children) {
485
+ return {
486
+ id: node.id,
487
+ prefix: node.root_id.match(/^([A-Z]+)/)?.[1] ?? "?",
488
+ seq: node.seq,
489
+ created_at: node.created_at,
490
+ level_1: node.content,
491
+ level_2: null,
492
+ level_3: null,
493
+ level_4: null,
494
+ level_5: null,
495
+ access_count: node.access_count,
496
+ last_accessed: node.last_accessed,
497
+ links: null,
498
+ min_role: "worker",
499
+ children,
500
+ };
501
+ }
502
+ /**
503
+ * Parse tab-indented content into L1 text + a list of tree nodes.
504
+ *
505
+ * Algorithm:
506
+ * - seqAtParent: Map<parentId, number> — sibling counter per parent
507
+ * - lastIdAtDepth: Map<depth, nodeId> — last-written node id at each depth
508
+ *
509
+ * Each indented line at depth D:
510
+ * parent = (D == 2) ? rootId : lastIdAtDepth[D-1]
511
+ * seq = ++seqAtParent[parent]
512
+ * id = parent + "." + seq
513
+ *
514
+ * @param content Tab-indented content string
515
+ * @param rootId The root entry ID (e.g. "E0006") — used to build compound IDs
516
+ */
517
+ parseTree(content, rootId) {
518
+ const seqAtParent = new Map();
519
+ const lastIdAtDepth = new Map();
520
+ const nodes = [];
521
+ let level1 = "";
522
+ // Auto-detect space indentation unit: use first indented line (if no tabs present)
523
+ const rawLines = content.split("\n").map(l => l.trimEnd()).filter(Boolean);
524
+ let spaceUnit = 4;
525
+ if (!rawLines.some(l => l.startsWith("\t"))) {
526
+ for (const l of rawLines) {
527
+ const leading = l.length - l.trimStart().length;
528
+ if (leading > 0) {
529
+ spaceUnit = leading;
530
+ break;
531
+ }
532
+ }
533
+ }
534
+ for (const line of rawLines) {
535
+ const trimmedEnd = line;
536
+ if (!trimmedEnd)
537
+ continue;
538
+ // Count leading tabs; fall back to auto-detected space unit
539
+ const tabMatch = trimmedEnd.match(/^\t*/);
540
+ const leadingTabs = tabMatch ? tabMatch[0].length : 0;
541
+ let depth;
542
+ if (leadingTabs > 0) {
543
+ depth = Math.min(leadingTabs, 4) + 1; // 1 tab = L2, 2 tabs = L3, etc.
544
+ }
545
+ else {
546
+ const leadingSpaces = trimmedEnd.length - trimmedEnd.trimStart().length;
547
+ const spaceTabs = Math.floor(leadingSpaces / spaceUnit);
548
+ depth = spaceTabs > 0 ? Math.min(spaceTabs, 4) + 1 : 1;
549
+ }
550
+ const text = trimmedEnd.trim();
551
+ if (depth === 1) {
552
+ // L1 — multiple L1 lines joined (should be rare)
553
+ level1 = level1 ? level1 + " | " + text : text;
554
+ continue;
555
+ }
556
+ // L2+: determine parent and generate compound ID
557
+ const parentId = depth === 2 ? rootId : (lastIdAtDepth.get(depth - 1) ?? rootId);
558
+ const seq = (seqAtParent.get(parentId) ?? 0) + 1;
559
+ seqAtParent.set(parentId, seq);
560
+ const nodeId = `${parentId}.${seq}`;
561
+ lastIdAtDepth.set(depth, nodeId);
562
+ nodes.push({ id: nodeId, parent_id: parentId, depth, seq, content: text });
563
+ }
564
+ return { level1, nodes };
565
+ }
566
+ }
567
+ // ---- Convenience: resolve .hmem path for an agent ----
568
+ export function resolveHmemPath(projectDir, templateName) {
569
+ // No agent name configured → use memory.hmem directly in project root
570
+ if (!templateName || templateName === "UNKNOWN") {
571
+ return path.join(projectDir, "memory.hmem");
572
+ }
573
+ // Named agent → Agents/NAME/NAME.hmem (check Assistenten/ as fallback)
574
+ let agentDir = path.join(projectDir, "Agents", templateName);
575
+ if (!fs.existsSync(agentDir)) {
576
+ const alt = path.join(projectDir, "Assistenten", templateName);
577
+ if (fs.existsSync(alt))
578
+ agentDir = alt;
579
+ }
580
+ return path.join(agentDir, `${templateName}.hmem`);
581
+ }
582
+ /**
583
+ * Open (or create) an HmemStore for an agent's personal memory.
584
+ */
585
+ export function openAgentMemory(projectDir, templateName, config) {
586
+ const hmemPath = resolveHmemPath(projectDir, templateName);
587
+ return new HmemStore(hmemPath, config);
588
+ }
589
+ /**
590
+ * Open (or create) the shared company knowledge store (FIRMENWISSEN.hmem).
591
+ */
592
+ export function openCompanyMemory(projectDir, config) {
593
+ const hmemPath = path.join(projectDir, "FIRMENWISSEN.hmem");
594
+ return new HmemStore(hmemPath, config);
595
+ }
596
+ //# sourceMappingURL=hmem-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmem-store.js","sourceRoot":"","sources":["../src/hmem-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * hmem — Humanlike Memory for AI Agents
3
+ *
4
+ * Public API for using hmem as a library.
5
+ */
6
+ export { HmemStore, openAgentMemory, openCompanyMemory, resolveHmemPath } from "./hmem-store.js";
7
+ export type { AgentRole, MemoryEntry, MemoryNode } from "./hmem-store.js";
8
+ export { loadHmemConfig, DEFAULT_CONFIG, DEFAULT_PREFIXES, resolveDepthForPosition, formatPrefixList } from "./hmem-config.js";
9
+ export type { HmemConfig, DepthTier } from "./hmem-config.js";
10
+ export { searchMemory } from "./memory-search.js";
11
+ export type { SearchResult, SearchOptions, SearchScope } from "./memory-search.js";
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * hmem — Humanlike Memory for AI Agents
3
+ *
4
+ * Public API for using hmem as a library.
5
+ */
6
+ export { HmemStore, openAgentMemory, openCompanyMemory, resolveHmemPath } from "./hmem-store.js";
7
+ export { loadHmemConfig, DEFAULT_CONFIG, DEFAULT_PREFIXES, resolveDepthForPosition, formatPrefixList } from "./hmem-config.js";
8
+ export { searchMemory } from "./memory-search.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE/H,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}