@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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +439 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +559 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/db.d.ts +45 -0
  8. package/dist/db.d.ts.map +1 -0
  9. package/dist/db.js +80 -0
  10. package/dist/db.js.map +1 -0
  11. package/dist/extractor.d.ts +23 -0
  12. package/dist/extractor.d.ts.map +1 -0
  13. package/dist/extractor.js +121 -0
  14. package/dist/extractor.js.map +1 -0
  15. package/dist/hash.d.ts +11 -0
  16. package/dist/hash.d.ts.map +1 -0
  17. package/dist/hash.js +14 -0
  18. package/dist/hash.js.map +1 -0
  19. package/dist/index.d.ts +19 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +40 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/providers/embedding.d.ts +27 -0
  24. package/dist/providers/embedding.d.ts.map +1 -0
  25. package/dist/providers/embedding.js +41 -0
  26. package/dist/providers/embedding.js.map +1 -0
  27. package/dist/providers/llm.d.ts +29 -0
  28. package/dist/providers/llm.d.ts.map +1 -0
  29. package/dist/providers/llm.js +74 -0
  30. package/dist/providers/llm.js.map +1 -0
  31. package/dist/schema.d.ts +20 -0
  32. package/dist/schema.d.ts.map +1 -0
  33. package/dist/schema.js +78 -0
  34. package/dist/schema.js.map +1 -0
  35. package/dist/server/config.d.ts +38 -0
  36. package/dist/server/config.d.ts.map +1 -0
  37. package/dist/server/config.js +71 -0
  38. package/dist/server/config.js.map +1 -0
  39. package/dist/server/index.d.ts +13 -0
  40. package/dist/server/index.d.ts.map +1 -0
  41. package/dist/server/index.js +372 -0
  42. package/dist/server/index.js.map +1 -0
  43. package/dist/similarity.d.ts +41 -0
  44. package/dist/similarity.d.ts.map +1 -0
  45. package/dist/similarity.js +70 -0
  46. package/dist/similarity.js.map +1 -0
  47. package/dist/strength.d.ts +59 -0
  48. package/dist/strength.d.ts.map +1 -0
  49. package/dist/strength.js +76 -0
  50. package/dist/strength.js.map +1 -0
  51. package/dist/tools/append-memory-block.d.ts +22 -0
  52. package/dist/tools/append-memory-block.d.ts.map +1 -0
  53. package/dist/tools/append-memory-block.js +45 -0
  54. package/dist/tools/append-memory-block.js.map +1 -0
  55. package/dist/tools/forget-memory.d.ts +31 -0
  56. package/dist/tools/forget-memory.d.ts.map +1 -0
  57. package/dist/tools/forget-memory.js +77 -0
  58. package/dist/tools/forget-memory.js.map +1 -0
  59. package/dist/tools/index.d.ts +9 -0
  60. package/dist/tools/index.d.ts.map +1 -0
  61. package/dist/tools/index.js +9 -0
  62. package/dist/tools/index.js.map +1 -0
  63. package/dist/tools/recall-conversation.d.ts +21 -0
  64. package/dist/tools/recall-conversation.d.ts.map +1 -0
  65. package/dist/tools/recall-conversation.js +93 -0
  66. package/dist/tools/recall-conversation.js.map +1 -0
  67. package/dist/tools/recall-memories.d.ts +29 -0
  68. package/dist/tools/recall-memories.d.ts.map +1 -0
  69. package/dist/tools/recall-memories.js +106 -0
  70. package/dist/tools/recall-memories.js.map +1 -0
  71. package/dist/tools/recall-memory-block.d.ts +21 -0
  72. package/dist/tools/recall-memory-block.d.ts.map +1 -0
  73. package/dist/tools/recall-memory-block.js +36 -0
  74. package/dist/tools/recall-memory-block.js.map +1 -0
  75. package/dist/tools/remember-facts.d.ts +30 -0
  76. package/dist/tools/remember-facts.d.ts.map +1 -0
  77. package/dist/tools/remember-facts.js +235 -0
  78. package/dist/tools/remember-facts.js.map +1 -0
  79. package/dist/tools/replace-memory-block.d.ts +25 -0
  80. package/dist/tools/replace-memory-block.d.ts.map +1 -0
  81. package/dist/tools/replace-memory-block.js +69 -0
  82. package/dist/tools/replace-memory-block.js.map +1 -0
  83. package/dist/tools/store-memory.d.ts +27 -0
  84. package/dist/tools/store-memory.d.ts.map +1 -0
  85. package/dist/tools/store-memory.js +129 -0
  86. package/dist/tools/store-memory.js.map +1 -0
  87. package/dist/types.d.ts +86 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +2 -0
  90. package/dist/types.js.map +1 -0
  91. package/dist/ulid.d.ts +13 -0
  92. package/dist/ulid.d.ts.map +1 -0
  93. package/dist/ulid.js +39 -0
  94. package/dist/ulid.js.map +1 -0
  95. 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
@@ -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
@@ -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"}