@dungle-scrubs/hippo 0.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 +439 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +559 -0
- package/dist/cli.js.map +1 -0
- package/dist/db.d.ts +45 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +80 -0
- package/dist/db.js.map +1 -0
- package/dist/extractor.d.ts +23 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +121 -0
- package/dist/extractor.js.map +1 -0
- package/dist/hash.d.ts +11 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +14 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/embedding.d.ts +27 -0
- package/dist/providers/embedding.d.ts.map +1 -0
- package/dist/providers/embedding.js +41 -0
- package/dist/providers/embedding.js.map +1 -0
- package/dist/providers/llm.d.ts +29 -0
- package/dist/providers/llm.d.ts.map +1 -0
- package/dist/providers/llm.js +74 -0
- package/dist/providers/llm.js.map +1 -0
- package/dist/schema.d.ts +20 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +78 -0
- package/dist/schema.js.map +1 -0
- package/dist/server/config.d.ts +38 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +71 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/index.d.ts +13 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +372 -0
- package/dist/server/index.js.map +1 -0
- package/dist/similarity.d.ts +41 -0
- package/dist/similarity.d.ts.map +1 -0
- package/dist/similarity.js +70 -0
- package/dist/similarity.js.map +1 -0
- package/dist/strength.d.ts +59 -0
- package/dist/strength.d.ts.map +1 -0
- package/dist/strength.js +76 -0
- package/dist/strength.js.map +1 -0
- package/dist/tools/append-memory-block.d.ts +22 -0
- package/dist/tools/append-memory-block.d.ts.map +1 -0
- package/dist/tools/append-memory-block.js +45 -0
- package/dist/tools/append-memory-block.js.map +1 -0
- package/dist/tools/forget-memory.d.ts +31 -0
- package/dist/tools/forget-memory.d.ts.map +1 -0
- package/dist/tools/forget-memory.js +77 -0
- package/dist/tools/forget-memory.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/recall-conversation.d.ts +21 -0
- package/dist/tools/recall-conversation.d.ts.map +1 -0
- package/dist/tools/recall-conversation.js +93 -0
- package/dist/tools/recall-conversation.js.map +1 -0
- package/dist/tools/recall-memories.d.ts +29 -0
- package/dist/tools/recall-memories.d.ts.map +1 -0
- package/dist/tools/recall-memories.js +106 -0
- package/dist/tools/recall-memories.js.map +1 -0
- package/dist/tools/recall-memory-block.d.ts +21 -0
- package/dist/tools/recall-memory-block.d.ts.map +1 -0
- package/dist/tools/recall-memory-block.js +36 -0
- package/dist/tools/recall-memory-block.js.map +1 -0
- package/dist/tools/remember-facts.d.ts +30 -0
- package/dist/tools/remember-facts.d.ts.map +1 -0
- package/dist/tools/remember-facts.js +235 -0
- package/dist/tools/remember-facts.js.map +1 -0
- package/dist/tools/replace-memory-block.d.ts +25 -0
- package/dist/tools/replace-memory-block.d.ts.map +1 -0
- package/dist/tools/replace-memory-block.js +69 -0
- package/dist/tools/replace-memory-block.js.map +1 -0
- package/dist/tools/store-memory.d.ts +27 -0
- package/dist/tools/store-memory.d.ts.map +1 -0
- package/dist/tools/store-memory.js +129 -0
- package/dist/tools/store-memory.js.map +1 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ulid.d.ts +13 -0
- package/dist/ulid.d.ts.map +1 -0
- package/dist/ulid.js +39 -0
- package/dist/ulid.js.map +1 -0
- package/package.json +70 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import Database from "better-sqlite3";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { initSchema } from "./schema.js";
|
|
6
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the database path from --db flag or HIPPO_DB env var.
|
|
9
|
+
*
|
|
10
|
+
* @param prog - Commander program instance
|
|
11
|
+
* @returns Database file path
|
|
12
|
+
*/
|
|
13
|
+
function resolveDbPath(prog) {
|
|
14
|
+
const opts = prog.opts();
|
|
15
|
+
const dbPath = opts.db ?? process.env.HIPPO_DB;
|
|
16
|
+
if (!dbPath) {
|
|
17
|
+
console.error("Error: --db <path> is required (or set HIPPO_DB env var)");
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
return dbPath;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Open a database with WAL mode and busy timeout.
|
|
24
|
+
*
|
|
25
|
+
* @param dbPath - Path to SQLite file
|
|
26
|
+
* @returns Database handle
|
|
27
|
+
*/
|
|
28
|
+
function openDb(dbPath) {
|
|
29
|
+
const db = new Database(dbPath);
|
|
30
|
+
db.pragma("journal_mode=WAL");
|
|
31
|
+
db.pragma("busy_timeout=5000");
|
|
32
|
+
return db;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Output data as JSON or formatted text.
|
|
36
|
+
*
|
|
37
|
+
* @param data - Data to output
|
|
38
|
+
* @param json - Whether to use JSON format
|
|
39
|
+
* @param textFn - Function to produce human-readable output
|
|
40
|
+
*/
|
|
41
|
+
function output(data, json, textFn) {
|
|
42
|
+
if (json) {
|
|
43
|
+
console.log(JSON.stringify(data, null, 2));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(textFn(data));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Truncate a string with ellipsis if it exceeds maxLen.
|
|
51
|
+
*
|
|
52
|
+
* @param s - Input string
|
|
53
|
+
* @param maxLen - Maximum length before truncation
|
|
54
|
+
* @returns Truncated string
|
|
55
|
+
*/
|
|
56
|
+
function truncate(s, maxLen) {
|
|
57
|
+
if (s.length <= maxLen)
|
|
58
|
+
return s;
|
|
59
|
+
return `${s.slice(0, maxLen - 1)}…`;
|
|
60
|
+
}
|
|
61
|
+
// ── Program ──────────────────────────────────────────────────────────
|
|
62
|
+
const program = new Command()
|
|
63
|
+
.name("hippo")
|
|
64
|
+
.description([
|
|
65
|
+
"Inspect and manage hippo memory databases.",
|
|
66
|
+
"",
|
|
67
|
+
"Hippo stores facts, memories, and key-value blocks for AI agents",
|
|
68
|
+
"in SQLite. Each agent has its own namespace. Facts go through",
|
|
69
|
+
"conflict resolution (duplicates merge, superseding facts replace).",
|
|
70
|
+
"Memories are raw content with content-hash dedup. Blocks are named",
|
|
71
|
+
"text buffers (persona, objectives, etc.).",
|
|
72
|
+
"",
|
|
73
|
+
"This CLI inspects and manages the database without embedding or",
|
|
74
|
+
"LLM access. For semantic operations, use the hippo library API.",
|
|
75
|
+
"",
|
|
76
|
+
"Database path: pass --db <path> or set HIPPO_DB env var.",
|
|
77
|
+
].join("\n"))
|
|
78
|
+
.version("0.1.0") // x-release-please-version
|
|
79
|
+
.option("--db <path>", "SQLite database path (env: HIPPO_DB)");
|
|
80
|
+
// ── init ─────────────────────────────────────────────────────────────
|
|
81
|
+
program
|
|
82
|
+
.command("init")
|
|
83
|
+
.description([
|
|
84
|
+
"Initialize the hippo schema. Creates chunks and memory_blocks",
|
|
85
|
+
"tables with indexes. Safe to run multiple times (idempotent).",
|
|
86
|
+
"Creates the database file if it doesn't exist.",
|
|
87
|
+
].join(" "))
|
|
88
|
+
.action(() => {
|
|
89
|
+
const dbPath = resolveDbPath(program);
|
|
90
|
+
const db = new Database(dbPath);
|
|
91
|
+
initSchema(db);
|
|
92
|
+
db.close();
|
|
93
|
+
console.log(`Initialized: ${dbPath}`);
|
|
94
|
+
});
|
|
95
|
+
// ── stats ────────────────────────────────────────────────────────────
|
|
96
|
+
program
|
|
97
|
+
.command("stats")
|
|
98
|
+
.description([
|
|
99
|
+
"Database statistics: chunk counts by kind and status, block",
|
|
100
|
+
"count, number of agents, and file size on disk.",
|
|
101
|
+
].join(" "))
|
|
102
|
+
.option("--json", "Output as JSON")
|
|
103
|
+
.action((opts) => {
|
|
104
|
+
const dbPath = resolveDbPath(program);
|
|
105
|
+
if (!existsSync(dbPath)) {
|
|
106
|
+
console.error(`Error: database not found: ${dbPath}`);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const db = openDb(dbPath);
|
|
110
|
+
const agents = db
|
|
111
|
+
.prepare("SELECT DISTINCT agent_id FROM chunks UNION SELECT DISTINCT agent_id FROM memory_blocks")
|
|
112
|
+
.all();
|
|
113
|
+
const total = db.prepare("SELECT COUNT(*) as count FROM chunks").get().count;
|
|
114
|
+
const facts = db.prepare("SELECT COUNT(*) as count FROM chunks WHERE kind = 'fact'").get().count;
|
|
115
|
+
const memories = db.prepare("SELECT COUNT(*) as count FROM chunks WHERE kind = 'memory'").get().count;
|
|
116
|
+
const superseded = db
|
|
117
|
+
.prepare("SELECT COUNT(*) as count FROM chunks WHERE superseded_by IS NOT NULL")
|
|
118
|
+
.get().count;
|
|
119
|
+
const active = total - superseded;
|
|
120
|
+
const blocks = db.prepare("SELECT COUNT(*) as count FROM memory_blocks").get()
|
|
121
|
+
.count;
|
|
122
|
+
const fileSizeBytes = statSync(dbPath).size;
|
|
123
|
+
db.close();
|
|
124
|
+
const data = {
|
|
125
|
+
agents: agents.length,
|
|
126
|
+
blocks,
|
|
127
|
+
chunks: { active, facts, memories, superseded, total },
|
|
128
|
+
fileSizeBytes,
|
|
129
|
+
};
|
|
130
|
+
output(data, opts.json ?? false, (d) => [
|
|
131
|
+
`Database: ${dbPath}`,
|
|
132
|
+
`Agents: ${d.agents}`,
|
|
133
|
+
`Chunks: ${d.chunks.active} active (${d.chunks.facts} facts, ${d.chunks.memories} memories), ${d.chunks.superseded} superseded`,
|
|
134
|
+
`Blocks: ${d.blocks}`,
|
|
135
|
+
`Size: ${(d.fileSizeBytes / 1024).toFixed(1)} KB`,
|
|
136
|
+
].join("\n"));
|
|
137
|
+
});
|
|
138
|
+
// ── agents ───────────────────────────────────────────────────────────
|
|
139
|
+
program
|
|
140
|
+
.command("agents")
|
|
141
|
+
.description("List all agent IDs that have stored data in the database.")
|
|
142
|
+
.option("--json", "Output as JSON")
|
|
143
|
+
.action((opts) => {
|
|
144
|
+
const dbPath = resolveDbPath(program);
|
|
145
|
+
const db = openDb(dbPath);
|
|
146
|
+
const rows = db
|
|
147
|
+
.prepare(`SELECT agent_id, COUNT(*) as chunk_count FROM chunks
|
|
148
|
+
GROUP BY agent_id
|
|
149
|
+
UNION ALL
|
|
150
|
+
SELECT agent_id, 0 FROM memory_blocks
|
|
151
|
+
WHERE agent_id NOT IN (SELECT DISTINCT agent_id FROM chunks)
|
|
152
|
+
GROUP BY agent_id`)
|
|
153
|
+
.all();
|
|
154
|
+
// Aggregate: an agent may appear in both queries
|
|
155
|
+
const agents = new Map();
|
|
156
|
+
for (const row of rows) {
|
|
157
|
+
agents.set(row.agent_id, (agents.get(row.agent_id) ?? 0) + row.chunk_count);
|
|
158
|
+
}
|
|
159
|
+
db.close();
|
|
160
|
+
const list = [...agents.entries()]
|
|
161
|
+
.map(([id, chunks]) => ({ agentId: id, chunks }))
|
|
162
|
+
.sort((a, b) => a.agentId.localeCompare(b.agentId));
|
|
163
|
+
output(list, opts.json ?? false, (d) => {
|
|
164
|
+
if (d.length === 0)
|
|
165
|
+
return "No agents found.";
|
|
166
|
+
return d.map((a) => `${a.agentId} (${a.chunks} chunks)`).join("\n");
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
// ── chunks ───────────────────────────────────────────────────────────
|
|
170
|
+
program
|
|
171
|
+
.command("chunks")
|
|
172
|
+
.argument("<agent>", "Agent ID to list chunks for")
|
|
173
|
+
.description([
|
|
174
|
+
"List chunks (facts and memories) for an agent. Shows content,",
|
|
175
|
+
"kind, intensity, access count, and timestamps. Excludes superseded",
|
|
176
|
+
"chunks by default.",
|
|
177
|
+
].join(" "))
|
|
178
|
+
.option("--kind <type>", "Filter by kind: fact or memory")
|
|
179
|
+
.option("--superseded", "Include superseded chunks")
|
|
180
|
+
.option("--limit <n>", "Max results (default: 50)", "50")
|
|
181
|
+
.option("--json", "Output as JSON")
|
|
182
|
+
.action((agent, opts) => {
|
|
183
|
+
const dbPath = resolveDbPath(program);
|
|
184
|
+
const db = openDb(dbPath);
|
|
185
|
+
let sql = "SELECT * FROM chunks WHERE agent_id = ?";
|
|
186
|
+
const params = [agent];
|
|
187
|
+
if (!opts.superseded) {
|
|
188
|
+
sql += " AND superseded_by IS NULL";
|
|
189
|
+
}
|
|
190
|
+
if (opts.kind) {
|
|
191
|
+
sql += " AND kind = ?";
|
|
192
|
+
params.push(opts.kind);
|
|
193
|
+
}
|
|
194
|
+
sql += " ORDER BY last_accessed_at DESC LIMIT ?";
|
|
195
|
+
params.push(Number.parseInt(opts.limit, 10));
|
|
196
|
+
const rows = db.prepare(sql).all(...params);
|
|
197
|
+
db.close();
|
|
198
|
+
// Strip embedding BLOBs from JSON output — they're opaque binary
|
|
199
|
+
const clean = rows.map((r) => ({
|
|
200
|
+
access_count: r.access_count,
|
|
201
|
+
content: r.content,
|
|
202
|
+
content_hash: r.content_hash,
|
|
203
|
+
created_at: r.created_at,
|
|
204
|
+
encounter_count: r.encounter_count,
|
|
205
|
+
id: r.id,
|
|
206
|
+
kind: r.kind,
|
|
207
|
+
last_accessed_at: r.last_accessed_at,
|
|
208
|
+
metadata: r.metadata,
|
|
209
|
+
running_intensity: r.running_intensity,
|
|
210
|
+
superseded_by: r.superseded_by,
|
|
211
|
+
}));
|
|
212
|
+
output(clean, opts.json ?? false, (d) => {
|
|
213
|
+
if (d.length === 0)
|
|
214
|
+
return "No chunks found.";
|
|
215
|
+
return d
|
|
216
|
+
.map((c, i) => {
|
|
217
|
+
const sup = c.superseded_by ? ` [superseded by ${c.superseded_by}]` : "";
|
|
218
|
+
return [
|
|
219
|
+
`${i + 1}. [${c.kind}] ${truncate(c.content, 80)}${sup}`,
|
|
220
|
+
` id: ${c.id} intensity: ${c.running_intensity.toFixed(2)} encounters: ${c.encounter_count} accesses: ${c.access_count}`,
|
|
221
|
+
` created: ${c.created_at} last accessed: ${c.last_accessed_at}`,
|
|
222
|
+
].join("\n");
|
|
223
|
+
})
|
|
224
|
+
.join("\n\n");
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
// ── blocks ───────────────────────────────────────────────────────────
|
|
228
|
+
program
|
|
229
|
+
.command("blocks")
|
|
230
|
+
.argument("<agent>", "Agent ID to list blocks for")
|
|
231
|
+
.description("List all memory blocks (key-value text buffers) for an agent.")
|
|
232
|
+
.option("--json", "Output as JSON")
|
|
233
|
+
.action((agent, opts) => {
|
|
234
|
+
const dbPath = resolveDbPath(program);
|
|
235
|
+
const db = openDb(dbPath);
|
|
236
|
+
const rows = db
|
|
237
|
+
.prepare("SELECT * FROM memory_blocks WHERE agent_id = ? ORDER BY key")
|
|
238
|
+
.all(agent);
|
|
239
|
+
db.close();
|
|
240
|
+
const data = rows.map((r) => ({
|
|
241
|
+
key: r.key,
|
|
242
|
+
sizeBytes: new TextEncoder().encode(r.value).byteLength,
|
|
243
|
+
updatedAt: r.updated_at,
|
|
244
|
+
}));
|
|
245
|
+
output(data, opts.json ?? false, (d) => {
|
|
246
|
+
if (d.length === 0)
|
|
247
|
+
return "No blocks found.";
|
|
248
|
+
return d
|
|
249
|
+
.map((b) => `${b.key} (${(b.sizeBytes / 1024).toFixed(1)} KB, updated ${b.updatedAt})`)
|
|
250
|
+
.join("\n");
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
// ── block ────────────────────────────────────────────────────────────
|
|
254
|
+
program
|
|
255
|
+
.command("block")
|
|
256
|
+
.argument("<agent>", "Agent ID")
|
|
257
|
+
.argument("<key>", "Block key (e.g. persona, objectives)")
|
|
258
|
+
.description([
|
|
259
|
+
"Get the contents of a named memory block. Returns the full text",
|
|
260
|
+
"value, or an error if the block doesn't exist.",
|
|
261
|
+
].join(" "))
|
|
262
|
+
.option("--json", "Output as JSON")
|
|
263
|
+
.action((agent, key, opts) => {
|
|
264
|
+
const dbPath = resolveDbPath(program);
|
|
265
|
+
const db = openDb(dbPath);
|
|
266
|
+
const row = db
|
|
267
|
+
.prepare("SELECT * FROM memory_blocks WHERE agent_id = ? AND key = ?")
|
|
268
|
+
.get(agent, key);
|
|
269
|
+
db.close();
|
|
270
|
+
if (!row) {
|
|
271
|
+
if (opts.json) {
|
|
272
|
+
console.log(JSON.stringify({ error: "block_not_found", key }, null, 2));
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.error(`Block "${key}" not found for agent "${agent}".`);
|
|
276
|
+
}
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
output({ key: row.key, updatedAt: row.updated_at, value: row.value }, opts.json ?? false, (d) => d.value);
|
|
280
|
+
});
|
|
281
|
+
// ── search ───────────────────────────────────────────────────────────
|
|
282
|
+
program
|
|
283
|
+
.command("search")
|
|
284
|
+
.argument("<text>", "Text to search for (case-insensitive substring match)")
|
|
285
|
+
.description([
|
|
286
|
+
"Search chunk content by text (case-insensitive LIKE match).",
|
|
287
|
+
"Searches across all agents unless --agent is specified.",
|
|
288
|
+
"This is a simple text search, not semantic — use the library",
|
|
289
|
+
"API for embedding-based recall.",
|
|
290
|
+
].join(" "))
|
|
291
|
+
.option("--agent <id>", "Filter to a specific agent")
|
|
292
|
+
.option("--kind <type>", "Filter by kind: fact or memory")
|
|
293
|
+
.option("--limit <n>", "Max results (default: 20)", "20")
|
|
294
|
+
.option("--json", "Output as JSON")
|
|
295
|
+
.action((text, opts) => {
|
|
296
|
+
const dbPath = resolveDbPath(program);
|
|
297
|
+
const db = openDb(dbPath);
|
|
298
|
+
let sql = "SELECT * FROM chunks WHERE content LIKE ? AND superseded_by IS NULL";
|
|
299
|
+
const params = [`%${text}%`];
|
|
300
|
+
if (opts.agent) {
|
|
301
|
+
sql += " AND agent_id = ?";
|
|
302
|
+
params.push(opts.agent);
|
|
303
|
+
}
|
|
304
|
+
if (opts.kind) {
|
|
305
|
+
sql += " AND kind = ?";
|
|
306
|
+
params.push(opts.kind);
|
|
307
|
+
}
|
|
308
|
+
sql += " ORDER BY last_accessed_at DESC LIMIT ?";
|
|
309
|
+
params.push(Number.parseInt(opts.limit, 10));
|
|
310
|
+
const rows = db.prepare(sql).all(...params);
|
|
311
|
+
db.close();
|
|
312
|
+
const clean = rows.map((r) => ({
|
|
313
|
+
agent_id: r.agent_id,
|
|
314
|
+
content: r.content,
|
|
315
|
+
created_at: r.created_at,
|
|
316
|
+
id: r.id,
|
|
317
|
+
kind: r.kind,
|
|
318
|
+
running_intensity: r.running_intensity,
|
|
319
|
+
}));
|
|
320
|
+
output(clean, opts.json ?? false, (d) => {
|
|
321
|
+
if (d.length === 0)
|
|
322
|
+
return "No matches.";
|
|
323
|
+
return d
|
|
324
|
+
.map((c, i) => `${i + 1}. [${c.agent_id}/${c.kind}] ${truncate(c.content, 80)}\n id: ${c.id} intensity: ${c.running_intensity.toFixed(2)} created: ${c.created_at}`)
|
|
325
|
+
.join("\n\n");
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
// ── delete ───────────────────────────────────────────────────────────
|
|
329
|
+
program
|
|
330
|
+
.command("delete")
|
|
331
|
+
.argument("<ids...>", "One or more chunk IDs to delete")
|
|
332
|
+
.description([
|
|
333
|
+
"Delete specific chunks by ID. This is a hard delete with no",
|
|
334
|
+
"undo. Superseded-by references pointing to deleted chunks are",
|
|
335
|
+
"cleared (resurrecting the previously superseded chunk).",
|
|
336
|
+
].join(" "))
|
|
337
|
+
.option("--force", "Skip confirmation")
|
|
338
|
+
.option("--json", "Output as JSON")
|
|
339
|
+
.action((ids, opts) => {
|
|
340
|
+
const dbPath = resolveDbPath(program);
|
|
341
|
+
const db = openDb(dbPath);
|
|
342
|
+
// Verify all IDs exist
|
|
343
|
+
const existing = ids.filter((id) => {
|
|
344
|
+
const row = db.prepare("SELECT id FROM chunks WHERE id = ?").get(id);
|
|
345
|
+
return row !== undefined;
|
|
346
|
+
});
|
|
347
|
+
if (existing.length === 0) {
|
|
348
|
+
db.close();
|
|
349
|
+
if (opts.json) {
|
|
350
|
+
console.log(JSON.stringify({ deleted: 0, notFound: ids }));
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
console.log("No matching chunks found.");
|
|
354
|
+
}
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (!opts.force && !opts.json) {
|
|
358
|
+
// Show what will be deleted
|
|
359
|
+
for (const id of existing) {
|
|
360
|
+
const row = db.prepare("SELECT id, kind, content FROM chunks WHERE id = ?").get(id);
|
|
361
|
+
console.log(` [${row.kind}] ${truncate(row.content, 60)} (${row.id})`);
|
|
362
|
+
}
|
|
363
|
+
console.log(`\nWill delete ${existing.length} chunk(s). Use --force to confirm.`);
|
|
364
|
+
db.close();
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
// Delete in a transaction, resurrecting superseded chunks
|
|
368
|
+
const deleted = db.transaction(() => {
|
|
369
|
+
let count = 0;
|
|
370
|
+
for (const id of existing) {
|
|
371
|
+
const agentRow = db.prepare("SELECT agent_id FROM chunks WHERE id = ?").get(id);
|
|
372
|
+
if (agentRow) {
|
|
373
|
+
db.prepare("UPDATE chunks SET superseded_by = NULL WHERE superseded_by = ? AND agent_id = ?").run(id, agentRow.agent_id);
|
|
374
|
+
db.prepare("DELETE FROM chunks WHERE id = ?").run(id);
|
|
375
|
+
count++;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return count;
|
|
379
|
+
})();
|
|
380
|
+
db.close();
|
|
381
|
+
const notFound = ids.filter((id) => !existing.includes(id));
|
|
382
|
+
output({ deleted, notFound }, opts.json ?? false, (d) => {
|
|
383
|
+
let msg = `Deleted ${d.deleted} chunk(s).`;
|
|
384
|
+
if (d.notFound.length > 0) {
|
|
385
|
+
msg += ` Not found: ${d.notFound.join(", ")}`;
|
|
386
|
+
}
|
|
387
|
+
return msg;
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
// ── purge ────────────────────────────────────────────────────────────
|
|
391
|
+
program
|
|
392
|
+
.command("purge")
|
|
393
|
+
.description([
|
|
394
|
+
"Remove superseded chunks. These are facts that have been replaced",
|
|
395
|
+
"by newer versions and are no longer returned by searches. Safe to",
|
|
396
|
+
"run — only removes chunks marked as superseded.",
|
|
397
|
+
].join(" "))
|
|
398
|
+
.option("--agent <id>", "Only purge for a specific agent")
|
|
399
|
+
.option("--before <date>", "Only purge chunks created before this ISO date")
|
|
400
|
+
.option("--force", "Skip confirmation")
|
|
401
|
+
.option("--json", "Output as JSON")
|
|
402
|
+
.action((opts) => {
|
|
403
|
+
const dbPath = resolveDbPath(program);
|
|
404
|
+
const db = openDb(dbPath);
|
|
405
|
+
let countSql = "SELECT COUNT(*) as count FROM chunks WHERE superseded_by IS NOT NULL";
|
|
406
|
+
let deleteSql = "DELETE FROM chunks WHERE superseded_by IS NOT NULL";
|
|
407
|
+
const params = [];
|
|
408
|
+
if (opts.agent) {
|
|
409
|
+
countSql += " AND agent_id = ?";
|
|
410
|
+
deleteSql += " AND agent_id = ?";
|
|
411
|
+
params.push(opts.agent);
|
|
412
|
+
}
|
|
413
|
+
if (opts.before) {
|
|
414
|
+
countSql += " AND created_at < ?";
|
|
415
|
+
deleteSql += " AND created_at < ?";
|
|
416
|
+
params.push(opts.before);
|
|
417
|
+
}
|
|
418
|
+
const { count } = db.prepare(countSql).get(...params);
|
|
419
|
+
if (count === 0) {
|
|
420
|
+
db.close();
|
|
421
|
+
output({ purged: 0 }, opts.json ?? false, () => "Nothing to purge.");
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
if (!opts.force && !opts.json) {
|
|
425
|
+
console.log(`${count} superseded chunk(s) found. Use --force to purge.`);
|
|
426
|
+
db.close();
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
db.prepare(deleteSql).run(...params);
|
|
430
|
+
db.close();
|
|
431
|
+
output({ purged: count }, opts.json ?? false, (d) => `Purged ${d.purged} superseded chunk(s).`);
|
|
432
|
+
});
|
|
433
|
+
// ── export ───────────────────────────────────────────────────────────
|
|
434
|
+
program
|
|
435
|
+
.command("export")
|
|
436
|
+
.argument("<agent>", "Agent ID to export")
|
|
437
|
+
.description([
|
|
438
|
+
"Export all data for an agent as JSON to stdout. Includes all",
|
|
439
|
+
"chunks (active and superseded) and memory blocks. Embeddings",
|
|
440
|
+
"are exported as base64-encoded blobs. Pipe to a file to save:",
|
|
441
|
+
" hippo --db agent.db export my-agent > backup.json",
|
|
442
|
+
].join(" "))
|
|
443
|
+
.action((agent) => {
|
|
444
|
+
const dbPath = resolveDbPath(program);
|
|
445
|
+
const db = openDb(dbPath);
|
|
446
|
+
const chunks = db.prepare("SELECT * FROM chunks WHERE agent_id = ?").all(agent);
|
|
447
|
+
const blocks = db
|
|
448
|
+
.prepare("SELECT * FROM memory_blocks WHERE agent_id = ?")
|
|
449
|
+
.all(agent);
|
|
450
|
+
db.close();
|
|
451
|
+
const data = {
|
|
452
|
+
agentId: agent,
|
|
453
|
+
blocks: blocks.map((b) => ({
|
|
454
|
+
key: b.key,
|
|
455
|
+
updatedAt: b.updated_at,
|
|
456
|
+
value: b.value,
|
|
457
|
+
})),
|
|
458
|
+
chunks: chunks.map((c) => ({
|
|
459
|
+
access_count: c.access_count,
|
|
460
|
+
content: c.content,
|
|
461
|
+
content_hash: c.content_hash,
|
|
462
|
+
created_at: c.created_at,
|
|
463
|
+
embedding_base64: c.embedding.toString("base64"),
|
|
464
|
+
encounter_count: c.encounter_count,
|
|
465
|
+
id: c.id,
|
|
466
|
+
kind: c.kind,
|
|
467
|
+
last_accessed_at: c.last_accessed_at,
|
|
468
|
+
metadata: c.metadata,
|
|
469
|
+
running_intensity: c.running_intensity,
|
|
470
|
+
superseded_by: c.superseded_by,
|
|
471
|
+
})),
|
|
472
|
+
exportedAt: new Date().toISOString(),
|
|
473
|
+
version: 1,
|
|
474
|
+
};
|
|
475
|
+
console.log(JSON.stringify(data, null, 2));
|
|
476
|
+
});
|
|
477
|
+
program
|
|
478
|
+
.command("import")
|
|
479
|
+
.argument("<file>", "JSON file to import (from hippo export)")
|
|
480
|
+
.description([
|
|
481
|
+
"Import agent data from a JSON file (produced by hippo export).",
|
|
482
|
+
"Initializes the schema if needed. Inserts chunks and blocks,",
|
|
483
|
+
"skipping any with duplicate IDs. Does not overwrite existing data.",
|
|
484
|
+
].join(" "))
|
|
485
|
+
.option("--json", "Output as JSON")
|
|
486
|
+
.action((file, opts) => {
|
|
487
|
+
const dbPath = resolveDbPath(program);
|
|
488
|
+
if (!existsSync(file)) {
|
|
489
|
+
console.error(`Error: file not found: ${file}`);
|
|
490
|
+
process.exit(1);
|
|
491
|
+
}
|
|
492
|
+
const raw = JSON.parse(readFileSync(file, "utf-8"));
|
|
493
|
+
const data = raw;
|
|
494
|
+
if (!data.agentId || !Array.isArray(data.chunks) || !Array.isArray(data.blocks)) {
|
|
495
|
+
console.error("Error: invalid export format (expected agentId, chunks, blocks)");
|
|
496
|
+
process.exit(1);
|
|
497
|
+
}
|
|
498
|
+
const db = new Database(dbPath);
|
|
499
|
+
initSchema(db);
|
|
500
|
+
const insertChunk = db.prepare(`
|
|
501
|
+
INSERT OR IGNORE INTO chunks (id, agent_id, content, content_hash, embedding, metadata,
|
|
502
|
+
kind, running_intensity, encounter_count, access_count, last_accessed_at, superseded_by, created_at)
|
|
503
|
+
VALUES (@id, @agent_id, @content, @content_hash, @embedding, @metadata,
|
|
504
|
+
@kind, @running_intensity, @encounter_count, @access_count, @last_accessed_at, @superseded_by, @created_at)
|
|
505
|
+
`);
|
|
506
|
+
const upsertBlock = db.prepare(`
|
|
507
|
+
INSERT OR IGNORE INTO memory_blocks (agent_id, key, value, updated_at)
|
|
508
|
+
VALUES (@agent_id, @key, @value, @updated_at)
|
|
509
|
+
`);
|
|
510
|
+
let chunksInserted = 0;
|
|
511
|
+
let blocksInserted = 0;
|
|
512
|
+
db.transaction(() => {
|
|
513
|
+
for (const c of data.chunks) {
|
|
514
|
+
const result = insertChunk.run({
|
|
515
|
+
access_count: c.access_count,
|
|
516
|
+
agent_id: data.agentId,
|
|
517
|
+
content: c.content,
|
|
518
|
+
content_hash: c.content_hash,
|
|
519
|
+
created_at: c.created_at,
|
|
520
|
+
embedding: Buffer.from(c.embedding_base64, "base64"),
|
|
521
|
+
encounter_count: c.encounter_count,
|
|
522
|
+
id: c.id,
|
|
523
|
+
kind: c.kind,
|
|
524
|
+
last_accessed_at: c.last_accessed_at,
|
|
525
|
+
metadata: c.metadata,
|
|
526
|
+
running_intensity: c.running_intensity,
|
|
527
|
+
superseded_by: c.superseded_by,
|
|
528
|
+
});
|
|
529
|
+
if (result.changes > 0)
|
|
530
|
+
chunksInserted++;
|
|
531
|
+
}
|
|
532
|
+
for (const b of data.blocks) {
|
|
533
|
+
const result = upsertBlock.run({
|
|
534
|
+
agent_id: data.agentId,
|
|
535
|
+
key: b.key,
|
|
536
|
+
updated_at: b.updatedAt,
|
|
537
|
+
value: b.value,
|
|
538
|
+
});
|
|
539
|
+
if (result.changes > 0)
|
|
540
|
+
blocksInserted++;
|
|
541
|
+
}
|
|
542
|
+
})();
|
|
543
|
+
db.close();
|
|
544
|
+
const summary = {
|
|
545
|
+
agentId: data.agentId,
|
|
546
|
+
blocksImported: blocksInserted,
|
|
547
|
+
blocksSkipped: data.blocks.length - blocksInserted,
|
|
548
|
+
chunksImported: chunksInserted,
|
|
549
|
+
chunksSkipped: data.chunks.length - chunksInserted,
|
|
550
|
+
};
|
|
551
|
+
output(summary, opts.json ?? false, (d) => [
|
|
552
|
+
`Imported for agent "${d.agentId}":`,
|
|
553
|
+
` Chunks: ${d.chunksImported} imported, ${d.chunksSkipped} skipped (duplicate)`,
|
|
554
|
+
` Blocks: ${d.blocksImported} imported, ${d.blocksSkipped} skipped (duplicate)`,
|
|
555
|
+
].join("\n"));
|
|
556
|
+
});
|
|
557
|
+
// ── Parse ────────────────────────────────────────────────────────────
|
|
558
|
+
program.parse();
|
|
559
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Database, Statement } from "better-sqlite3";
|
|
2
|
+
import type { Chunk } from "./types.js";
|
|
3
|
+
/** Prepared statement cache, lazily built per database handle. */
|
|
4
|
+
export interface DbStatements {
|
|
5
|
+
readonly clearSupersededBy: Statement;
|
|
6
|
+
readonly deleteChunk: Statement;
|
|
7
|
+
readonly getAllActiveChunksByAgent: Statement;
|
|
8
|
+
readonly getActiveChunksByAgent: Statement;
|
|
9
|
+
readonly getBlockByKey: Statement;
|
|
10
|
+
readonly getMemoryByHash: Statement;
|
|
11
|
+
readonly insertChunk: Statement;
|
|
12
|
+
readonly reinforceChunk: Statement;
|
|
13
|
+
readonly supersedeChunk: Statement;
|
|
14
|
+
readonly touchChunk: Statement;
|
|
15
|
+
readonly upsertBlock: Statement;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Build all prepared statements for hippo operations.
|
|
19
|
+
*
|
|
20
|
+
* @param db - better-sqlite3 Database handle
|
|
21
|
+
* @returns Prepared statement cache
|
|
22
|
+
*/
|
|
23
|
+
export declare function prepareStatements(db: Database): DbStatements;
|
|
24
|
+
/**
|
|
25
|
+
* Get all active (non-superseded) chunks for an agent by kind.
|
|
26
|
+
*
|
|
27
|
+
* @param stmts - Prepared statements
|
|
28
|
+
* @param agentId - Agent namespace
|
|
29
|
+
* @param kind - Chunk kind ('fact' or 'memory')
|
|
30
|
+
* @param limit - Max rows to return (-1 for unlimited, default -1)
|
|
31
|
+
* @returns Array of chunks
|
|
32
|
+
*/
|
|
33
|
+
export declare function getActiveChunks(stmts: DbStatements, agentId: string, kind: "fact" | "memory", limit?: number): Chunk[];
|
|
34
|
+
/**
|
|
35
|
+
* Get all active (non-superseded) chunks for an agent regardless of kind.
|
|
36
|
+
*
|
|
37
|
+
* Single query instead of two separate kind-filtered queries.
|
|
38
|
+
*
|
|
39
|
+
* @param stmts - Prepared statements
|
|
40
|
+
* @param agentId - Agent namespace
|
|
41
|
+
* @param limit - Max rows to return (-1 for unlimited, default -1)
|
|
42
|
+
* @returns Array of chunks (facts and memories combined)
|
|
43
|
+
*/
|
|
44
|
+
export declare function getAllActiveChunks(stmts: DbStatements, agentId: string, limit?: number): Chunk[];
|
|
45
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,yBAAyB,EAAE,SAAS,CAAC;IAC9C,QAAQ,CAAC,sBAAsB,EAAE,SAAS,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,YAAY,CA6D5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GAAG,QAAQ,EACvB,KAAK,SAAK,GACR,KAAK,EAAE,CAET;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,KAAK,EAAE,CAE5F"}
|