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.
- package/LICENSE +21 -0
- package/README.md +384 -0
- package/dist/cli-init.d.ts +7 -0
- package/dist/cli-init.js +291 -0
- package/dist/cli-init.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +88 -0
- package/dist/hmem-config.d.ts +87 -0
- package/dist/hmem-config.js +120 -0
- package/dist/hmem-config.js.map +1 -0
- package/dist/hmem-store.d.ts +175 -0
- package/dist/hmem-store.js +596 -0
- package/dist/hmem-store.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/json-parser.js +63 -0
- package/dist/logger.d.ts +21 -0
- package/dist/logger.js +78 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp-server.d.ts +17 -0
- package/dist/mcp-server.js +546 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory-search.d.ts +18 -0
- package/dist/memory-search.js +294 -0
- package/dist/memory-search.js.map +1 -0
- package/dist/types.js +53 -0
- package/hmem.config.example.json +13 -0
- package/package.json +68 -0
- package/skills/hmem-read/SKILL.md +66 -0
- package/skills/hmem-setup/SKILL.md +200 -0
- package/skills/hmem-write/SKILL.md +94 -0
- package/skills/memory-curate/SKILL.md +76 -0
- package/skills/save/SKILL.md +65 -0
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|