hippo-memory 0.2.0 → 0.3.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/dist/autolearn.d.ts.map +1 -1
- package/dist/autolearn.js +1 -0
- package/dist/autolearn.js.map +1 -1
- package/dist/capture.d.ts +28 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +266 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.js +202 -6
- package/dist/cli.js.map +1 -1
- package/dist/consolidate.d.ts.map +1 -1
- package/dist/consolidate.js +1 -0
- package/dist/consolidate.js.map +1 -1
- package/dist/import.d.ts +31 -0
- package/dist/import.d.ts.map +1 -0
- package/dist/import.js +307 -0
- package/dist/import.js.map +1 -0
- package/dist/importers.d.ts +28 -0
- package/dist/importers.d.ts.map +1 -0
- package/dist/importers.js +390 -0
- package/dist/importers.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +12 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +18 -0
- package/dist/memory.js.map +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +2 -0
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/import.js
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import memories from external sources.
|
|
3
|
+
*
|
|
4
|
+
* Supported formats:
|
|
5
|
+
* --chatgpt <file> ChatGPT memories.json or plain text
|
|
6
|
+
* --claude <file> CLAUDE.md (skips hippo:start/end blocks)
|
|
7
|
+
* --cursor <file> .cursorrules
|
|
8
|
+
* --file <file> Generic one-memory-per-line
|
|
9
|
+
* --markdown <file> Structured markdown with heading hierarchy as tags
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import { createMemory, Layer } from './memory.js';
|
|
13
|
+
import { isInitialized, writeEntry, loadAllEntries, updateStats, } from './store.js';
|
|
14
|
+
import { getGlobalRoot, initGlobal } from './shared.js';
|
|
15
|
+
import { isEmbeddingAvailable, embedMemory } from './embeddings.js';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Normalisation for deduplication
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
function normalise(text) {
|
|
20
|
+
return text
|
|
21
|
+
.toLowerCase()
|
|
22
|
+
.replace(/[^\w\s]/g, '')
|
|
23
|
+
.replace(/\s+/g, ' ')
|
|
24
|
+
.trim();
|
|
25
|
+
}
|
|
26
|
+
function isDuplicate(content, existing) {
|
|
27
|
+
const norm = normalise(content);
|
|
28
|
+
if (!norm)
|
|
29
|
+
return true; // empty content counts as duplicate
|
|
30
|
+
for (const e of existing) {
|
|
31
|
+
if (normalise(e.content) === norm)
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Parsers
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
/** Parse ChatGPT memories.json or plain text file. */
|
|
40
|
+
export function parseChatGPT(raw) {
|
|
41
|
+
const trimmed = raw.trim();
|
|
42
|
+
// Try JSON first
|
|
43
|
+
if (trimmed.startsWith('[') || trimmed.startsWith('{')) {
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(trimmed);
|
|
46
|
+
const arr = Array.isArray(parsed) ? parsed : [parsed];
|
|
47
|
+
return arr
|
|
48
|
+
.map((item) => {
|
|
49
|
+
if (typeof item === 'string')
|
|
50
|
+
return item.trim();
|
|
51
|
+
if (item && typeof item === 'object' && 'content' in item) {
|
|
52
|
+
return String(item.content).trim();
|
|
53
|
+
}
|
|
54
|
+
return '';
|
|
55
|
+
})
|
|
56
|
+
.filter((s) => s.length > 0);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Fall through to line-based parsing
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Plain text: one memory per line
|
|
63
|
+
return trimmed
|
|
64
|
+
.split('\n')
|
|
65
|
+
.map((l) => l.trim())
|
|
66
|
+
.filter((l) => l.length > 0);
|
|
67
|
+
}
|
|
68
|
+
/** Parse CLAUDE.md, extracting bullet points and sections. Skips hippo blocks. */
|
|
69
|
+
export function parseClaude(raw) {
|
|
70
|
+
// Remove <!-- hippo:start -->...<!-- hippo:end --> blocks
|
|
71
|
+
const cleaned = raw.replace(/<!--\s*hippo:start\s*-->[\s\S]*?<!--\s*hippo:end\s*-->/g, '');
|
|
72
|
+
const memories = [];
|
|
73
|
+
const lines = cleaned.split('\n');
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
const trimmed = line.trim();
|
|
76
|
+
// Skip headings, empty lines, code fences, HTML comments
|
|
77
|
+
if (!trimmed)
|
|
78
|
+
continue;
|
|
79
|
+
if (trimmed.startsWith('#'))
|
|
80
|
+
continue;
|
|
81
|
+
if (trimmed.startsWith('```'))
|
|
82
|
+
continue;
|
|
83
|
+
if (trimmed.startsWith('<!--'))
|
|
84
|
+
continue;
|
|
85
|
+
if (trimmed.startsWith('---'))
|
|
86
|
+
continue;
|
|
87
|
+
// Extract bullet point content (-, *, numbered)
|
|
88
|
+
const bulletMatch = trimmed.match(/^[-*]\s+(.+)/) || trimmed.match(/^\d+\.\s+(.+)/);
|
|
89
|
+
if (bulletMatch) {
|
|
90
|
+
const content = bulletMatch[1].trim();
|
|
91
|
+
if (content.length > 3) {
|
|
92
|
+
memories.push(content);
|
|
93
|
+
}
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
// Plain text paragraphs (non-bullet, non-heading lines that have substance)
|
|
97
|
+
if (trimmed.length > 10 && !trimmed.startsWith('|')) {
|
|
98
|
+
memories.push(trimmed);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return memories;
|
|
102
|
+
}
|
|
103
|
+
/** Parse .cursorrules, splitting rules into individual memories. */
|
|
104
|
+
export function parseCursor(raw) {
|
|
105
|
+
const memories = [];
|
|
106
|
+
const lines = raw.split('\n');
|
|
107
|
+
// Collect multi-line rules separated by blank lines or comment headers
|
|
108
|
+
let currentRule = [];
|
|
109
|
+
const flushRule = () => {
|
|
110
|
+
const text = currentRule
|
|
111
|
+
.map((l) => l.replace(/^#\s*/, '').trim())
|
|
112
|
+
.filter((l) => l.length > 0)
|
|
113
|
+
.join(' ')
|
|
114
|
+
.trim();
|
|
115
|
+
if (text.length > 5) {
|
|
116
|
+
memories.push(text);
|
|
117
|
+
}
|
|
118
|
+
currentRule = [];
|
|
119
|
+
};
|
|
120
|
+
for (const line of lines) {
|
|
121
|
+
const trimmed = line.trim();
|
|
122
|
+
if (!trimmed) {
|
|
123
|
+
// Blank line: flush the current rule
|
|
124
|
+
if (currentRule.length > 0)
|
|
125
|
+
flushRule();
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// Bullet points are individual rules
|
|
129
|
+
const bulletMatch = trimmed.match(/^[-*]\s+(.+)/);
|
|
130
|
+
if (bulletMatch) {
|
|
131
|
+
if (currentRule.length > 0)
|
|
132
|
+
flushRule();
|
|
133
|
+
const content = bulletMatch[1].trim();
|
|
134
|
+
if (content.length > 3) {
|
|
135
|
+
memories.push(content);
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
// Numbered rules
|
|
140
|
+
const numMatch = trimmed.match(/^\d+\.\s+(.+)/);
|
|
141
|
+
if (numMatch) {
|
|
142
|
+
if (currentRule.length > 0)
|
|
143
|
+
flushRule();
|
|
144
|
+
const content = numMatch[1].trim();
|
|
145
|
+
if (content.length > 3) {
|
|
146
|
+
memories.push(content);
|
|
147
|
+
}
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
currentRule.push(trimmed);
|
|
151
|
+
}
|
|
152
|
+
if (currentRule.length > 0)
|
|
153
|
+
flushRule();
|
|
154
|
+
return memories;
|
|
155
|
+
}
|
|
156
|
+
/** Parse generic file: one memory per non-empty line. */
|
|
157
|
+
export function parseFile(raw) {
|
|
158
|
+
return raw
|
|
159
|
+
.split('\n')
|
|
160
|
+
.map((l) => l.trim())
|
|
161
|
+
.filter((l) => l.length > 0);
|
|
162
|
+
}
|
|
163
|
+
/** Slugify a heading for use as a tag. */
|
|
164
|
+
function slugify(heading) {
|
|
165
|
+
return heading
|
|
166
|
+
.toLowerCase()
|
|
167
|
+
.replace(/[^\w\s-]/g, '')
|
|
168
|
+
.replace(/\s+/g, '-')
|
|
169
|
+
.replace(/-+/g, '-')
|
|
170
|
+
.replace(/^-|-$/g, '')
|
|
171
|
+
.slice(0, 40);
|
|
172
|
+
}
|
|
173
|
+
/** Parse structured markdown preserving heading hierarchy as tags. */
|
|
174
|
+
export function parseMarkdown(raw) {
|
|
175
|
+
const results = [];
|
|
176
|
+
const lines = raw.split('\n');
|
|
177
|
+
// Track current heading hierarchy
|
|
178
|
+
const headingStack = [];
|
|
179
|
+
const getCurrentTags = () => headingStack.map((h) => h.tag);
|
|
180
|
+
for (const line of lines) {
|
|
181
|
+
const trimmed = line.trim();
|
|
182
|
+
if (!trimmed)
|
|
183
|
+
continue;
|
|
184
|
+
// Check for heading
|
|
185
|
+
const headingMatch = trimmed.match(/^(#{1,6})\s+(.+)/);
|
|
186
|
+
if (headingMatch) {
|
|
187
|
+
const level = headingMatch[1].length;
|
|
188
|
+
const tag = slugify(headingMatch[2]);
|
|
189
|
+
// Pop headings at same or deeper level
|
|
190
|
+
while (headingStack.length > 0 && headingStack[headingStack.length - 1].level >= level) {
|
|
191
|
+
headingStack.pop();
|
|
192
|
+
}
|
|
193
|
+
if (tag) {
|
|
194
|
+
headingStack.push({ level, tag });
|
|
195
|
+
}
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Skip code fences, HTML comments, horizontal rules
|
|
199
|
+
if (trimmed.startsWith('```'))
|
|
200
|
+
continue;
|
|
201
|
+
if (trimmed.startsWith('<!--'))
|
|
202
|
+
continue;
|
|
203
|
+
if (trimmed.startsWith('---'))
|
|
204
|
+
continue;
|
|
205
|
+
// Bullet points
|
|
206
|
+
const bulletMatch = trimmed.match(/^[-*]\s+(.+)/) || trimmed.match(/^\d+\.\s+(.+)/);
|
|
207
|
+
if (bulletMatch) {
|
|
208
|
+
const content = bulletMatch[1].trim();
|
|
209
|
+
if (content.length > 3) {
|
|
210
|
+
results.push({ content, tags: getCurrentTags() });
|
|
211
|
+
}
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// Plain text with substance
|
|
215
|
+
if (trimmed.length > 10 && !trimmed.startsWith('|')) {
|
|
216
|
+
results.push({ content: trimmed, tags: getCurrentTags() });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return results;
|
|
220
|
+
}
|
|
221
|
+
export function cmdImport(hippoRoot, options) {
|
|
222
|
+
const useGlobal = options.global;
|
|
223
|
+
const targetRoot = useGlobal ? getGlobalRoot() : hippoRoot;
|
|
224
|
+
if (useGlobal) {
|
|
225
|
+
initGlobal();
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
if (!isInitialized(hippoRoot)) {
|
|
229
|
+
console.error('No .hippo directory found. Run `hippo init` first.');
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Read source file
|
|
234
|
+
if (!fs.existsSync(options.filePath)) {
|
|
235
|
+
console.error(`File not found: ${options.filePath}`);
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
const raw = fs.readFileSync(options.filePath, 'utf8');
|
|
239
|
+
// Parse based on format
|
|
240
|
+
let items;
|
|
241
|
+
switch (options.format) {
|
|
242
|
+
case 'chatgpt': {
|
|
243
|
+
const memories = parseChatGPT(raw);
|
|
244
|
+
items = memories.map((m) => ({ content: m, tags: ['chatgpt-import'] }));
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
case 'claude': {
|
|
248
|
+
const memories = parseClaude(raw);
|
|
249
|
+
items = memories.map((m) => ({ content: m, tags: ['claude-import'] }));
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case 'cursor': {
|
|
253
|
+
const memories = parseCursor(raw);
|
|
254
|
+
items = memories.map((m) => ({ content: m, tags: ['cursor-import'] }));
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
case 'file': {
|
|
258
|
+
const memories = parseFile(raw);
|
|
259
|
+
items = memories.map((m) => ({ content: m, tags: ['file-import'] }));
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
case 'markdown': {
|
|
263
|
+
items = parseMarkdown(raw).map((m) => ({
|
|
264
|
+
content: m.content,
|
|
265
|
+
tags: [...m.tags, 'markdown-import'],
|
|
266
|
+
}));
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Load existing memories for deduplication
|
|
271
|
+
const existing = loadAllEntries(targetRoot);
|
|
272
|
+
let imported = 0;
|
|
273
|
+
let skipped = 0;
|
|
274
|
+
for (const item of items) {
|
|
275
|
+
if (isDuplicate(item.content, existing)) {
|
|
276
|
+
skipped++;
|
|
277
|
+
if (options.dryRun) {
|
|
278
|
+
console.log(` [skip] ${item.content.slice(0, 80)}...`);
|
|
279
|
+
}
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (options.dryRun) {
|
|
283
|
+
const tagStr = item.tags.length > 0 ? ` [${item.tags.join(', ')}]` : '';
|
|
284
|
+
console.log(` [import] ${item.content.slice(0, 100)}${tagStr}`);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
const entry = createMemory(item.content, {
|
|
288
|
+
layer: Layer.Episodic,
|
|
289
|
+
tags: item.tags,
|
|
290
|
+
source: `import-${options.format}`,
|
|
291
|
+
confidence: 'inferred',
|
|
292
|
+
});
|
|
293
|
+
writeEntry(targetRoot, entry);
|
|
294
|
+
updateStats(targetRoot, { remembered: 1 });
|
|
295
|
+
// Also add to existing list for within-batch dedup
|
|
296
|
+
existing.push(entry);
|
|
297
|
+
if (isEmbeddingAvailable()) {
|
|
298
|
+
embedMemory(targetRoot, entry).catch(() => { });
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
imported++;
|
|
302
|
+
}
|
|
303
|
+
const prefix = options.dryRun ? '[dry-run] ' : '';
|
|
304
|
+
const globalPrefix = useGlobal ? '[global] ' : '';
|
|
305
|
+
console.log(`\n${prefix}${globalPrefix}Imported ${imported} memories (${skipped} skipped as duplicates)`);
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../src/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory importers for Hippo.
|
|
3
|
+
* Imports memories from ChatGPT, Claude, Cursor, generic files, and structured markdown.
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryEntry } from './memory.js';
|
|
6
|
+
export interface ImportResult {
|
|
7
|
+
total: number;
|
|
8
|
+
imported: number;
|
|
9
|
+
skipped: number;
|
|
10
|
+
entries: MemoryEntry[];
|
|
11
|
+
}
|
|
12
|
+
export interface ImportOptions {
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
global?: boolean;
|
|
15
|
+
extraTags?: string[];
|
|
16
|
+
hippoRoot: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Given an array of raw text chunks, deduplicate against existing memories,
|
|
20
|
+
* create MemoryEntry objects, write them (unless dry-run), and return a result.
|
|
21
|
+
*/
|
|
22
|
+
export declare function importEntries(chunks: string[], source: string, tags: string[], options: ImportOptions): ImportResult;
|
|
23
|
+
export declare function importChatGPT(filePath: string, options: ImportOptions): ImportResult;
|
|
24
|
+
export declare function importClaude(filePath: string, options: ImportOptions): ImportResult;
|
|
25
|
+
export declare function importCursor(filePath: string, options: ImportOptions): ImportResult;
|
|
26
|
+
export declare function importGenericFile(filePath: string, options: ImportOptions): ImportResult;
|
|
27
|
+
export declare function importMarkdown(filePath: string, options: ImportOptions): ImportResult;
|
|
28
|
+
//# sourceMappingURL=importers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importers.d.ts","sourceRoot":"","sources":["../src/importers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAuB,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,aAAa,GACrB,YAAY,CA4Dd;AA0DD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAGpF;AA8GD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAGnF;AA4DD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAInF;AA2BD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CAGxF;AAyED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CA2BrF"}
|